我正在查询从表单获取的userInput文本的数据库,并将在HTML页面中显示该文本。为了防止XSS,我需要迭代结果并应用htmlspecialchars(),当然,我将更改fetchAll()更改为fetch()并在那里应用htmlspecialchars(),但是使用本机MySQL函数并包含它肯定会很好它在我的查询中。我搜索但找不到一个。有人存在吗?我能创造自己的吗?感谢
$sql ='SELECT userInput FROM table WHERE fk_id=123';
$stmt = db::db()->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
答案 0 :(得分:1)
这一切都取消了你要保存的数据。如果要保存数据直接显示在您的网站上,那么显然您需要htmlspecialchars()等等。 PDO通过使用预处理语句来废弃使用mysql_real_escape()等。
作为铁律,每个字符串都必须为其正确的目的地进行转义:HTML字符串经过HTML转义,MySQL字符串经过MySQL转义等。
编辑:
当你从数据库中取出它(或者以html的形式向用户显示任何内容)时,你再次将它转义为下一个(html)与htmlentities()等的地方,以保护你的用户免受XSS攻击攻击。
答案 1 :(得分:0)
6年后,我认为第一部分的答案仍然是“不,不存在” ...但是第二部分的答案是“是”:如果需要,您可以使用存储的MySQL创建自己的答案程序。
无论如何,处理跨站点脚本攻击情况的最佳方法可能是在将html存储到数据库之前删除所有脚本标签或内联脚本,无论是将其作为MySQL存储过程(tricky!)还是将其存储在数据库中。将html发送到数据库之前的脚本。
答案 2 :(得分:0)
UPDATE messages SET message = REPLACE(REPLACE(REPLACE(message,'&','&'),'<', '<'), '>', '>')
答案 3 :(得分:-2)
我的建议:使用对象。使用setter / getter创建自己的类,并定义它将如何存储/返回数据。
例如:
class UserRow{
public $id;
public $email;
protected $bio;
public function getBio(){
return htmlspecialchars($this->bio);
}
public function __set($property, $value){
$this->$property = $value;
}
public function __get($property){
$getter = 'get'.$property;
if(is_callable(array($this,$getter))){
return $this->$getter();
}else{
return $this->$property;
}
}
}
和
$stmt = $pdo->query("SELECT * FROM user");
$stmt->fetchAll(PDO::FETCH_CLASS, 'UserRow');
答案 4 :(得分:-2)
转义数据不应该在数据库中完成,而应该在PHP应用程序中完成。此外,它应始终在视图中完成,而不是模型。