MySQL の前処理によって SQL インジェクションが防止される理由を教えてください。 ? ?
例:
PHP コード
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
$link = new Mysqli('localhost', 'root', '111111', 'test');
$link -> set_charset('utf8');
$sql = 'SELECT * FROM test WHERE id=? AND name=?';
$stmt = $link -> prepare($sql);
$stmt -> bind_param('is', $id, $name);
$stmt -> execute();
上記の例に関して、私の理解は次のとおりです:
Mysql は実際に実行される前にすでに停止しています。 SQL ステートメントの「?」記号で表される型の値。
そのため、ID 位置の「?」に文字列値を渡すと、それも整数に変換されるため、SQL インジェクションが防止されます。
しかし、"?" at name は本来文字列として渡されるはずですが、SQL インジェクション文が渡された場合、どうすれば SQL インジェクションを防ぐことができるでしょうか。
私の理解が正しいかわかりませんが、アドバイスをお願いします。ありがとう! !
-----解決策---------addslashes()
------解決策------------------準備前処理の実装プロセスは実際には内部転送です。エスケープする必要がある一部の文字をエスケープするプロセスは、エスケープ メソッドを自分でカプセル化した場合と同様に、目に見えません。前処理を行わずに直接実行すると、エスケープする手順が存在しないため、リスク要因が増加します。
------解決策---------
------解決策---------習慣を身につけ、そうでない場合は php に問い合わせてください質問を理解します。.net、本当に見つからない場合は、フォーラムにもう一度質問します。
結論としては、addlashes は必要なく、SQL ステートメントの ? を '' で囲む必要もありません。完全に自動化された 'addlashes()' を準備します。
------解決策-----------$v = ( is_int( $v ) ? $ v : "'".pg_escape_string( $v )."'" );
LZ は私と同じものを使っていますか?プレースホルダーモード。
? このとき、整数の場合は is_int を使用し、文字列の場合は pg_escape_string() を使用して、text/char データ型の文字列をエスケープして返します。エスケープされた文字列。この関数は、addslashes() の代替として推奨されます。 (私はpgsqlデータベースを使用しています)エスケープします。
$real_sql .= preg_replace('/?/', $v, $sql_arr[$key],1); これでしょうか?交換。
------解決策----------------------
mysql_escape_string これを使用してユーザーを受け入れるか、独自のフィルターを作成しますユーザーによって渡された値は基本的に SQL インジェクションを防ぐことができます