質問

したがって、%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* Search Term Querystringに、ページに出力されます。

SQL構文にエラーがあります。適切な構文のためにMySQL Serverバージョンに対応するマニュアルをチェックして、1行目で「ブールモード」に近い「ブールモード)を使用します

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

役に立ちましたか?

解決

メソッド名から推論 queryAsArray, 、あなたが使用しているようです これ dbbase mysql関数マニュアルページのコメントからのクラス. 。もしそうなら、それはです 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! ↑

他のヒント

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

~ Daniel P. Brown
  Network Infrastructure Manager
  http://php.net/

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

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

確かに、私はサーバーを犠牲にしてこれをテストすることにしました。 mysql_real_escape_stringを使用して脱出し、データベースに挿入される入力フィールドとテキストアレアに%27を入力すると、エラーはありません。テキスト %27 挿入されたばかりです。まったく問題ありません。

あなたは間違っている。ここでは注入は不可能です。

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

  1. クライアントのエンコードは適切に設定されています mysql_set_charset()
  2. 逃げているデータ using mysql_real_escape_string()
  3. 引用符で囲まれています

注射が不可能であることを確認できます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top