如果使用正确,htmlspecialchars是否足以保护所有XSS?

时间:2013-10-25 07:53:18

标签: php html security xss

如果以下陈述属实,

  • 所有文档均附带HTTP标头Content-Type: text/html; charset=UTF-8
  • 所有HTML属性都包含在单引号或双引号中。
  • 文档中没有<script>个标记。

是否存在htmlspecialchars($input, ENT_QUOTES, 'UTF-8')(将&"'<>转换为相应的指定HTML实体的情况)在Web服务器上生成HTML时,是否足以防止跨站点脚本?

3 个答案:

答案 0 :(得分:16)

htmlspecialchars()足以阻止文档创建时HTML注入您声明的限制(即不注入标记内容/不带引号的属性)。

然而,还有其他类型的注射可以导致XSS和:

  

没有&lt; script&gt;文档中的标签。

这种情况并未涵盖JS注入的所有情况。例如,您可能具有事件处理程序属性(在HTML转义中需要JS转义):

<div onmouseover="alert('<?php echo htmlspecialchars($xss) ?>')"> // bad!

或更糟糕的是,javascript:link(在HTML转义中需要JS转义内部的URL转义):

<a href="javascript:alert('<?php echo htmlspecialchars($xss) ?>')"> // bad!

通常最好避免使用这些结构,尤其是在模板化时。写<?php echo htmlspecialchars(urlencode(json_encode($something))) ?>非常繁琐。

并且......注入问题也可能发生在客户端(DOM XSS);如果没有明确的转义,htmlspecialchars()将无法保护您免受JavaScript写入innerHTML(通常.html()在糟糕的jQuery脚本中)的错误。

而且...... XSS的原因不仅仅是注射。其他常见原因是:

  • 允许用户创建链接,而不检查已知良好的URL方案(javascript:是最知名的有害方案,但还有更多)

  • 故意允许用户直接或通过光标记方案(如bbcode,总是可利用)创建标记

  • 允许用户上传文件(可以通过各种方式重新解释为HTML或XML)

答案 1 :(得分:2)

假设您没有使用较旧的PHP版本(5.2左右),htmlspecialchars是“安全的”(并且当然考虑到@Royal Bg提到的后端代码)

在较旧的PHP版本中,UTF-8字符格式错误导致此功能易受攻击(http://www.securityfocus.com/bid/37389

我的2美分:只是通过告诉我们允许的内容来消毒/检查您的输入,而不是仅仅逃避一切/编码所有内容

即。如果有人必须输入电话号码,我可以想象允许以下字符:0123456789()+ - 。和一个空间,但所有其他人都被忽略/剥离

同样适用于地址等。在地址中为点/块/心等指定UTF-8字符的人必须患有精神疾病......

答案 2 :(得分:-6)

据我所知,是的。我无法想象它不会避免xss的情况。如果您想要完全安全,请使用strip_tags()