我应该在所有输出上使用htmlentities()吗? (防止XSS攻击)

时间:2012-11-12 14:32:32

标签: php mysql security xss

  

可能重复:
  What are the best practices for avoiding xss attacks in a PHP site
  What are the common defenses against XSS?

我正在尝试创建一个PHP应用程序,我写得很安全并且有一个关于转义输出的问题。一旦我学会这样做会阻止SQL注入,我转而使用PDO准备好的语句,而且似乎另一种主要类型的攻击是XSS。我像这样为我的页面构建输出(假设变量包含数据库中的数据):

$output = '';

$output .= '
<div style="float: left; width: 800px;">
    <span>Name:</span><span> ' . $name . '</span>
    <span>Address:</span><span>' . $addr . '</span>
    <span>Time:</span><span>' . time() . '</span>
</div>';

$output .='[lots more html]';

所以,我的问题是,我应该在输出的数据库的每一段数据周围使用htmlentities()(一个典型的页面有数十个,有些可能是数百个来自数据库的变量输出)?

2 个答案:

答案 0 :(得分:3)

使用htmlentities()有两个好处:

  • XSS预防
  • 将特殊字符转换为正确的HTML实体,例如将版权字符转换为&copy;。在HTML内容中,您应该使用适当的HTML实体,而不是插入原始的特殊字符。

对于XSS预防,您可以使用htmlspecialchars()代替,但它只会将一些基本字符转换为HTML实体,即引号,&符号和小于/大于字符。

在回答您的问题时,您应该在输出任何可能包含用户输入或特殊字符的内容时使用htmlentities()

答案 1 :(得分:1)

htmlspecialchars()绰绰有余。 htmlentities用于不同用途,不会阻止XSS。