如果以下陈述为真,
- 所有文档都带有 HTTP 标头
Content-Type: text/html; charset=UTF-8
。 - 所有 HTML 属性都用单引号或双引号括起来。
- 文档中没有
<script>
标签。
在 Web 服务器上生成 HTML 时,是否有任何情况htmlspecialchars($input, ENT_QUOTES, 'UTF-8')
(将&
、"
、'
、<
、转换>
为相应的命名 HTML 实体)不足以防止跨站点脚本?
htmlspecialchars()
足以在您声明的限制下防止文档创建时 HTML 注入(即不注入标签内容/未引用的属性)。
但是,还有其他类型的注入可能导致 XSS,并且:
文档中没有 <script> 标记。
这种情况并不涵盖所有 JS 注入的情况。例如,您可能有一个事件处理程序属性(需要在 HTML 转义中进行 JS 转义):
<div onmouseover="alert('<?php echo htmlspecialchars($xss) ?>')"> // bad!
或者,更糟糕的是,一个 javascript: 链接(需要 JS-escaping inside URL-escaping inside HTML-escaping):
<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)
假设您没有使用较旧的 PHP 版本(5.2 左右),htmlspecialchars 是“安全的”(当然,正如@Royal Bg 提到的那样考虑后端代码)
在较旧的 PHP 版本中,格式错误的 UTF-8 字符使该函数易受攻击
我的 2 美分:总是通过告诉允许的内容来清理/检查您的输入,而不是仅仅转义所有内容/编码所有内容
即如果有人必须输入电话号码,我可以想象以下字符是允许的:0123456789()+-。和一个空间,但所有其他的都被忽略/剥离
同样适用于地址等。在其地址中为点/块/心等指定 UTF-8 字符的人必须患有精神病......
据我所知,是的。我无法想象它不能避免 xss 的情况。如果您想完全安全,请使用 strip_tags()