【发布时间】:2015-08-20 15:28:08
【问题描述】:
我正在将不受信任的数据插入到标签的 href 属性中。
根据 OWASP XSS 预防备忘单,我应该在将不受信任的数据插入 href 属性之前对其进行 URI 编码。
但是在这种情况下,HTML 编码是否也会阻止 XSS?我知道这是一个 URI 上下文,因此我应该使用 URI 编码,但是在这种情况下,URI 编码是否比使用 HTML 编码有任何安全优势?
据我所知,浏览器会在这两种情况下正确呈现链接。
【问题讨论】:
我正在将不受信任的数据插入到标签的 href 属性中。
根据 OWASP XSS 预防备忘单,我应该在将不受信任的数据插入 href 属性之前对其进行 URI 编码。
但是在这种情况下,HTML 编码是否也会阻止 XSS?我知道这是一个 URI 上下文,因此我应该使用 URI 编码,但是在这种情况下,URI 编码是否比使用 HTML 编码有任何安全优势?
据我所知,浏览器会在这两种情况下正确呈现链接。
【问题讨论】:
我假设这是Rule #5:
在 HTML URL 参数中插入不受信任的数据之前的 URL 转义 价值观
(不是第 35 条规则。)
这是指单个参数值:
<a href="http://www.example.com?test=...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...">link</a >
URL 和 HTML 编码可以防止不同的东西。
URL 编码可防止参数脱离 URL 参数上下文:
例如?firstname=john&lastname=smith&salary=20000
假设这是管理员用户发出的后端请求。如果 john 和 smith 的 URL 编码不正确,则恶意前端用户可能会输入他们的名称为 john&salary=40000,这会将 URL 呈现为
?firstname=john&salary=40000&lastname=smith&salary=20000
并说后端应用程序在重复的情况下采用第一个参数值。用户的工资成功翻了一番。这种攻击被称为HTTP Parameter Pollution。
因此,如果您将参数插入到 URL 中,然后插入到 HTML 文档中,则从技术上讲,您需要对参数进行 URL 编码,然后对整个 URL 进行 HTML 编码。但是,如果您不遗余力地遵循 OWASP 的建议:
除字母数字字符外,所有字符都用 ASCII 转义 使用 %HH 转义格式的小于 256 的值。
那么这将确保不会输出对HTML具有特殊含义的字符,因此您可以跳过HTML编码部分,使其更简单。
【讨论】:
示例 - 如果允许用户输入建立相对链接(到 http://server.com/),并且 javascript:alert(1) 由用户提供。
URL 编码:<a href="javascript%3Aalert%281%29"> - 链接将指向http://server.com/javascript%3Aalert%281%29
仅实体编码:<a href="javascript&colon;alert;&lpar;1&rpar;"> - 点击导致 javascript 执行
【讨论】: