2016-04-17 12 views
0

私はSQLインジェクションPHP 5.6とPDOではエスケープ文字が必要ですか?

$stmt = $DBH->prepare("SELECT * FROM T_Users WHERE User_Name = :UN"); 
$stmt->bindParam(':UN', $user_name); 
$stmt->execute(); 

を防止するために、MySQLのデータを入力/読み取るためにPDOを使用するには、私はデータベースに入る前かでデータベースからデータを表示する前に文字をエスケープする必要があります任意の理由があります。ブラウザ? JavaScriptコードを自分のデータベースに記録して悪意のあるユーザーが自分のウェブサイトや他のユーザーを悪用する可能性はありますか?

ありがとうございます!

+1

そのような状況では、何も手動でエスケープしないでください。データバインディングはエスケープします。手動でエスケープすると、 "ダブルエスケープ"文字になります。あなたが望むものではありません。それはすべて実際にドキュメントで説明されています。 – arkascha

+0

Prepared、Parameterized Queriesを使用することで、すでにSQLインジェクションを処理しています。もう何も脱出する必要はありません。 –

+0

悪意のあるユーザーが自分のユーザー名をJavaScriptコードとして選択した場合、そのユーザー名がブラウザに表示されると他のユーザーに危害を及ぼすことがありますか?たぶん私はあまりにもパラノイドすぎているかもしれません... – Mike

答えて

2

->prepare();メソッドは、bindParam()と一緒にすべてを行いますので、何もする必要はありません。

準備されたステートメント変数にパラメータをバインドすると、古いデータのようにクエリに追加されるのではなく、生データが格納されます。 :)

+1

実際には起こっていないことが起こっていると言うのは正確ではありません。 'prepare'メソッドは何もエスケープしません。なぜなら、その時点の値さえ知らないからです。彼らは後で拘束され、ミドルウェアでさえも*脱出しない*。 – trincot

+1

@trincot 'PDO :: ATTR_EMULATE_PREPARES'は実際に値をバインドした後にエスケープします。 (もちろん、それは必要ないはずですが、それでもデフォルトです) – mario

+0

乾杯、編集。 –

2

バインディングパラメータとして渡す引数をエスケープしてはいけません。

何も起こっているエスケープはありません。ステートメントをプレースホルダでコンパイルし、後でエスケープされずにパラメータ値を別々に受け取るのはSQLエンジンです。 SQLエンジンの機能は、コンパイルされたステートメント(この時点ではSQLストリングはこれ以上ありません)と、SQLインジェクションの問題全体が無関係になることを保証するパラメータ値を組み合わせることです。

プレースホルダをバインドするために渡す値をエスケープすると、悪影響があります。 SQLエンジンは実際には値を必要としますが、何らかの方法でエスケープされた場合、エンジンはエスケープしませんが、文字通り取ることができます。

関連する問題