【发布时间】: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语句之前),并且它不是要处理的数据库接口的域。
标签: javascript php mysql pdo