2012-02-23 80 views
0

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

如果我使用$ _GET與PDO我還需要逃生呢?我的理解是,這對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 2012-02-23 02:33:27

+0

換句話說,東西隨便你到一個事先準備好的聲明佔位符 - 數據庫將帶你逸出的照顧,不管數據來自哪裏。 – 2012-02-23 02:36:36

+0

這是一個非常有趣的不安,對於明白(不像準備好的語句)轉義的人不會使你的「數據」「安全」 – 2012-02-23 02:40:15

回答

2

是的,準備好的語句功能完成它所說的。但是既然你問了,我們要清楚,這不是故事的結尾。我正在看OWASP Top Ten Application Security Risks 2010

例如:

  • 被授權訪問數據的每個遠程用戶與每一個相關聯的PID?如果沒有,則檢查用戶是否被授權是OWASP 2010-A4-Insecure直接對象引用的明顯例子。
  • 您可能並不認真對待以明文方式對密碼進行硬編碼,因爲這是OWASP 2010-A7-Insecure Cryptographic Storage的一個明顯示例。
  • 除了回顯rowcount之外,您不會說使用$ stmt可能會做什麼,但是當然,如​​果您顯示數據庫中的任何內容,您將首先謹慎地轉義HTML實體。否則,您會創建一個OWASP 2010-A2-Cross-Site Scripting(XSS)的清晰示例。
  • 順便說一下,通常最好是明確指定列(或聚合函數),而不是「SELECT *」。
+0

謝謝,我正在梳理這個清單。 – Ian 2012-02-23 03:15:10