1

したがって、%27を使用すると、データがサニタイズされている場合でも、SQLインジェクションを実行できます。mysql_real_escape_string

%27) SQL INJECTION HERE %2F*

何をすべきか?

例を使用して編集します。

$sql = sprintf("SELECT *, MATCH(post) AGAINST ('%s*' IN BOOLEAN MODE) AS score FROM Posts WHERE MATCH(post) AGAINST('%s*' IN BOOLEAN MODE)",
                mysql_real_escape_string($_GET['searchterm']),
                mysql_real_escape_string($_GET['searchterm']));

$results = $db->queryAsArray($sql);

%27) SQL INJECTION HERE %2F*searchtermクエリ文字列を渡すと、次のページに出力されます。

SQL構文にエラーがあります。1行目の「BOOLEANMODE)」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

dbクラスで問題を見つけてくれてありがとう。

4

4 に答える 4

2

メソッド名からすると、MySQL関数のマニュアルページのコメントから、このDbBasequeryAsArrayクラスを使用しているようです。その場合、エスケープされた引用符からエスケープ文字を削除するメソッドです。query

function query($sql, &$records = null){
    $sql = str_replace(array('\\"', "\\'"), array('"', "'"), $sql);
    // …
}

次に、あなたの例が機能するのは奇跡ではありません(私はそれを単純化しました):

$input = "', BAD SQL INJECTION --";

$sql = "SELECT '".mysql_real_escape_string($input)."'";
var_dump($sql);  // string(33) "SELECT '\', BAD SQL INJECTION --'"
//                      everything’s OK ↑

$sql = str_replace(array('\\"', "\\'"), array('"', "'"), $sql);
var_dump($sql);  // string(32) "SELECT '', BAD SQL INJECTION --'"
//                                Oops! ↑
于 2011-03-14T21:29:43.117 に答える
1

私たちのマニュアルに記載されているメモは、削除のマークが付けられています。ネットワーク内のすべてのミラーに伝播すると、公式ドキュメントに添付されて表示されなくなります。

~ Daniel P. Brown
  Network Infrastructure Manager
  http://php.net/
于 2011-03-15T17:45:24.717 に答える
0

このようなステートメントをまったく作成せず、代わりにmysqliまたはPDOを使用してパラメーターでクエリを使用することをお勧めします。これはMySQLインジェクションの問題に対処し、ある日(まだ残念ながら)、クエリはパラメータなしでキャッシュされるため、パフォーマンスも向上します。つまり、キャッシュには数十の異なるクエリではなく、1つのクエリしかありません。常に変化する単一の入力値。他のデータベースは長い間これを利用していますが、MySQLは最新バージョン以降、パラメーター化されたクエリを遅くすることはできませんでした。

%27が実際に文字列を終了することはもっともらしく見えません。文字列内に引用符を埋め込む可能性のようですが、よくわかりません。

確かに、私は自分のサーバーを犠牲にしてこれをテストすることにしました。mysql_real_escape_stringを使用してエスケープされてデータベースに挿入される入力フィールドとテキストエリアに%27を入力すると、エラーは発生しません。テキスト%27が挿入されただけです。ですから、まったく問題ありません。

于 2011-03-14T21:52:07.993 に答える
-1

あなたは間違っている。ここでは注入できません。

これらの3つの簡単なルールに従うことによって

  1. によって適切に設定されたクライアントのエンコーディングmysql_set_charset()
  2. エスケープされているデータusing mysql_real_escape_string()
  3. 引用符で囲みます

あなたは注射が不可能であることを確信することができます

于 2011-03-14T21:02:14.197 に答える