-3

私はこのコードを持っています:

<?php
$table = $_GET ["table"];
$query = "SELECT 1 FROM $table";
$st = $pdo->prepare($query);
$st->execute();

これは実際のコードではありませんが、アイデアを得るための例です。

私が作る場合:

hacked.php?table=users;DROP TABLE users;

正しくエスケープされていないため、機能します。

ただし、次のような情報を更新する場合:

hacked.php?table=users; UPDATE users SET name="abc" WHERE name="def";

エスケープされているため、pdoはクエリを次のように変換します。

SELECT 1 FROM users; UPDATE users SET name=\"abc\" WHERE name=\"def\";

そして明らかに失敗します。

とにかくこのクエリを機能させる方法はありますか?

編集1

私たちのチームには、私のコードをチェックしてハッキングすることだけに専念している男性が 1 人います。ですから、これが何らかの形で実現できるなら、私は準備を整えたいと思っています。

編集2

私はすでにこれを読んでいました: SQL インジェクションを防ぐのに十分な PDO 準備済みステートメントはありますか? しかし、それは本当に私の質問に答えませんでした。しかし、それは私に通過する方法を与えてくれました。そして、@duskwuff の解決策は、私がたどり着いたものと同じでした。したがって、管理者にとって、これを削除するか、重複としてマークする必要がある場合は問題ありません。しかし、これは、準備されたpdoがどのようにハッキングされるかを誰かが知るのに役立つと主張します.

4

2 に答える 2

3

エスケープされているため、pdoはクエリを次のように変換します。

SELECT 1 FROM users; UPDATE users SET name=\"abc\" WHERE name=\"def\";

これは正しくありません。PDO は、補間されたテキストを認識しないため、クエリに補間されたテキストに対してエスケープを実行しません。あなたが見ているのは、magic_quotesリクエスト変数の内容にバックスラッシュを追加した PHP の非推奨機能 ($_GETや など$_POST) の結果です。これが有効になっている場合でも、次のような引用符で囲まれていない構成を使用することで、このようなクエリで簡単に回避できます。

SELECT 1 FROM users; UPDATE users SET name = CHAR(97,98,99) WHERE name = CHAR(100,101,102)

(CHAR()は、文字コード値のリストから文字列を作成する MySQL 関数です。他のデータベースを使用している場合は、おそらく同等の関数が存在します。)

エスケープされていないコンテンツをクエリに直接挿入することは決して安全ではありません。やらないでください。

于 2013-09-05T03:39:24.900 に答える