2014-10-22 50 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