Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 14 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 641
Témy: 144
Bydlisko: Žilina
Príspevok NapísalOffline : 16.02.2010 8:22

Caute,
vytvoril som si jednoduchu funkciu proti MySQL Injection a XSS. Rad by som vedel, ci je moje Query "nepriestrelne", pripadne ako to vylepsit...

Funkcia:
Kód:
function protect($input, $cislo = false, $is_sql = false)
{
   $input = htmlentities($input, ENT_QUOTES);   
   if(get_magic_quotes_gpc ())
   {
      $input = stripslashes ($input);
   }   
   else
   {
      $input=addslashes($input);
   }
   if ($is_sql)
   {
      $input = mysql_real_escape_string ($input);
   }
   if ($cislo==true)
   {
      if (is_numeric($input))
      {
         return $input;
      }
      else
      {
         $zero=0;
         return $zero;
      }
   }
   else
   {
      $input = strip_tags($input);
      $input = str_replace("
      ", "\n", $input);   
      $input=str_ireplace(";","",$input);
      $input=str_ireplace("=","",$input);
      $input=str_ireplace("-","",$input);
      $input=str_ireplace(".","",$input);
      $input=str_ireplace("*","",$input);
      $input=str_ireplace("&","",$input);
      $input=str_ireplace("?","",$input);
      $input=str_ireplace("$","",$input);
      $input=str_ireplace("!","",$input);
      $input=str_ireplace(":","",$input);
      $input=str_ireplace("#","",$input);
      return $input;
   }
}


Pouzitie:
Kód:
$t1=protect($t1); // ak je ocakavany string
$t2=protect($t2,true); // ak je ocakavane cislo

$query=sprintf("SELECT * FROM tabulka WHERE id='%s' AND ico='%d'",$t1,$t2);


DIK







_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34
Bydlisko: Brno
Príspevok NapísalOffline : 16.02.2010 9:27

Ta podmienka s get_magic_quotes_gpc() je chybna, aj tak ti bude vracat nerovnake vysledky, napriklad pri zadani a\b ti pri zapnutych magic_quotes necha a\b a pri vypnutych a\\b, to zrejme nechces :) Ak pouzijes addslashes a navyse este aj htmlentities, tak pochybujem, ze mysql_real_escape_string tam este treba. Dalej hned hore vytvoris entity a potom ampersandy zmazes pomocou str_ireplace, wtf? Takisto strip_tags nic nespravi, lebo mas to vsade zaentitovane.
Odporucam zamysliet sa nad tym, co je naozaj nebezpecne a treba to osetrit, a co je uz zbytocne a mozno aj hlupe odstranovat. Ako by napriklad prispevky na tomto fore vyzerali, keby sa z nich mazali bezne interpunkcne znaky ako bodky, otazniky, stredniky, atd?
O tom, ze ten kod je zbytocne dlhy (desat str_ireplacov sa dalo zlucit do jedneho regexpu), ani nehovorim.


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 641
Témy: 144
Bydlisko: Žilina
Príspevok Napísal autor témyOffline : 16.02.2010 9:59

Dik za odpoved Ďuri. trochu som to upravil:

