ホームページ  >  記事  >  バックエンド開発  >  まず、Mysql の前処理によって SQL インジェクションを防止できると言われるのはなぜでしょうか?

まず、Mysql の前処理によって SQL インジェクションを防止できると言われるのはなぜでしょうか?

WBOY
WBOYオリジナル
2016-06-13 13:23:541010ブラウズ

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()
------解決策------------------
準備前処理の実装プロセスは実際には内部転送です。エスケープする必要がある一部の文字をエスケープするプロセスは、エスケープ メソッドを自分でカプセル化した場合と同様に、目に見えません。前処理を行わずに直接実行すると、エスケープする手順が存在しないため、リスク要因が増加します。
------解決策---------
話し合う

引用:

準備前処理の実装プロセスは、実際には、エスケープする必要がある一部の文字を自分でカプセル化するのと同じように表示できません。エスケープメソッドを前処理せずに直接実行すると、エスケープステップがないため、リスク要因が増加します。

は、上記のような addslashes() や mysql_escape_string() を使用するようなものです。

------解決策---------
習慣を身につけ、そうでない場合は 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 インジェクションを防ぐことができます
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。