Možné duplicitné:
Najlepší spôsob, ako zabrániť injekcii SQL v PHP?
Ive robil trochu testovanie na ochranu môjhostránky z SQL Injection. Vidím, že existuje niekoľko spôsobov, ako to urobiť: Únik z mojich používateľských vstupov, pridanie lomiek alebo lepšie používanie parametrizovaných príkazov SQL.
Mal som tento testovací kód.
$q=$_GET["q"];
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = "$q"");
$game = mysql_fetch_array($game);
echo "<h4>ID: ".$game[0]."<br /></h4>name: " . $game[1];
A vyskúšal som niekoľko požiadaviek SQLi a nemohol som dostať svoju testovaciu stránku do omylu alebo zobraziť žiadne ďalšie údaje.
Ale keď som zmenil kód príkazu sql na tento (odstránil som jednoduché úvodzovky okolo $ q) ..
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = $q");
Mohol by som vykonať jednoduché SQLi a získať nejaké výsledky.
Je teda balenie mojich používateľských vstupov do jednoduchých úvodzoviek dosť dobré? Alebo som sa pozrel na zložitejšie techniky SQLi?
odpovede:
1 pre odpoveď č. 1Vyskúšajte tento vstup:
abc" OR id <> "
povedie to k nasledujúcemu tvrdeniu:
"SELECT * FROM `Games` WHERE `id` = "abc" OR id <> """
To by vrátilo všetky hry namiesto jednej. Ak vaša stránka umožňuje zobraziť celý výsledok, určite by sme videli príliš veľa ...
Cesta von je použitie CHOP s pripravenými vyhláseniami, prinajmenšom mysqli_real_escape_string()
pred vložením užívateľského vstupu do príkazu SQL.
SQL-Injection dokáže urobiť omnoho viac, v najhoršom prípade môžete dokonca získať kontrolu nad serverom. Pozrite sa na to SQL Injection Cheat Sheet
3 pre odpoveď č. 2
Spomínate SQL injekciu a parametrizované príkazy, ale nezdá sa, že by sa nachádzali v CHOP? - Použite CHOP http://www.php.net/manual/en/pdo.prepare.php
0 pre odpoveď č. 3
mali by ste používať mysql_real_escape_string()
funkcie
V takom prípade musíte použiť jednoduché úvodzovky
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = "$q"");
predpokladajme, že vstup používateľa je 1"
ako bude výstup escape_string 1"
ak nepoužívate úvodzovky, dopyt bude
SELECT * FROM `Games` WHERE `id` = 1"
//that is wrong or a injection
Ale v prípade jednoduchých úvodzoviek
SELECT * FROM `Games` WHERE `id` = "1""
to je dobré a môže odstrániť sql-injection