URL编码足以使href属性足以防御XSS吗?

时间:2018-10-26 19:05:22

标签: javascript security xss

根据OWASP,用户在href属性中输入的内容应为“ ...除字母数字字符外,以%HH转义格式对所有ASCII值小于256的字符进行转义。”

我不理解其背后的原因。为什么URL编码无法完成这项工作?我花了数小时试图为动态生成并呈现给用户的URL字符串创建攻击向量,对我来说,这似乎是对XSS攻击的可靠保护。

我也已经研究了一段时间,大多数人建议将URL编码与HTML编码一起使用。我完全理解为什么HTML编码不足,因为仍然可以利用其他向量,例如onclick=alert()

有人可以给我展示一个攻击向量的例子,该向量被用来操纵带有URL编码,没有HTML编码或owasp.org在规则#5中建议的编码的href?

2 个答案:

答案 0 :(得分:1)

否,如果有人注入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和其他语言解释。

答案 1 :(得分:1)

编码取决于上下文。如果HTML文档中有URL,则需要URL编码和HTML编码,但时间不同。

  

...除了字母数字字符外,用   使用%HH转义格式的ASCII值小于256。

这建议使用URL编码。但不是整个URL。上下文是在将URL参数插入到URL中时进行的,它们需要进行URL编码,仅允许在值中使用&符号。

  

请勿使用URL编码对完整或相对URL进行编码!

这是整个URL的单独规则。对URL进行编码后,然后将其插入html属性中,然后应用html编码。

您无法将URL编码应用于完整的URL,因为它已被URL编码,再次对其进行编码将导致双重编码,从而破坏了URL。例如,原始网址中的任何%符号都是错误的。

需要HTML编码,因为与符号(&)一样,它们在URL中是有效字符,但由于字符实体,在HTML中具有不同的含义。 URL可能包含看起来像HTML实体但不需要在插入HTML文档时进行编码的字符串。