Autor Zpráva
WanTo
Profil
Jak se bráníte proti SQL injection útoku?

Mám třeba URL http://neco/zobrazit=Nejaka%20stranka. Proměnná $_GET["zobrazit"] se pak vloží do SQL dotazu, který bude vypadat například takto:
select * from stranky where nazev like 'Nejaka stranka'

A teďka se ptám: Existuje nějaký způsob, jak tento dotaz předělat na SQL injection útok? Jak se proti němu bránit, jak řetězec zobrazit ošetřovat?
koudi
Profil
mysql_escape_string
mysql_real_escape_string

Další velice dobrou metodou jsoui tzv. placeholdery, podporováno myslim od mysql 4.1 a api podpora od php verze 5 (teď si nejsem zcela jist).
llook
Profil
tak třeba takhle:
mysql_query(sprintf('SELECT * FROM stranky WHERE nazev LIKE \'%s\'',

mysql_real_escape_string($_GET['zobrazit'])));

Ale spíš už teď používám prepared statements v PDO:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root');

$stmt = $pdo->prepare('SELECT * FROM stranky WHERE nazev LIKE ?');
$stmt->bindValue(1, $_GET['zobrazit']);
$stmt->execute();
,,,
Jinak je taky často v php.ini zapnutá volba magic_quotes_gpc, což sice proti SQL injection chrání, ale jinak je to spíš na zlost.

Něco o tom píše Vrána - http://php.vrana.cz/obrana-proti-sql-injection.php - a to je zastánce magic_quotes_gpc (asi jediný, kterého znám).
WanTo
Profil
Čili pokud je povolená magic_quotes_gpc, nemusím se u řetězcových hodnot starat o nic?
krteczek
Profil
no pry je problém u polí, takže se je lepší m_q_gpc vyhnout, nebo při přijetí proměnných slashe odstranit a pri ulozeni do db je znovu nastavit (blbe ale bezpečne, aspon to mi vyšlo z http://php.vrana.cz/vypnuti-magic_quotes_gpc.php a diskuze pod nim)
karbon
Profil *
ta f-ce mysql_escape_string je tutově bezpečná nebo to je jen "kousek" z ochrany?
v6ak
Profil
Já bych dal přednost mysql_real_escape_string, pokud by to nebyla dostatečná ochrana, tak to bude bezp. chyba této fce. To se už stalo, ale doporučuji ji asi nejvíc.

Zajímalo by mě, zda co je výchozím druhým parametrem.
Joker
Profil
llook
ad magic_quotes_gpc, což o to automatické escapování, ale ještě navíc to může a nemusí být zapnuté. To je fakt na palici.
By mě zajímalo, co někoho vedlo k tomu to do PHP přidat
Hacky
Profil *
nemohl by mi nekdo otestovat http://hacky.easyfunfilm.com/login/ ? díky
Pavel Strejček
Profil
WanTo
Čili pokud je povolená magic_quotes_gpc, nemusím se u řetězcových hodnot starat o nic?

magic_quotes_gpc ošetřuje pouze get/post/cookie, takže u proměnné v $_GETu to stačí. Jsou ještě další zdroje data, které je třeba ošetřovat, například databáze. Když třeba načteš něco z databaze, není vhodné to znovu uložit do stejné databáze bez ošetření (escapeování na výstupu není). Většinu externích zdrojů dat řeší magic_quotes_runtime.
v6ak
Profil
Čili pokud je povolená magic_quotes_gpc, nemusím se u řetězcových hodnot starat o nic?
... tak to musím zase někdy odescapovávat...

BTW: např. i čísla je potřeba dávat do apostrofů.
Toto téma je uzamčeno. Odpověď nelze zaslat.