Názory ke článku SQL Injection a zabezpečení
23. 4. 2007
Prima článek, už vim co ten SQL injection je. :)
Zrovna se mi to hodí, takže díky za stručnej a poučnej článek.
23. 4. 2007
http://www.security-portal.cz/clanky/sql-injection.html
http://www.security-portal.cz/clanky/sql-injection-v-praxi.html
Myslel som, ze SQL injection sa da osetrit vhodnym parsovanim vstupnych udajov, ale aj toto je dobre vediet :) Dik
23. 4. 2007
Uvedený příklad nemůže fungovat ani teoreticky, natož prakticky. Autor by si za domácí úkol mohl zjistit proč.
Onen ,,nebezpečný náchylný dotaz'' je skutečne nebezpečný, ale útok je nutno vést zcela lstivě naprosto jiným způsobem.
Mne by zase zajímalo proč v kódu
$dotaz = "select * from clanky where id='$id'";
kde id je typu integer je proměná id v apostrofech! Vždyť v apostrofech bývají řetězce...
Napadlo me v rychlosti jedno obecne reseni, ktere vyresi vsechny prichozi promenne najednou. Staci pridat na zacatek vasich scriptu nasledujici dva radky kodu :
foreach ($_GET as $key => $value) { $_GET["$key"]=str_replace(" ","",$_GET["$key"]); }
extract($_GET);
S tim, ze zmena obsahu promenych v { } je obecne reseni (kdy predpokladam, ze do SQL dotazu nedavam promenou s mezerou),
a dalo by se rozsirit prave o testovani IsNumeric, apod.
ofcourse jde o reseni v PHP, a s tim, ze utocnikuv dotaz to znehodnoti a sql dotaz vypise chybu. Je to jen cesta jak by to slo osetrit v jiz existujicich projektech docela jednoduse.
Popr. nevidi to nekdo jinak, nejaky zadrhel?
25. 4. 2007
Pretoze to bude fungovat a osetrujes tym jeden z najtazsich SQL injectov. Ak je vyraz v apostrofoch tak ti nikto nemoze UNIONovat tabulku alebo vytvorit pravdivostnu podmienku. Uz chapes ?
No jenže je přece blbost aby sem to takhle "přetypoval". To je chyba mysql a podobných že tohle projde.
26. 4. 2007
Nebudu se rozepisovat, ale následující zdrojáky jsou IMHO použitelnější a bezpečnější:
Zapnutí register_globals programově:
if(!ini_get('register_globals')) {
$sequence = eval('return array('.strtr(ini_get('variables_order'), array('E' => '&$_ENV, ', 'G' => '&$_GET, ', 'P' => '&$_POST, ', 'C' => '&$_COOKIE, ', 'S' => '&$_SERVER, ', 'R' => '&$_REQUEST, ', 'F' => '&$_FILES, ')).');');
foreach($sequence as $value) {
//We can not use extract() because
//it does not do what we exactly need (hint: ${'some_terrible[variable'}; )
foreach ($value as $k => $v) {
if($k == 'GLOBALS') {
continue;
}
$$k = $v;
}
}
unset($sequence);
}
Zapnuté magic quotes programově(Zdroj: http://php.vrana.cz)
if(!get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST, &$_FILES);
while(list($key, $val) = each($process)) {
foreach($val as $k => $v) {
unset($process[$key][$k]);
if(is_array($v)) {
$process[$key][($key < 5 ? $k : addslashes($k))] = $v;
$process[] =& $process[$key][($key < 5 ? $k : addslashes($k))];
}
else {
$process[$key][addslashes($k)] = addslashes($v);
}
}
}
}
PS. OT Co se to poslední dobou s Programujte děje? Nechtěl bych být považován za kverulanta, ale kvalita článků jde dolu, periodičnost vydávání článků se mi nelíbí, novinky jsou chudé a není to web 2.0 . :D Zkrátka by to chtělo "zapracovat" na obsahu. (Beru na vědomí: Autoři pracují dobrovolně a skoro zadara, finační prostředky projektu asi nebudou závratné, Cura a spol. má moc práce a já, že bych posunul hranice svých vědomostí dál :) )
Ale ked ti to niekto nabura cez toto tak povies co? Ze to bola chyba SQL a nie tvoja? :)
Napíšu to tak, aby se tam nenaboural ;)
$id = (int)$id; // $id = $id + 0;
$dotaz = "select * from clanky where id=$id";
Tohle by snad mohlo jít.
11. 5. 2007
Ach jo, zase jeden článek o SQL Injection, který ukazuje spoustu blbostí, místo aby seriózně poradil.
if (!is_string($_GET["id"])):
A co se stane, když $_GET['id'] nebude vůbec definované? Vyhodí mi to notice. A když bude definované, tak je tahle podmínka zcela zbytečná, protože vstupní parametry jsou vždycky string.
$id = mysql_real_escape_string($_GET["id"]);
Hmm, a co když budou zapnuté magic_quotes_gpc? Když už psát články a ukázky, tak pořádně, neboli toto ošetřit například pomocí best-practice uváděné v PHP manuálu u funkce mysql_real_escape_string.
$dotaz = "select * from clanky where id='$id'";
Integer do uvozovek? Ale fuj. Že to náhodou v MySQL funguje, je spíš jeho chyba :), rozhodně jiné databáze vás s tím vypráskají. Tohle je fakt ochrana jako vrata...
if (!is_numeric($id)):
echo "Toto ne!";
else:
$dotaz = "select * from clanky where id='$id'";
endif;
A tenhle kód pokračuje jak? Následuje třeba něco jako mysql_query($dotaz)? Že by bezpečnostní díra jako prase?
Dobrý článok!
Hoci mne nepomohol zabezpečiť webové aplikácie a už vôbec mi nepomohol pochopiť zmysel SQL, ale zato som si vďaka tomuto článku všimol deravosť fóra na týchto stránkach a tiež som si istý, že vďaka tomuto článku už nebudem v každej stránke vidieť takú dokonalosť ako predtým.
Používám takovouhle kontrolu, doufám, že mne za to nezastřelíte - holt jsem samouk :(
Za případné rady budu rád :)
if( ctype_digit($_GET["id"]) AND isset($_GET["id"]) ){
"... WHERE id ".intval($_GET["id"])." ... ";
} else {
// přesmerování na systémové hlášení
}
24. 12. 2008
$id = intval($id);
$sql = mysql_query("select nazev from clanky where id='".$_GET['id']."'");
$nazev = mysql_result($sql, 0);
echo "$nazev";
co tohle?
1. 10. 2010
Zdravím, pre všetkých SQLi nadšencov je tu Cheese Holes blog pre trénovanie Vašich zručností. Prvotné info je na webe h4f http://www.hack4fun.eu/2010/09/sqli-technika-a-prevencia/, kde nájtete aj linky na obe verzie Cheese. Enjoy
5. 5. 2024
Dnes v r. 2024 jako ochrana proti SQL injekci již jen parametrizované dotazy.
Viz: https://zmsoft.cz/?str=parametrizovane-sql-dotazy-v-php-rozhran