Kód:
function protect($input, $cislo = false, $is_sql = false)
{
   $input = htmlentities($input, ENT_QUOTES);   
   if(get_magic_quotes_gpc ())
   {
      $input = stripslashes ($input);
   }
   if ($is_sql)
   {
      $input = mysql_real_escape_string ($input);
   }
   if ($cislo==true)
   {
      if (is_numeric($input))
      {
         return $input;
      }
      else
      {
         $zero=0;
         return $zero;
      }
   }
   else
   {
      $input = strip_tags($input);
      $input = str_replace("
      ", "\n", $input);   
      $input=str_ireplace(";","",$input);
      $input=str_ireplace("=","",$input);
      $input=str_ireplace("-","",$input);
      $input=str_ireplace(".","",$input);
      $input=str_ireplace("*","",$input);
      $input=str_ireplace("&","",$input);
      $input=str_ireplace("?","",$input);
      $input=str_ireplace("$","",$input);
      $input=str_ireplace("!","",$input);
      $input=str_ireplace(":","",$input);
      $input=str_ireplace("#","",$input);
      return $input;
   }
}


mohol by si mi prosim ta zlucit tie str_ireplace do regexpu? ide o to, ze si s regexpami velmi nerozumiem a rad by som to mal spravne :D
co tam treba este vyhodit / prerobit? a to odstranovanie niektorych znakov: ide o to, ze tieto znaky na 100% nebudu mat co robit v kontrolovanych premennych.







_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34
Bydlisko: Brno
Príspevok NapísalOffline : 16.02.2010 10:28

Ak mas nejaky vycet znakov, ktore su povolene, sprav to tak, ze vsetky znaky okrem nich odstranis. Pripadne priklad s odstranenim nepovolenych znakov (toto sa mi nepozdava. Pochybujem, ze napises vsetky znaky, ktore si naozaj nezelas mat. Ale budiz, ako ty chces):
Kód:
$input = preg_replace('/[\x00-\x20;=\-.*&?$!:#]/', '', $input); //odstranuje netlacitelne znaky vratane whitespace a tvoje nechcene interpunkcne znamienka

Na tvojom mieste tam ten ampersand nechavam, kedze htmlentities (mimochodom nespravne pouzite, kedze ti chyba 3.parameter - encoding) skonvertuje napriklad aj pismeno á. Tvoja fcia zmeni á na aacute, to vyzera v texte blbo, ze?
Dalej ta premenna $zero je naco? Pouzi return 0.
Fcia is_numeric ti ponecha aj bodku a pismeno e, nevadi?
Celkovo mi to pripada nepremyslene a chaoticke. Mohol by si napisat, co presne chces spravit a najdeme mozno lepsi postup.


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 641
Témy: 144
Bydlisko: Žilina
Príspevok Napísal autor témyOffline : 16.02.2010 10:41

Ďuri, dik za rady.

ide o to, ze si potrebujem spravit funkciu, ktorou budem kontrolovat $_POST a $_GET premenne proti MySQL Injection a XSS. najidealnejsie by bolo, keby som napr. ako v mojom priklade este funkcii vedel nastavit (true/false) ci sa ma jednat o cislo, pripadne o string. kontrolovat sa budu napr. meno, heslo, nejake id, cislo strany, text ktory uzivatel zadal (napr. komentar) atd. proste nieco univerzalne, co by som mohol pouzivat kdekolvek (takze je mozno to odstranovanie nezelanych znakov naozaj blbost).

navyse chcem query prehnat vzdy aj cez sprintf, je to krok k lepsej bezpecnosti?

necham si poradit.

DIK







_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34
Bydlisko: Brno
Príspevok NapísalOffline : 16.02.2010 11:53

Ja by som volil nasledovny postup - pomocou htmlspecialchars() s druhym parametrom ENT_QUOTES osetris jednak XSS, jednak apostrofy. Potom napriklad pomocou str_replace escapujes spatne lomitko, aby sa dalo pouzit v SQL:
Kód:
$input = str_replace('\\', '\\\\', $input);
Mozes uplne vyhodit znaky, ktore tam urcite nemaju co robit, \x00-\x09, \x0B-\x1F, mozno aj dalsie. Volitelne si pridaj ako parameter napriklad nejaky regexp, ak budes chciet odstranit dalsie znaky. To uz nechavam na teba, sprav si tie parametre tak, ako ty chces.
Sprintf ti k vacsej bezpecnosti vacsinou nepomoze, mozno len v pripade, ze pouzivas %d a zaistis tak, ze budes pracovat s integerom. To sa ale da docielit aj pretypovanim, $input = (int) $input;
Nezabudni este na zaciatok pridat stripslashes v pripade zapnutych magic_quotes.


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 641
Témy: 144
Bydlisko: Žilina
Príspevok Napísal autor témyOffline : 16.02.2010 12:14

no, takze som to nejak prerobil, je to lepsie? len mi je jasne, ze ten regexp mam zle a fakt si s nim neviem poradit, nemohol by si mi to, prosim ta, upravit? :D

Kód:
function protect($input, $cislo = false)
{   
   if(get_magic_quotes_gpc ())
    {
        $input = stripslashes ($input);
    }
   $input = htmlentities($input, ENT_QUOTES);
   $input = str_replace('\\', '\\\\', $input);
   if ($cislo==true)
   {
      $input=str_ireplace(".","",$input);
      $input=str_ireplace("e","",$input);
      if (is_numeric($input))
      {
         return $input;
      }
      else
      {
         return 0;
      }
   }
   else
   {
      $regexp="/([\x00-\x09])([\x0B-\x1F])/";
      if (!preg_match($regexp, $input))
      {
         return $input;
      }
      else
      {
           return 0;
      }
   }
}







_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34
Bydlisko: Brno
Príspevok NapísalOffline : 16.02.2010 12:21

Ten kod som ti okomentoval.
Kód:
function protect($input, $cislo = false)
{   
   if(get_magic_quotes_gpc ())
    {
        $input = stripslashes ($input);
    }
   $input = htmlspecialchars($input, ENT_QUOTES); //pouzil som podla mna vhodnejsiu fciu
   $input = str_replace('\\', '\\\\', $input);
   if ($cislo) //uprava zapisu
   {
      return (ctype_digit($input)) ? $cislo : 0; //fcia ctype_digit testuje len na 0-9; plus vid ternarny operator => zjednoduchsenie zapisu
   }
   else
   {
      return preg_replace('/[\x00-\x09\x0B-\x1F]/', '', $input); //znaky staci odstranit, nie hned mazat cely input
   }
}
Este zvazujem, ci by v if-vetve toho $cislo nestacilo proste
Kód:
return (int) $cislo;

Tie regexpy odporucam, aspon zaklady. www.regularnivyrazy.info


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 641
Témy: 144
Bydlisko: Žilina
Príspevok Napísal autor témyOffline : 16.02.2010 12:47

DIK za kod. som ho skusil a toto je vytup:

Citácia:
SELECT * FROM uzivatel WHERE id='' OR ''='''


a neviem ci je to OK alebo nie.

takto som to pouzil:

Kód:
$t2="' OR ''=''";
$t2=protect($t2);


$test="SELECT * FROM uzivatel WHERE id='".$t2."'";
echo $test;


tie regexpy bude musiet nastudovat ;)







_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34
Bydlisko: Brno
Príspevok NapísalOffline : 16.02.2010 13:20

Kludne to moze byt OK, pretoze pozeras do HTML stranky. Keby si si otvoril zdrojovy kod, videl by si, ze apostrofy su nahradene za ', co nemoze uskodit.


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 641
Témy: 144
Bydlisko: Žilina
Príspevok Napísal autor témyOffline : 16.02.2010 13:25

PERFEKTNE! robim uz tolko veci naraz, ze ma taka banalita ako pozriet do kodu ani nenapadla.

este raz DIK za pomoc a idem studovat regexp ;)







_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Skúsený užívateľ
Skúsený užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 29.10.07
Prihlásený: 27.10.23
Príspevky: 1395
Témy: 30
Bydlisko: Bratislava
Príspevok NapísalOffline : 16.02.2010 17:01

A ja by som namiesto tvorby vlastnych metod vyuzil nejake uz hotove a overene. Ide predsa o bezpecnost. Navyse, naco escapovat, ked mozeme rovno pouzit mysqli namiesto mysql. Vdaka bindovaniu parametrov sa sql injection bat netreba.







_________________
PC: OS: Windows 11 (64bit) CPU: AMD Ryzen 5 3600 GPU: ASUS TUF RTX3060Ti 8GB RAM: 16GB DDR4-3200MHz Kingston Fury MB: ASUS TUF Gaming B550M WIFI SSD: 1000GB PCIe M.2 NVME
Mobil: Xiaomi POCO F2 PRO
Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 641
Témy: 144
Bydlisko: Žilina
Príspevok Napísal autor témyOffline : 17.02.2010 7:56

ja by som tiez rad pouzil uz overenu funkciu proti injection a XSS ale nic take som nikde nenasiel, tak som zacal riesit nieco vlastne...







_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Skúsený užívateľ
Skúsený užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 29.10.07
Prihlásený: 27.10.23
Príspevky: 1395
Témy: 30
Bydlisko: Bratislava
Príspevok NapísalOffline : 18.02.2010 18:20

Google: php input filter class

ahaho, hned prvy link ;) Sice stara trieda, ale nemyslim ze to je chyba. Skor naopak.







_________________
PC: OS: Windows 11 (64bit) CPU: AMD Ryzen 5 3600 GPU: ASUS TUF RTX3060Ti 8GB RAM: 16GB DDR4-3200MHz Kingston Fury MB: ASUS TUF Gaming B550M WIFI SSD: 1000GB PCIe M.2 NVME
Mobil: Xiaomi POCO F2 PRO
Odpovedať na tému [ Príspevkov: 14 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Centrum zabezpečenia

v Operačné systémy Microsoft

11

593

12.09.2006 14:36

markesy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Centrum Zabezpecenia

v Operačné systémy Microsoft

0

400

27.03.2011 11:56

Marquez Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Upozornenie zabezpecenia

v Operačné systémy Microsoft

6

1478

12.04.2009 2:14

GeeDeeI Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. upozornenie zabezpecenia

v Operačné systémy Microsoft

2

1615

07.08.2009 23:04

Logik Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. centrum zabezpečenia systemu

v Operačné systémy Microsoft

3

359

24.11.2014 19:07

milan1966 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vypnute centrum zabezpečenia

v Operačné systémy Microsoft

1

1564

23.08.2009 20:09

Jani Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Testovanie zabezpecenia web stranky

v Ostatné

0

511

16.02.2011 9:37

slash24 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Navrh kompletneho zabezpecenia pc

[ Choď na stránku:Choď na stránku: 1, 2, 3, 4 ]

v Antivíry a antispywary

94

10666

28.03.2014 12:01

tairikuokami Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. I:centrum zabezpečenia systemu

v Operačné systémy Microsoft

2

277

29.12.2012 19:47

Denco1 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. upozornenia zabezpecenia systemu Windows

v Operačné systémy Microsoft

2

864

28.07.2006 21:52

johny128 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako vypnut Win Firewall bez Centra zabezpecenia

v Bezpečnosť a firewally

3

1430

05.03.2008 18:25

tantum Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. služba centra zabezpečenia systému windows sa nedá spustiť

v Operačné systémy Microsoft

1

1520

14.08.2012 19:14

mtxd Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. W7: služba centra zabezpečenia systému sa nedá pustit

v Operačné systémy Microsoft

6

991

10.09.2009 22:23

Sparco117 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zhodnotenie

v Webdesign

8

756

08.12.2008 22:10

dedko45 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zhodnotenie..

v Notebooky a netbooky

3

480

19.12.2009 13:53

ac.milan Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zhodnotenie

v PC zostavy

10

613

17.11.2011 14:34

killer Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra