6

重複の可能性:
PHPでSQLインジェクションを防ぐための最良の方法は?

私は自分のサイトをSQLインジェクションから保護するために少しテストを行ってきました。これを行うには、ユーザー入力をエスケープする、スラッシュを追加する、またはパラメーター化されたSQLステートメントを使用するなどの方法がいくつかあることがわかります。

私はこのテストコードを持っていました。

$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];

また、いくつかのSQLiリクエストを試しましたが、テストページでエラーが発生したり、追加のデータを表示したりできませんでした。

しかし、SQLステートメントコードをこれに変更したとき($ qの周りの一重引用符を削除しました)。

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = $q");

簡単なSQLiを実行して、いくつかの結果を得ることができました。

では、ユーザー入力を一重引用符で囲むだけで十分でしょうか?または、より複雑なSQLiテクニックを見落としましたか?

4

3 に答える 3

3

SQLインジェクションとパラメーター化されたステートメントについて言及していますが、PDO全体ではないようですか?-PDOhttp ://www.php.net/manual/en/pdo.prepare.phpを使用します

于 2012-10-12T17:18:45.843 に答える
1

mysql_real_escape_string()関数を使用する必要があります

この場合、一重引用符を使用する必要があります

 $game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'");

ユーザー入力が1'escape_string出力よりも大きいと仮定しましょう1\'

引用符を使用していない場合、クエリは次のようになります

SELECT * FROM `Games` WHERE `id` = 1'

//that is wrong or a injection

しかし、一重引用符の場合

SELECT * FROM `Games` WHERE `id` = '1\''

それは良いですそして取り除くことができますsql-injection

于 2012-10-12T17:14:54.107 に答える
1

この入力を試してください:

abc' OR id <> '

次のステートメントにつながります。

"SELECT * FROM `Games` WHERE `id` = 'abc' OR id <> ''"

これにより、1つだけではなく、すべてのゲームが返されます。あなたのページが全体の結果を表示することを許可するなら、私たちは間違いなくあまりにも多くを見るでしょう...

解決策は、プリペアドステートメントでPDOを使用することです。これは、少なくともmysqli_real_escape_string()ユーザー入力をSQLステートメントに挿入する前の関数です。

SQLインジェクションはさらに多くのことを実行できます。最悪の場合、サーバーを制御することもできます。このSQLインジェクションのチートシートをご覧ください

于 2012-10-12T17:39:57.143 に答える