为什么我可以使用Html-encode时需要XSS库?

时间:2014-04-17 05:17:27

标签: html security xss html-encode

我正在尝试理解为什么在从服务器向客户端发送数据时只需执行XSS时我需要使用HtlEncode库?

例如,在 Stackoverflow.com - 编辑器中 - 所有要做的事情都是保存用户输入并使用html编码显示它。

这样 - 永远不会成为HTML标签 - 这将被执行。

我可能在这里错了 - 但是你能否反驳我的陈述,或者是否出类拔萃?

例如:

我知道IMG标记例如可以有onmouseoveronload用户可以执行恶意脚本, IMG不会在浏览器中运行事件作为IMG,因为它是&lt;img&gt;而不是<img>

那么问题出在哪里?

2 个答案:

答案 0 :(得分:1)

HTML编码本身就是“XSS库”可能提供的一项功能。当平台没有本机HTML编码器(例如基于scriptlet的JSP)或本机HTML编码器不合适时(例如,不能在属性中使用转义引号,或者]]>如果您正在使用),这可能很有用XHTML,如果您担心跨源样式表包含攻击,则为@{}

对于其他情况,可能还有其他编码器,例如注入<script>块中的JavaScript字符串或href属性中的URL参数,这些不是由平台/模板语言直接提供的。

XSS库提供的另一个有用功能可能是HTML清理,因为当您希望允许用户以HTML格式输入数据时,可以限制他们使用哪些标签和属性到安全白名单。

XSS库可以提供的另一个不太有用的功能可能是自动扫描和过滤HTML特殊字符的输入。也许这是你反对的那种功能?当然,在输入阶段尝试处理HTML注入(输出阶段问题)是一种误导的方法,安全工具不应该鼓励。

答案 1 :(得分:1)

HTML编码只是使您的输出对XSS安全的一个方面。

例如,如果使用以下代码将字符串输出到JavaScript:

<script>
  var enteredName = '<%=EnteredNameVariableFromServer %>';
</script>

您将希望对变量进行十六进制实体编码,以便在JavaScript中正确插入,而不是HTML编码。假设EnteredNameVariableFromServer的值为O'leary,则正确编码后呈现的代码将变为:

<script>
  var enteredName = 'O\x27leary';
</script>

在这种情况下,这可以防止'字符突破字符串并进入JavaScript代码上下文,并且还可以确保对变量进行正确处理(HTML编码会导致文字值{{1在JavaScript中使用,影响值的处理和显示。)

旁注:

此外,Stack Overflow并不完全正确。某些字符仍具有O&#39;leary标记中的特殊含义。如果您有兴趣,请在syntax highlighting上查看此帖子。