使用 location.href
可以理解为包括两个方面:
- 在代码中传递、操纵并使用
location.href
的值来指导代码逻辑。
- 将某些东西分配给
location.href
,导致浏览器导航到不同的 URL。
第一种情况,使用该值可以被认为是安全的。 location.href
的值只不过是一个字符串。当然它是用户输入的一部分,因此您不希望将其传递给 eval
语句,但对所有其他形式的用户输入也是如此。实际上,location.href
的值始终是有效的 URL,因此可以对其内容进行某些假设。在这种意义上,您可以认为它比大多数形式的用户输入更加安全。只要您没有做出错误的假设。
第二个方面需要您小心谨慎。分配未经验证的值可能会导致开放重定向,可用于网络钓鱼,更糟糕的是,由于使用了 javascript:
和 vbscript:
URI,可能会引起 XSS 问题。
编辑: 根据要求,以下是有关分配给location.href
的问题的更详细说明:
假设您有一个由攻击者控制的变量
foo
。它的来源可以是任何东西,但查询字符串参数是一个很好的例子。当您将
foo
的值分配给
location.href
时,会发生什么?好吧,浏览器会尽力将该值解释为URI,然后将用户重定向到结果地址。在大多数情况下,这将触发页面加载;例如,如果
value
是
"https://www.google.com/"
,则会加载Google的首页。允许这种情况在没有用户交互的情况下发生被称为
开放式重定向,并且被认为是一种安全漏洞!
但是,有一些类型的URI不会触发页面加载。一个常见的例子是仅包含片段标识符的URI,例如
#quux
。将其分配给
location.href
将导致页面滚动到具有ID“quux”的元素,并且不执行任何其他操作。只要不对片段本身的值做出愚蠢的事情,片段URI就是安全的。
现在到有趣的部分:
javascript:
和
vbscript:
URI。这些是会伤害到您的URI。JavaScript和VBScript URI方案是非标准URI方案,可用于在当前打开的网页上下文中执行代码。听起来很糟糕吧?是的,应该是这样。考虑我们的攻击者控制变量
foo
:攻击者所要做的就是将一个脚本URI注入变量中,就可以对您的用户发动攻击。当您将其分配给
location.href
时,基本上相当于在脚本上调用
eval
。
JavaScript URI适用于所有现代浏览器,而VBScript仅适用于IE,并且需要以quirks模式呈现页面。
最后,还有一个有趣的URI方案需要考虑:data URI。Data URI是文件文字:作为URI编码的整个文件。它们可用于编码任何文件,包括HTML文档。而这些文档,像其他任何文档一样,都可以包含脚本。
大多数浏览器将每个data URI视为自己独特的来源。这意味着在data URI中包装的HTML文档中的脚本无法访问其他页面上的任何数据。除了Firefox。
Firefox对待数据URI与所有其他浏览器有所不同。在Firefox中,数据URI会继承打开它的任何文档的来源。这意味着任何脚本都可以访问引用文档中包含的数据。这就是XSS给您带来的问题。
window.location.href
是一个字符串。字符串本身并不危险,除非你对它进行一些潜在的危险操作(例如使用innerHTML
或eval
函数)。 - Niet the Dark Absol<script>alert('Haaaaax!');</script>
。 - Niet the Dark Absolhttp://stackoverflow.com/?no-really-you-think-this-is-safe
- Niet the Dark Absol