htmlspecialchars相当于mysql

时间:2012-12-01 16:37:30

标签: php mysql escaping xss

我正在查询从表单获取的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);

5 个答案:

答案 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,'&','&amp;'),'<', '&lt;'), '>', '&gt;')

答案 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应用程序中完成。此外,它应始终在视图中完成,而不是模型。