2011-08-02 10 views
4

私はこのPDOの全部を調べていましたが、このコードチュートリアルを読んでいて、PDOとデータバインディングを使用するとSQLインジェクションを追加できないという説明がありました。これはどのように作動しますか?このPDOコードはSQLインジェクションからどのように保護されますか?

 
# no placeholders - ripe for SQL Injection! 
$STH = $DBH->("INSERT INTO folks (name, addr, city) values ($name, $addr, $city)"); 

# unnamed placeholders 
$STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?); 

# named placeholders 
$STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)"); 

ここに私があなたが参照するためにそれを読むことから得たウェブサイトへのリンクがあります。 http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

+0

これは単純な例です。彼らは実行されません。 ' - > query'と' - > prepare'メソッド呼び出しなどがありません。 –

+0

コマンドとデータが別々に転送されるためです。 (サポートしている/サポートしているバックエンドの場合) – mario

答えて

3

(2行目にバグがあり、文字列は終了していません。最後に");を追加してください。これはリンク先のページにも表示されています。もちろん、結果を得る前に、疑問符を代用する値を指定してから実際にクエリを実行する必要もあります)。

とにかく、 PDOは?または:nameのマーカーを探し、指定した値で置き換えます(それぞれ順番にまたは名前で)。値がクエリ文字列に挿入されると、最初に処理されて注入攻撃に使用できるものがエスケープされます。

クエリで使用する前に値にmysql_real_escape_string()(または弱いaddslashes())を使用するのと似ていますが、PDOはそれを自動的に実行してより優れています。

0

PDOは、準備された文を使用するときに、値を適切にクエリに挿入する方法を知っているためです。

4

PDOは、単純にプレースホルダをパラメータ化されたデータに置き換えるよりもはるかにバックグラウンドです。データベースエンジンは、「あなたのステートメントはここにあります、ここではプレースホルダです」と同様の形式でクエリを受け入れ、各プレースホルダに何が入るかを教えてくれます。 SQLエンジンは、パラメータは実行されるべきではなく、データとしてのみ扱われることを認識しています。

+3

...データベースがそのようなものをサポートしていない場合、そのデータベースのPDOライブラリはデータ自体を適切にエスケープする方法を知っています。 – Quentin

+1

+1。ここでは非常に重要です。ほとんどの場合、データベースエンジン自体によって置換が行われています。つまり、mysql_escape_string VSのようなもので終わることはありません。 mysql_real_escape_string VS. mysql_escape_string_i_mean_it_this_time。 – Kibbee

0

プレースホルダに値をバインドする場合(例:

$sth->bindValue(':name', $name, PDO::PARAM_STR); 

PDOは正しくエスケープします。したがって、SQLインジェクションは機能しません。

0

バインドパラメータを使用したプリペアドステートメントは、クエリの分析がすでに完了しているステートメントであり、stringまたはintの場所はstriongまたはintのみであるためです。文の新しい分析は行われないので、与えられた引数はSQLに関連するものとして分析することはできず、SQLとして分析されることもありません。

関連する問題