Stránka: 1 z 1
| [ Príspevkov: 14 ] | |
Autor | Správa |
---|
Registrovaný: 16.01.08 Prihlásený: 27.03.13 Príspevky: 641 Témy: 144 | 144 Bydlisko: Žilina |
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 |
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
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.
|
|
Registrovaný: 16.01.08 Prihlásený: 27.03.13 Príspevky: 641 Témy: 144 | 144 Bydlisko: Žilina |
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
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 |
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
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.
|
|
Registrovaný: 16.01.08 Prihlásený: 27.03.13 Príspevky: 641 Témy: 144 | 144 Bydlisko: Žilina |
Ď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 |
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
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.
|
|
Registrovaný: 16.01.08 Prihlásený: 27.03.13 Príspevky: 641 Témy: 144 | 144 Bydlisko: Žilina |
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?
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 |
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
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
|
|
Registrovaný: 16.01.08 Prihlásený: 27.03.13 Príspevky: 641 Témy: 144 | 144 Bydlisko: Žilina |
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 |
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
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.
|
|
Registrovaný: 16.01.08 Prihlásený: 27.03.13 Príspevky: 641 Témy: 144 | 144 Bydlisko: Žilina |
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 |
|
Registrovaný: 29.10.07 Prihlásený: 27.10.23 Príspevky: 1395 Témy: 30 | 30 Bydlisko: Bratislava |
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 |
|
Registrovaný: 16.01.08 Prihlásený: 27.03.13 Príspevky: 641 Témy: 144 | 144 Bydlisko: Žilina |
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 |
|
Registrovaný: 29.10.07 Prihlásený: 27.10.23 Príspevky: 1395 Témy: 30 | 30 Bydlisko: Bratislava |
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 |
|
Stránka: 1 z 1
| [ Príspevkov: 14 ] | |
|