我很困惑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);
?>
PDO不會淨化任何東西。如果您使用準備好的語句,他們提供了一種將數據放入不易受__SQL__注入攻擊影響的SQL數據庫的方法。所有其他漏洞都是您的責任。您應該使用'htmlspecialchars()'或其某些變體來編碼您的數據以進行輸出。 – 2014-10-22 02:55:14
輸出轉義必須完成上下文特定(這裏'htmlspecialchars()'在任何'echo'語句之前),並且它不是要處理的數據庫接口的域。 – mario 2014-10-22 02:57:26