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

Nat*_*ate 5 php mysql security xss

可能重复:
在 PHP 站点中避免 xss 攻击的最佳实践是什么
? 针对 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]';
Run Code Online (Sandbox Code Playgroud)

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

MrC*_*ode 4

使用有两个好处htmlentities()

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

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

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