2012-02-23 9 views
0

可能性の重複:
How prepared statements can protect from SQL injection attacks?

私はPDOで$ _GETを使用している場合は、私はまだそれをエスケープする必要がありますか?私の理解は、これはSQLインジェクションの影響を受けないということですが、私はまだそれを逃していないのでは不安です。だから、誰かがこの小さなコードブロックを見て、それが安全かどうか教えてもらえますか?

<?php 
$hostname = 'localhost'; 
$username = 'root'; 
$password = 'root'; 
$database = 'database'; 
try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $stmt = $dbh->prepare("SELECT * FROM comments WHERE pid = :pid"); 
    $pid = $_GET['pid']; 
    $stmt->bindParam(':pid', $pid, PDO::PARAM_STR); 
    $stmt->execute(); 
    $result = $stmt->fetchAll(); 
    } 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 
    $stmt->execute(); 
    echo $stmt->rowCount(); 
$dbh = null; 
?> 

また、私は心配している$ _GETです。どんな助けもありがとう、ありがとう。

+3

準備されたクエリの変数をエスケープする必要がある場合、準備はほぼ完全に役に立たなくなります – zerkms

+0

言い換えれば、準備されたステートメントのプレースホルダに必要なものを埋め込みます - DBはあなたにエスケープしますそのデータはどこから来たのか。 –

+0

それは、(準備文とは異なり)エスケープしても "データ"が "安全"にならないと分かっている人にとっては、かなり面白い不安です。 –

答えて

2

はい、準備されたステートメント機能は、それが何をしているのかを行います。しかし、あなたが尋ねてきたので、それが物語の終わりではないことを明確にしましょう。私はOWASP Top Ten Application Security Risks 2010を見ています。例えば

  • は、すべてのPIDに関連付けられたデータへのアクセスを許可され、すべてのリモートユーザですか?そうでない場合は、OWASP 2010-A4-Insecure Direct Object Referencesの明確な例が、ユーザーに許可されているかどうかを確認できません。
  • OWASP 2010-A7-Insecure Cryptographic Storageの明確な例であるため、クリアテキストでパスワードをハードコーディングすることは、おそらく深刻なことではありません。
  • rowcountをエコーすることとは別に$ stmtを使って何をするのかは言いませんが、データベースからコンテンツを表示する場合は、最初にHTMLエンティティをエスケープするよう注意してください。それ以外の場合は、OWASP 2010-A2-XSS(Cross-Site Scripting)の明確な例を作成します。
  • ところで、 "SELECT *"ではなく、明示的に列(または集約関数)を指定する方が一般的には優れています。
+0

ありがとうございます、私は今、そのリストを梳かしています。 – Ian

関連する問題