Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PDO Prepared语句允许执行javascript_Javascript_Php_Mysql_Pdo - Fatal编程技术网

PDO Prepared语句允许执行javascript

PDO Prepared语句允许执行javascript,javascript,php,mysql,pdo,Javascript,Php,Mysql,Pdo,我真的对PDO事先准备好的声明感到困惑。我按照php.net文档中的说明做了所有事情。当我将JavaScript插入数据库,然后查询数据库并在页面上输出结果时,它会向我提供数据库上的JavaScript警报 PDO是否保护用户数据免受此类攻击,或者我们是否必须自己进行清理和转义,或者我在这里遗漏了什么 <?php try { $db = new PDO('mysql:host=localhost;dbname=test', "root", ""); } ca

我真的对PDO事先准备好的声明感到困惑。我按照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);
?>

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

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

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

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

SQL注入和跨站点脚本始终是在web上暴露数据的前两大安全错误。请参阅OWASP十大关键安全风险列表:


请访问OWASP站点。有很多资源可以学习安全风险以及如何解决这些风险。而且是免费的

PDO不会消毒任何东西。如果您使用准备好的语句,它们提供了一种方法将数据放入不易受SQL注入攻击的SQL数据库中。您有责任防范所有其他漏洞。您应该使用
htmlspecialchars()
或其变体对数据进行编码以供输出。输出转义必须根据上下文进行(此处
htmlspecialchars()
在任何
echo
语句之前),并且它不是要处理的数据库接口域。我也喜欢这篇wikipedia文章~。这是一个更具体的PHP~