首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直接使用window.location.href而不进行验证是否安全?

直接使用window.location.href而不进行验证是否安全?
EN

Stack Overflow用户
提问于 2014-06-06 09:21:34
回答 3查看 60.4K关注 0票数 27

在没有任何验证的情况下使用window.location.href安全吗?

例如:

代码语言:javascript
复制
<script>
    var value = window.location.href;
    alert(value);
</script>

从上面的例子来看,它是否容易受到跨站点脚本(XSS)攻击?如果是,那怎么做?攻击者如何将window.location.href的值修改为恶意内容?

编辑(第二种情况)

这是url : www.example.com?url=www.attack.com

假设我有一个getQueryString()函数,它将在没有验证的情况下返回值。

代码语言:javascript
复制
<script> 
    var value = getQueryString('url'); 
    window.location.href = value; 
</script>

同样的问题,它是否容易受到跨站点脚本(XSS)攻击?如果是,那怎么做?攻击者如何利用"window.location.href = value“来执行XSS?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-06 19:31:10

使用location.href可以理解为包括两件事:

  1. 通过在代码中传递location.href值、操作它并使用它来指导代码中的逻辑,从而使用它的值。
  2. 将某些内容分配给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/",则将加载谷歌的首页。允许这种情况在没有用户交互的情况下发生被称为开放重定向,并且被认为是一个安全漏洞!

但是,有些URI类型不会触发页面加载。这类URI的一个常见示例是只包含片段标识符(例如#quux )的示例。将其分配给location.href将导致页面滚动到ID为"quux“的元素,而不做任何其他操作。片段URI是安全的,只要您不对片段本身的值做任何愚蠢的事情。

接下来是有趣的部分:javascript:vbscript: URI。这些都会咬你。JavaScript和VBScript URI方案是非标准URI方案,可用于在当前打开的网页上下文中执行代码。听起来很糟糕,不是吗?嗯,应该是的。考虑我们的攻击者控制的变量foo:攻击者要对用户发起攻击,所要做的就是向变量中注入一个脚本URI。当您将它分配给location.href时,它基本上与调用脚本上的eval相同。

JavaScript URI在所有现代浏览器中都能工作,而VBScript只使用IE,并要求页面以古怪的模式呈现。

最后,还有一个更有趣的URI方案需要考虑:数据URI。数据URI是文件文本:整个文件编码为URI。它们可用于编码任何文件,包括HTML文档。这些文档,和其他文档一样,可以包含脚本。

大多数浏览器将每个数据URI视为自己唯一的原点。这意味着封装在数据URI中的HTML文档中的脚本不能访问其他页面上的任何数据。除了火狐。

Firefox对数据URI的处理与其他浏览器略有不同。在它中,数据URI继承了打开它的任何文档的起源。这意味着任何脚本都可以访问引用文档中包含的数据。这是XSS给你的。

票数 36
EN

Stack Overflow用户

发布于 2014-06-06 15:46:06

XSS在#1下是不可能的。

我能想到的最糟糕的情况是有人在社交工程中使用它(让我们说你的域名真的很受欢迎,就像Ebay或Amazon一样),攻击者所能做的就是制作一条信息,上面写着"Amazon/Ebay为你免费的东西,只需使用这个网址转到http://haxor.site“,然后发送给某人。

但是我仍然不觉得这很危险,因为编码消息的URL看起来会很混乱。

编辑:这是唯一的答案#1,因为当我回答这个问题时,没有"#2“

票数 1
EN

Stack Overflow用户

发布于 2018-12-10 07:36:47

代码语言:javascript
复制
var value = getQueryString('url'); 

window.location.href = encodeURI(value); 

我认为这是最简单的方法

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24078332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档