0

Prepared statementsSQLクエリでの使用を提案するさまざまな記事を読みmysql_ lib does not allow executing 2 queries in one statementましたが、ページの実行中にクエリを1回だけ起動する必要がある場合、それらを使用する価値があるため、場合によってはmysql_queryも無効な投稿データを無視するようです( 'ADMIN' OR 1--)

$username = $_POST['username'];
$password = $_POST['password'];

 mysql_query("SELECT * FROM users WHERE username=$username AND password=$password");

//processing

今、誰かが「ユーザー名」を

'ADMIN' OR 1--

上記のクエリは「管理者」行をフェッチしません! これは、 の後のコメントを無視する mysql_query の機能ですか'1' / Special chars。MYSQL 5.5 と PHP 5.3 を実行しているこの場合、SQL インジェクションはどのように発生しますか?

4

1 に答える 1

2

おそらく'ADMIN' OR 1--うまくいかないかもしれませんが'ADMIN' OR 'x' = 'y'、次の SQL クエリになるため、確かにうまくいきます。

SELECT *
  FROM users
 WHERE username = 'ADMIN'                    -- true
    OR 'x' = 'y' AND password = 'whatever'   -- false, but who cares?
;

一般的な教訓: セキュリティのためのコーディングは難しいものです。なぜなら、コードを妨害しようとする敵対的なエージェントの観点から考えることに慣れていないからです。SQL インジェクションは解決された問題であり、その解決策はパラメーター化されたクエリであるため、独自の解決策を試行するのではなく、それを使用する必要があります。

于 2012-09-27T16:58:00.550 に答える