在没有任何验证的情况下使用 window.location.href 是否安全?
例如:
<script>
var value = window.location.href;
alert(value);
</script>
从上面的例子来看,它是否容易受到跨站脚本(XSS)攻击? 如果是,那又如何呢?攻击者如何将window.location.href的值修改为恶意内容?
编辑(第二种情况)
这是网址:www.example.com?url=www.attack.com
假设我有一个 getQueryString() 函数,它会在未经验证的情况下返回值。
<script>
var value = getQueryString('url');
window.location.href = value;
</script>
同样的问题,是否易受跨站脚本(XSS)攻击? 如果是,那又如何呢?攻击者如何利用“window.location.href = value”来执行XSS?
最佳答案
使用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 的首页。允许这种情况在没有用户交互的情况下发生被称为 open redirect并被视为安全漏洞!
但是,有些类型的 URI 不会触发页面加载。这种 URI 的一个常见示例是只包含片段标识符的 URI,例如#quux
。将其分配给 location.href
会导致页面滚动到 ID 为“quux”的元素,并且什么都不做。只要您不对片段本身的值做任何愚蠢的事情,片段 URI 就是安全的。
然后是有趣的部分:javascript:
和 vbscript:
URI。这些是会咬你的。 JavaScript 和 VBScript URI 方案是非标准 URI 方案,可用于在当前打开的网页的上下文中执行代码。听起来很糟糕,不是吗?嗯,它应该。考虑我们的攻击者控制的变量 foo
:攻击者要对您的用户发起攻击,所要做的就是将脚本 URI 注入(inject)变量。当您将它分配给 location.href
时,它基本上与在脚本上调用 eval
相同。
JavaScript URI 适用于所有现代浏览器,而 VBScript 仅适用于 IE,并且要求页面以 quirks 模式呈现。
最后,还有一个更有趣的 URI 方案需要考虑:数据 URI。数据 URI 是文件文字:编码为 URI 的整个文件。它们可用于编码任何文件,包括 HTML 文档。与其他文档一样,这些文档可以包含脚本。
大多数浏览器将每个数据 URI 视为其自己唯一的 origin .这意味着包含在数据 URI 中的 HTML 文档中的脚本无法访问其他页面上的任何数据。除了在 Firefox 中。
Firefox 处理数据 URI 的方式与所有其他浏览器略有不同。在其中,数据 URI 继承打开它的任何文档的来源。这意味着任何脚本都可以访问引用文档中包含的数据。这就是适合您的 XSS。
关于javascript - 不验证直接使用window.location.href是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24078332/