4

SQL インジェクションを防止しようとしている既存の Web サイトに取り組んでいます。以前$_GET['ID']は消毒されていませんでした。

$ID=mysql_real_escape_string($_GET['ID']);
$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID=$ID AND s1.MERCHANT_ID=me.MERCHANT_ID");

URL の末尾に ' を付けると、次のmysql_real_escape_string()ようになりますmysql_error()

SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、1 行目の '\\' AND s1.MERCHANT_ID=me.MERCHANT_ID' 付近で使用する正しい構文を確認してください。

なしでmysql_real_escape_string()私は得る:

SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、1 行目の '\' AND s1.MERCHANT_ID=me.MERCHANT_ID' の近くで使用する正しい構文を確認してください。

どうしたのかわからない?どんな助けでも大歓迎です。

4

4 に答える 4

6

それがIDである場合、数値だと思いますが、整数にキャストしてみませんか?

$ID = (int) $_GET['ID'];

私ができる最善のアドバイスは、PDO を調べて、バインドされたパラメーターを使用することです。

于 2011-04-07T00:27:39.577 に答える
5

mysql_real_escape_string はエスケープしますが、クォートしません。

試す:

$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID='$ID' AND s1.MERCHANT_ID=me.MERCHANT_ID");

より一般的には、次のように、これらの両方を関数でラップする傾向があります。

function quoteValue($value) {
    return "'" . mysql_real_escape_string($value) . "'";
}

より洗練された引用動作が必要になる場合があるため、これは便利です (特に Unicode や制御文字などの処理に関して)。

于 2011-04-07T00:31:08.500 に答える
2

これは、変数を引用していないためです。

次の入力が与えられた場合のクエリは次のとおりです

$_GET['ID'] = "1";
$ID=mysql_real_escape_string($_GET['ID']);
SELECT ... where s1.MERCHANT_ID=1 ...

$_GET['ID'] = "1'"
$ID=mysql_real_escape_string($_GET['ID']);
SELECT ... where s1.MERCHANT_ID=1\' ...

$_GET['ID'] = "1'"
SELECT ... where s1.MERCHANT_ID=1' ...
于 2011-04-07T00:33:43.260 に答える
1

Phil Brown の言うとおりです。しかし、昔ながらmysql_real_escape_string or mysql_connect()の方法は非常に古いため忘れて、準備済みステートメント、バインド、オブジェクトのフェッチなど、さらに多くの関数を使用できる php の PDO() に移行する必要があります。

次世代のデータベース操作と SQL インジェクションからのセキュリティが必要な場合は、http://php.net/manual/en/book.pdo.phpPDO ドキュメントを読むことをお勧めします。

于 2011-04-07T01:19:29.837 に答える