代码之家  ›  专栏  ›  技术社区  ›  Imran Azad

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

  •  0
  • Imran Azad  · 技术社区  · 6 年前

    根据 OWASP

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

    我也已经研究了一段时间了,大多数人建议在使用HTML编码的同时使用URL编码。我完全明白为什么HTML编码不够,因为其他向量仍然可以使用,比如 onclick=alert()

    有人能给我举一个攻击向量的例子吗?这个攻击向量被用来操作一个使用URL编码而不使用HTML编码呈现的ref,或者是owasp.org在规则5中建议的编码?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Cillian Collins    6 年前

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

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

    此外,重要的是要记住不要简单地使用类似于 preg_replace 因为换行将绕过这个并产生一个XSS负载。这是: java%0a%0dscript:alert(0); javascript: 你已经阻止了。但HTML仍然会将其呈现为 javascript:alert(0); 因为CRLF字符是空白字符,被HTML忽略(在元素属性的值内),但是被PHP和其他语言解释。

        2
  •  1
  •   fgb    6 年前

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

    ASCII值小于256,转义格式为%HH。

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

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

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

    HTML编码是必需的,因为像与号这样的字符在URL中是有效的字符,但在HTML中由于字符实体而有不同的含义。URL可以包含看起来像HTML实体但在插入HTML文档时不需要编码的字符串。