PDO Prepared Statement 允许执行 javascript

Posted

技术标签:

【中文标题】PDO Prepared Statement 允许执行 javascript【英文标题】:PDO Prepared Statement allows javascript to be executed 【发布时间】:2014-12-17 10:32:17 【问题描述】:

我真的对 PDO Prepared Statement 感到困惑。我按照 php.net 文档中的说明做了所有事情。当我将 javascript 插入数据库,然后查询数据库并在页面上输出结果时,它给了我在数据库中的 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 = "example@gmail.com";
    $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);
?>

【问题讨论】:

PDO 不会清理任何东西。如果您使用准备好的语句,它们提供了一种将数据放入不易受到 SQL 注入攻击的 SQL 数据库的方法。您有责任防御所有其他漏洞。您应该使用htmlspecialchars() 或其一些变体来编码您的数据以供输出。 输出转义必须针对特定上下文进行(此处为htmlspecialchars(),在任何echo 语句之前),并且它不是要处理的数据库接口的域。 【参考方案1】:

当您使用准备好的语句并参数化您的 SQL 时,PDO 可以防止 SQL 注入攻击。

但是您正在描述一种称为跨站点脚本 (XSS) 的东西。这是一个完全不同的安全问题。它不依赖于 SQL 或数据库内容。您可以使用任何应用程序数据创建 XSS 漏洞,而不仅限于来自数据库的数据。 XSS 和 SQL 注入一样,对于所有程序员来说都很重要。

您可能已经看过关于如何在 PHP 中防止 SQL 注入的高评价文章:

How can I prevent SQL-injection in PHP?

但这里有一些关于 XSS 防御的好帖子:

What are the best practices for avoiding xss attacks in a PHP site How to prevent XSS with HTML/PHP? Will HTML Encoding prevent all kinds of XSS attacks?

SQL 注入和跨站点脚本一直是在网络上暴露数据的两大安全错误。请参阅 OWASP 十大关键安全风险列表:https://www.owasp.org/index.php/OWASP_Top_Ten_Project

让自己访问那个 OWASP 站点。那里有很多资源可以了解安全风险以及如何解决这些风险。而且是免费的!

【讨论】:

我也喜欢这篇***文章~en.wikipedia.org/wiki/Secure_input_and_output_handling。还有这个更具体的 PHP ~ lukeplant.me.uk/blog/posts/why-escape-on-input-is-a-bad-idea

以上是关于PDO Prepared Statement 允许执行 javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何在SELECT FROM PDO Prepared Statement中为搜索框设置多个搜索条件?

PDO Prepared Statement over ODBC Sybase“PARAM 数据流”错误

Laravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询

Prepared SQL Statement Syntax

PDO Prepared在单个查询中插入多行

使用 Prepared Statement 设置 LONG 数据类型