htmlspecialchars()和htmlspecialchars_decode()

时间:2014-01-09 20:25:10

标签: php

如果我需要输出像

这样的字符串
<div><a>Some link</a></div>

未从数据库中检索,是否需要使用

echo htmlspecialchars_decode(htmlspecialchars('<div><a>Some link</a></div>'));

或直接回复已经安全

echo '<div><a>Some link</a></div>';

防止XSS攻击?

我应该清理文本,在哪里。;:'“{} [] $%#@!^&amp; *() - _ + = |&lt;&gt;?〜允许,然后将其插入数据库? 我的意思是,我应该在将特殊字符插入数据库之前进行转换吗?

我正在使用PDO。

1 个答案:

答案 0 :(得分:2)

如果您对特殊字符进行编码然后立即对它们进行解码,那么您最终会回到最初的位置,因此它毫无意义。

如果您接受用户输入,将其存储在数据库中,将其从数据库中取出并将其回显到该页面,那么您很容易受到XSS攻击。

如果你想要防御它,那么:

  • 不允许用户编写HTML。在将数据插入页面之前,请对数据使用htmlspecialchars
  • 允许HTML,但是通过HTML解析器和白名单元素和属性运行它们既安全又可接受。

如果数据库中的HTML来自可靠来源(这意味着您必须对用户进行身份验证,防御CSRF攻击,并且信任该人不是恶意或白痴),那么您可以安全地输出它没有修改。

  

我的意思是,我应该在将特殊字符插入数据库之前对其进行转换吗?

一般来说,对于任何给定的格式,您应该在插入该格式之前立即转义该格式的数据。如果您需要以较晚的格式呈现相同的数据,它可以节省问题。

也就是说,在数据上运行白名单HTML解析器是一项相对昂贵的操作,因此您可能希望创建一个已清理的版本并将其存储在数据库中未清理的版本旁边。