mysql_real_escape_string十分ではありませんか?
-
24-10-2019 - |
質問
したがって、%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つの簡単なルールに従うことにより
- クライアントのエンコードは適切に設定されています
mysql_set_charset()
- 逃げているデータ
using mysql_real_escape_string()
- 引用符で囲まれています
注射が不可能であることを確認できます