location.href安全问题

时间:2015-05-27 18:21:05

标签: javascript html security

这是我的页面test.html:

<script type="text/javascript">
        document.write(location.href);
</script>

当我使用网址http://example.com/test.html?test=<script>alert('xss')</script>访问test.html时,我得到了这个输出:

http://example.com/test.html?test=%3Cscript%3Ealert(%27xss%27)%3C/script%3E

很明显,location.href不会像提到here那样返回一个URL字符串:

  

返回值:一个字符串,表示页面的整个URL,包括协议(如http://)

它返回URL的编码版本的字符串。

所以我的问题是:document.write(location.href);安全吗?恶意用户是否可以在其中放置XSS有效负载?

我们假设这不会打印到<script><a>或任何HTML标记中,因此您必须像我一样将标记传递到location.href。

编辑:我想我应该提到我是一名安全分析师。我试图利用它,所以我可以向我的客户证明这不是一个好的做法,但我找不到办法这样做。所以,不需要教我。

1 个答案:

答案 0 :(得分:0)

http://example.com/test.html?test=<script>alert('xss')</script>是无效的网址。浏览器的位置字段不仅限于有效的URL - 在解析输入URL时,它们几乎可以接受任何内容,包括路径中的无效字符,查询字符串和片段。发送到服务器的请求是已解析URL的序列化版本,并且 始终是有效URL,通过百分比编码在URL的相应​​部分中不合法存在的字符获得。​​

URL是一个抽象概念:location.href返回一个字符串,该字符串在语义上等同于用于将浏览器导航到该资源的字符串 - 它不一定是相同的字符串。直到最近,根据规范,唯一的要求是返回的字符串是URL的表示,不要求 可能的表示(并且有很多!)。

所有人都说,有些方案的解析方式不同。观察data:text/html,<script>alert(location.href);</script>生成的内容 - 至少在Firefox 38和Chrome 42中提供该确切字符串的提醒。我找不到任何可导航的HTTP / HTTPS网址,导致<输出{ {1}},但假设没有这样的网址是天真的。