HTML XSS 不是URI 编码?

HTML instead of URI encoding in regard to XSS?

我正在将不受信任的数据插入到标记的 href 属性中。

基于 OWASP XSS Prevention Cheat Sheet,我应该在将不受信任的数据插入 href 属性之前对其进行 URI 编码。

但是在这种情况下 HTML 编码也能防止 XSS 吗?我知道这是一个 URI 上下文,因此我应该使用 URI 编码,但是在这种情况下,URI 编码比使用 HTML 编码有什么安全优势吗?

据我所知,在这两种情况下,浏览器都会正确呈现 link。

我假设这是 Rule #5:

URL Escape Before Inserting Untrusted Data into HTML URL Parameter Values

(不是规则 #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

假设这是管理员用户发出的后端请求。如果 johnsmith 未正确 URL 编码,那么恶意前端用户可能会输入他们的名字 john&salary=40000,这会使 URL 呈现为

?firstname=john&salary=40000&lastname=smith&salary=20000

并说后端应用程序在重复的情况下采用第一个参数值。用户已成功将工资翻倍。这种攻击被称为 .

因此,如果您将参数插入到 URL 中,然后将其插入到 HTML 文档中,从技术上讲,您需要 URL 对参数进行编码,然后 HTML 编码整个 URL。但是,如果您完全遵循 OWASP 的建议:

Except for alphanumeric characters, escape all characters with ASCII values less than 256 with the %HH escaping format.

这样可以保证不会输出对HTML有特殊意义的字符,所以可以跳过HTML编码部分,更简单。

示例 - 如果允许用户输入构建相对 link(到 http://server.com/),并且 javascript:alert(1) 由用户提供。

URL-编码:<a href="javascript%3Aalert%281%29">-Link会导致http://server.com/javascript%3Aalert%281%29

仅限实体编码:<a href="javascript&colon;alert;&lpar;1&rpar;"> - 点击导致 javascript 执行