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

Alf*_*ton 17 html php security xss

如果以下陈述属实,

  • 所有文档都使用HTTP标头提供Content-Type: text/html; charset=UTF-8.
  • 所有HTML属性都包含在单引号或双引号中.
  • <script>文档中没有标记.

是否有任何情况下htmlspecialchars($input, ENT_QUOTES, 'UTF-8')(转换&,",',<,>对应的命名HTML实体)是不够的Web服务器上生成HTML时,为了防止跨站点脚本?

bob*_*nce 18

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

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

文档中没有<script>标记.

这种情况并不包括JS注射的所有情况.例如,您可能具有事件处理程序属性(在HTML转义中需要JS转义):

<div onmouseover="alert('<?php echo htmlspecialchars($xss) ?>')"> // bad!
Run Code Online (Sandbox Code Playgroud)

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

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

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

而且......注入问题也可能发生在客户端(DOM XSS); 在没有明确转义的情况下,htmlspecialchars()不会保护您免受JavaScript写入innerHTML(通常.html()在糟糕的jQuery脚本中).

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

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

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

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