我正在尝试理解为什么在从服务器向客户端发送数据时只需执行XSS
时我需要使用HtlEncode
库?
例如,在 Stackoverflow.com - 编辑器中 - 所有要做的事情都是保存用户输入并使用html编码显示它。
这样 - 永远不会成为HTML标签 - 这将被执行。
我可能在这里错了 - 但是你能否反驳我的陈述,或者是否出类拔萃?
例如:
我知道IMG标记例如可以有onmouseover
,onload
用户可以执行恶意脚本,但 IMG不会在浏览器中运行事件作为IMG,因为它是<img>
而不是<img>
那么问题出在哪里?
答案 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'leary
标记中的特殊含义。如果您有兴趣,请在syntax highlighting上查看此帖子。