2014-10-22 86 views
1

我很困惑PDO準備好聲明。我做了一切,就像它在php.net文檔中所說的那樣。當我將JavaScript插入到數據庫中,然後查詢數據庫並在頁面上輸出結果時,它向我發送了數據庫上的JavaScript警報。PDO Prepared Statement允許執行JavaScript

是否PDO保護用戶數據免受此類攻擊,或者我們必須自己進行消毒和轉義,還是在這裏丟失了某些東西。

<?php 
    try { 
     $db = new PDO('mysql:host=localhost;dbname=test', "root", ""); 
    } catch (PDOException $e) { 
     print "Error!: " . $e->getMessage() . "<br/>"; 
     die(); 
    } 

    $query = $db->query('SELECT * from users'); 
    if($query->rowCount()){ 
     $rows = $query->fetchAll(PDO::FETCH_OBJ); 
     foreach($rows as $row){ 
      echo $row->user_name; 
      echo "<br/>"; 
     } 
    } else { 
     echo "No results found"; 
    } 

    $user_name = "<script type=\"text/javascript\">alert(\"Works\");</script>"; 
    $user_email = "[email protected]"; 
    $user_password = "password"; 
    $user_status = "1"; 

    $data = array(
     ":user_name" => $user_name, 
     ":user_email" => $user_email, 
     ":user_password" => $user_password, 
     ":user_status" => $user_status 
    ); 
    $sql = "INSERT INTO users (user_name, user_email, user_password, user_status) VALUES(:user_name, :user_email, :user_password, :user_status)"; 
    $prepare = $db->prepare($sql); 
    $exec = $prepare->execute($data); 
?> 
+5

PDO不會淨化任何東西。如果您使用準備好的語句,他們提供了一種將數據放入不易受__SQL__注入攻擊影響的SQL數據庫的方法。所有其他漏洞都是您的責任。您應該使用'htmlspecialchars()'或其某些變體來編碼您的數據以進行輸出。 – 2014-10-22 02:55:14

+2

輸出轉義必須完成上下文特定(這裏'htmlspecialchars()'在任何'echo'語句之前),並且它不是要處理的數據庫接口的域。 – mario 2014-10-22 02:57:26

回答

3

當您使用準備好的語句並參數化您的SQL時,PDO可以防範SQL注入攻擊。

但是你正在描述一種叫做跨站腳本(Cross-Site Scripting,XSS)的東西。這是完全不同的安全問題。它不依賴於SQL或數據庫內容。您可以使用任何應用程序數據創建XSS漏洞,而不限於數據庫中出現的數據。像SQL注入一樣,XSS對所有程序員都很重要。

,你可能看到有關如何防止SQL注入在PHP中高度評價後:

但這裏是關於XSS防禦一些好的帖子:

SQL注入和跨站腳本一貫在暴露在網絡上的數據前兩名的安全錯誤。查看OWASP十大關鍵安全風險列表:https://www.owasp.org/index.php/OWASP_Top_Ten_Project

讓自己進入OWASP站點。有很多資源需要了解安全風險以及如何解決它們。它是免費的!

+0

好的寫作法案。 – 2014-10-22 03:15:44

+0

我也喜歡這個維基百科文章〜http://en.wikipedia.org/wiki/Secure_input_and_output_handling。而這更多的PHP特定的一個〜http://lukeplant.me.uk/blog/posts/why-escape-on-input-is-a-bad-idea/ – Phil 2014-10-22 03:21:20