首页 > 解决方案 > URL 编码是否足以用于 href 属性以防止 XSS?

问题描述

根据OWASP,用户输入到 href 属性应该“......除了字母数字字符,使用 %HH 转义格式转义所有 ASCII 值小于 256 的字符。”

我不明白这背后的理由。为什么 URL 编码不能完成这项工作?我花了几个小时尝试为动态生成并呈现给用户的 URL 字符串创建攻击向量,对我来说,这似乎是针对 XSS 攻击的非常可靠的保护。

我也一直在研究这个问题,大多数人都建议将 URL 编码与 HTML 编码一起使用。我完全明白为什么 HTML 编码不足,因为仍然可以使用其他向量,例如onclick=alert()

有人可以向我展示一个攻击向量的示例,该攻击向量用于操纵使用 URL 编码和没有 HTML 编码或 owasp.org 在规则 #5 中建议的编码呈现的 href?

标签: javascriptsecurityxss

解决方案


不,如果有人注射,javascript:alert(0)那么它会起作用。没有任何编码方法可以阻止这种情况,您应该尝试阻止 javascript URI 方案以及所有其他允许 XSS 存在的 URI 方案,data:例如blob:

建议的操作是不要将用户输入直接反映到链接中。

此外,重要的是要记住不要简单地使用诸如preg_replace换行符之类的东西来精确地阻止这些方案,因为它会绕过这个并产生 XSS 有效负载。比如:java%0a%0dscript:alert(0);。如您所见,在负载中间放置了一个 CRLF 字符,以防止 PHP(或其他服务器端语言)将其识别为javascript:您已阻止。但是 HTML 仍会将其呈现为javascript:alert(0);CRLF 字符是空格并被 HTML 忽略(在元素属性的值内),但由 PHP 和其他语言解释。


推荐阅读