/ / SQL Injection Protection - jednoduché úvodzovky [duplikát] - php, mysql, sql-injection

SQL Injection Protection - jednoduché úvodzovky [duplicate] - php, mysql, sql-injection

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ď č. 1

Vyskúš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