为什么对XMLHttpRequest使用相同的原始策略

问题描述 投票:30回答:1

为什么浏览器将相同的原始策略应用于XMLHttpRequest?对于开发人员而言,这确实很不方便,但实际上并不能阻止黑客。有一些解决方法,它们仍然可以包含来自外部来源的JavaScript(JSONP的强大功能)。

似乎在很大程度上是相互链接的网络中的一个过时的“功能”。

security jsonp javascript-security
1个回答
23
投票

因为XMLHttpRequest传递用户的身份验证令牌。如果用户使用基本身份验证或某些Cookie登录到example.com,然后访问了Attacker.com,则后者站点可以创建对example.com的XMLHttpRequest并获得对该用户的完全授权,并读取该用户可以访问的任何私有页面(然后转发给攻击者)。

由于在Web应用程序页面中放置秘密令牌是阻止简单的跨站点请求伪造攻击的方法,这意味着Attacker.com可以在example.com上执行用户可以在example.com上进行的任何页面上的操作,而无需他们的任何同意或互动。 。 Global XMLHttpRequest是全局跨站点脚本。

((即使您有未通过身份验证的XMLHttpRequest版本,也仍然存在问题。例如,攻击者可能向您的Intranet上的其他非公共计算机发出请求,并读取可以从其中下载的任何文件, <script>标签已经受到这种形式漏洞的有限形式的困扰,但是XMLHttpRequest的完全可读的响应将泄漏所有类型的文件,而不是一些可以将其解析为JavaScript。)


0
投票

Same Origin Policy主要旨在防止其他域的脚本在已加载域的上下文中执行AJAX(XMLHTTP)请求,并且还限制其他域的站点访问站点资源,例如Cookie,本地存储等。更像是针对安全措施制定的标准规范,每个浏览器都有遵循规范的实现方式。

通过说,阻止其他域的脚本执行AJAX(XMLHTTP)请求,我的意思是不属于同一域的跨域请求。

例如,domain.com和test.domain.com属于同一个域,而测试属于子域,而test.domain2.com属于完全不同的域。

现在让我们考虑它的安全隐患:-

1。假设我们的网站site1.com具有API调用来更新密码。当用户输入所需的数据时,将对后端进行HTTP调用,并使用cookie中包含的会话数据来验证用户的真实性。

2]现在这样说,如果攻击者创建了一个名为site2的站点,并且具有Javascript代码以对site1的更改密码端点进行HTTP调用。根据浏览器的默认行为,它将站点1拥有的所有cookie数据附加到请求,从而使HTTP调用成功,从而使攻击者能够成功。

3)为了减轻浏览器实施的SOP的影响,SOP指示浏览器的javascript引擎禁止任何跨域请求,例如从site2到site1的请求,除非得到指示允许这样做。4)现在,在这个具有微服务架构和多个子域的不断发展的现代世界中,这将是非常有问题的。为了解决这个问题,如果API响应中的标头这样,浏览器就支持跨域请求访问控制允许来源,访问控制允许方法,访问控制允许凭据等]

5)要提出从site2到site1的ajax请求时,浏览器会检查API响应标头,并允许该请求(如果响应中存在以下任何值):Access-Control-Allow-Origin:*或Access-Control-Allow-Origin:site2.com或Access-Control-Allow-Origin:*。site2.com(通配符输入)

6)话虽如此,这里仍然存在很大漏洞,即使sop策略阻止了该请求,这实际上也意味着浏览器阻止了site2访问以读取响应数据,这意味着该请求已向服务器发出。此方案仅适用于在不触发飞行前选项调用的特定条件下的一些请求。当进行选项调用时,浏览器将不允许基于选项调用中的标头响应通过请求。

7)现在第二部分是访问控制允许凭据。在服务器对选项调用的响应中,如果服务器将标头设置为true,则所有机密会话数据(如授权标头)均将安全cookie添加到从site2到site1的跨域请求中。]

注:-仅当Access-Control-Allow-Origin非常特定于域时才添加此标头,这意味着它不适用于标头中的*值。如果Access-Control-Allow-Origin标头为*,则如果Access-Control-Allow-Credentials设置为true,则浏览器SOP策略将启动并阻止其允许安全数据。

SOP原始策略不处理图像源,而包括外部脚本。为了能够利用对这些内容的控制,请通过内容安全策略(CSP)。使用它,您可以控制对外部站点的访问,包括图像,脚本,字体,样式等。您还可以像警告框一样阻止站点中的不安全内联评估,以防止某些XSS攻击。这是事实上的新标准,许多网站开始实施它。

为了能够防止此类攻击(CSRF攻击),网站还实现了csrf令牌以及随状态变化而变化的形式。即使攻击者以某种方式将请求从site2发送到site1,该请求也不会通过,因为site1的服务器会验证csrf令牌以及该请求,攻击者无法通过该令牌。如果存在来源标头,则其他措施将添加基于来源的验证。

不问您的问题,浏览器将sop用于ajax,以请求阻止跨域站点访问站点资源,例如cookie和本地存储。

很抱歉,回答这么长,主题远不止于此。这只是我自己的理解,如果我在任何地方出错,请让我知道。

© www.soinside.com 2019 - 2024. All rights reserved.