Javascript URL编码是否足以保护href属性免受XSS攻击?

Javascript URL编码是否足以保护href属性免受XSS攻击?,javascript,security,xss,Javascript,Security,Xss,根据,用户在href属性中的输入应“……除字母数字字符外,使用%HH转义格式转义ASCII值小于256的所有字符。” 我不明白这背后的道理。为什么URL编码不能完成这项工作?我花了几个小时试图创建一个URL字符串的攻击向量,它是动态生成并返回给用户的,对我来说,它看起来是一个非常坚固的防XSS攻击的保护。 我也已经研究了一段时间了,大多数人建议在使用HTML编码的同时使用URL编码。我完全明白为什么HTML编码是不够的,因为其他向量仍然可以使用,比如onclick=alert() 有人可以给我演

根据,用户在href属性中的输入应“……除字母数字字符外,使用%HH转义格式转义ASCII值小于256的所有字符。”

我不明白这背后的道理。为什么URL编码不能完成这项工作?我花了几个小时试图创建一个URL字符串的攻击向量,它是动态生成并返回给用户的,对我来说,它看起来是一个非常坚固的防XSS攻击的保护。 我也已经研究了一段时间了,大多数人建议在使用HTML编码的同时使用URL编码。我完全明白为什么HTML编码是不够的,因为其他向量仍然可以使用,比如
onclick=alert()


有人可以给我演示一个攻击向量的例子,它是用URL编码和HTML编码来编码的,它是由OWASP.ORG在规则5中提出的编码?

< P>不,如果有人注入<代码> JavaScript:警报(0)< /Cord>,它将工作。没有任何编码方法可以阻止这一点,您应该尝试阻止javascript URI方案以及所有其他允许XSS的URI方案,例如
数据:
blob:

建议不要将用户输入直接反映到链接中


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

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

…除字母数字字符外,用 ASCII值小于256,采用%HH转义格式

建议使用URL编码。但不是针对整个URL。上下文是指在将URL参数插入URL时,它们需要进行URL编码,以允许在值中使用例如
&
符号

不要用URL编码对完整的或相对的URL进行编码

这是整个URL的一个单独规则,一旦URL被编码,然后在插入html属性时,应用html编码

您不能将URL编码应用于完整的URL,因为它已经是URL编码的,再次编码将导致双重编码,从而损坏URL。例如,原始URL中的任何
%
符号都将是错误的


HTML编码是必需的,因为像符号这样的字符在URL中是有效字符,但在HTML中由于字符实体而具有不同的含义。URL可能包含类似HTML实体的字符串,但在插入HTML文档时不需要对其进行编码。

是否有换行绕过的示例?您的意思是,当单击链接时,包含
的页面将执行JavaScript吗?当我尝试时,它只是被视为一个相对的http链接。@cillian collins我似乎无法重现这一点,我有以下几点:%3抵消了XSS负载。我遗漏了什么?事实上,“:”正在进行百分比编码,这妨碍了有效负载的工作。如果您使用的是典型的浏览器,并通过GET请求发送有效负载,它有时会用百分比编码替换这些字符,这可能就是问题所在。至于fgb,您收到的问题与此完全相同。你从字面上理解了我的有效载荷,你没有将百分比编码字符粘贴到链接中,而是将它们粘贴到URL中,然后它们将在HTML中显示为回车符。如果您想创建它而不必创建一个脆弱的PHP应用程序,只需创建一个链接,并在有效载荷的中间丢弃一个返回。您也可以使用字符,例如
%09
,它应该适用于所有浏览器,甚至只适用于选项卡。