htmlspecialchars vs htmlentities关注XSS

stu*_*php 28 php xss

我已经看到了很多相互矛盾的答案.很多人都喜欢引用单独的php函数不会保护你免受xss的攻击.

什么XSS确实可以通过htmlspecialchars和什么可以通过htmlentities?

我理解功能之间的区别,但不是你留下的不同级别的xss保护.谁能解释一下?

The*_*ith 13

htmlspecialchars()不会保护您免受UTF-7 XSS攻击,即使在IE 9中仍然困扰着Internet Explorer:http://securethoughts.com/2009/05/exploiting-ie8-utf-7-xss-vulnerability-using -本地重定向/

例如:

<?php
$_GET['password'] = 'asdf&ddddd"fancy?quotes?';

echo htmlspecialchars($_GET['password'], ENT_COMPAT | ENT_HTML401, 'UTF-8') . "\n";
// Output: asdf&amp;ddddd&quot;fancyË

echo htmlentities($_GET['password'], ENT_COMPAT | ENT_HTML401, 'UTF-8') . "\n";
// Output: asdf&amp;ddddd&quot;fancy&Euml;quotes
Run Code Online (Sandbox Code Playgroud)

您应该始终使用htmlentities,并且在清理用户输入时很少使用htmlspecialchars.另外,您应该始终删除标签.对于非常重要且安全的站点,您永远不应该信任strip_tags().使用HTMLPurifier for PHP.

  • 如果页面声明编码(它总是应该!),那么就没有UTF-7漏洞利用的风险.我强烈反对使用`strip_tags`.它会使一些合法的输入(`2 <4`,`<g>`)出错,但不会提高`htmlspecialchars` -cacaped数据的安全性. (10认同)
  • 如果您的页面/浏览器容易受到UTF-7问题的影响,那么`htmlentities`将不会比'htmlspecialchars`更能帮助您.它们都会将`<`和`>`的UTF-7编码作为"安全"的ASCII字符进行插入并传递它们.`strip_tags`也是一样的问题. (9认同)
  • @ TheodoreR.Smith:解决方案是始终将字符集参数传递给`htmlspecialchars`,并在页面上设置正确的字符集.如果浏览器忽略了正确的字符集,那么你无能为力...... (7认同)
  • @NikiC好的.请发布您的替代答案. (6认同)
  • 另请注意,您的示例不正确:[证明](http://3v4l.org/XYedd).您的确切代码在所有版本的PHP上产生相同的结果(一直回到4.3,但有缺少ENT_HTML401的注意事项). (3认同)
  • 为什么剥开标签? (2认同)
  • @ TheodoreR.Smith如果charset是英语,`htmlspecialchars`和`htmlentities`应该获得相同的结果.但如果某些角色是中国人,使用"htmlentities"将是一场噩梦. (2认同)

Sil*_*Fox 5

如果使用 PHP 的header命令设置字符集

header('Content-Type: text/html; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)

thenhtmlspecialchars并且htmlentities对于 HTML 的输出都应该是安全的,因为使用 UTF-7 编码无法实现XSS

请注意,这些函数不应用于将值输出到 JavaScript 或 CSS,因为输入的字符可能会使 JavaScript 或 CSS 被转义,从而使您的站点处于危险之中。请参阅XSS 预防备忘单,了解如何正确处理这些情况。