javascript - 不验证直接使用window.location.href是否安全

标签 javascript security xss href window.location

在没有任何验证的情况下使用 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可以理解为包括两件事:

  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/",将加载 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/

相关文章:

javascript - 这个用户试图破解什么,这可能吗?

javascript - 在 Safari、Chrome 和 Firefox 中使用 XMLHTTPRequest.send() 时遇到一些问题

asp.net - 在哪里可以找到或复制产生 HttpRequestValidationException 的代码

javascript - 用于 Controller 、模型和 View 的 Sails.js 嵌套文件夹

java - 如何消除 Java 安全警告

linux - 运行在 Docker 中的进程可以在没有 -v 选项的情况下访问容器外的数据吗?

java - Android 加密/解密 sqlite 数据库 100% 安全

xss - 在哪里可以找到详尽的 Web 攻击字符串列表

javascript - Element.getBoundingClientRect 何时保证更新/准确?

php - 使用ckeditor在页面上编辑多个div,然后将HTML保存到文件