20

如果以下陈述为真,

  • 所有文档都带有 HTTP 标头Content-Type: text/html; charset=UTF-8
  • 所有 HTML 属性都用单引号或双引号括起来。
  • 文档中没有<script>标签。

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

4

3 回答 3

20

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)

于 2013-10-25T10:42:05.643 回答
2

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

在较旧的 PHP 版本中,格式错误的 UTF-8 字符使该函数易受攻击

我的 2 美分:总是通过告诉允许的内容来清理/检查您的输入,而不是仅仅转义所有内容/编码所有内容

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

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

于 2013-10-25T09:17:23.697 回答
-6

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

于 2013-10-25T07:57:18.050 回答