SOP的含义(同源政策)

Posted

技术标签:

【中文标题】SOP的含义(同源政策)【英文标题】:Meaning of SOP (same origin policy) 【发布时间】:2011-04-16 13:56:21 【问题描述】:

SOP(Same Origin Policy)的真正含义是什么?

我知道这意味着来自一个来源的 javascript 代码无法访问来自另一个来源的 resources。但是“资源”这个词到底是什么意思呢?例如:

    Javascript 代码可以从其他站点访问图像。 Javascript 代码无法向另一方发出 ajax 请求。

但是当您使用 JSON 填充时,在完成填充脚本标记的加载后,第 3 方脚本将调用您指定的回调——一个站点的 Javascript 代码正在调用另一个站点的 Javascript 代码的方法。这是否违反 SOP?

【问题讨论】:

【参考方案1】:

有几种类型,但如果我们不指定:

SOP 是指一种机制,它控制 JavaScript 和其他脚本语言跨域访问 DOM 属性和方法的能力

Here您对不同类型的 SOP 有很好的描述。

【讨论】:

【参考方案2】:

同源策略主要是为了防止其他域的脚本在加载的域的上下文中执行 AJAX (XMLHTTP) 请求,并限制其他域的站点访问站点资源,如 cookie、本地存储等。它更像是为安全措施制定的标准规范,每个浏览器都有自己遵循规范的实施方式。

我所说的“阻止其他域的脚本执行 AJAX (XMLHTTP) 请求”是指不属于同一域的跨域请求。

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

现在让我们考虑一下它的安全含义:-

1.假设网站 site1.com 有一个 API 调用来更新密码。当用户输入所需数据时,会向后端发出 HTTP 调用,并使用 cookie 中包含的会话数据验证用户的真实性。

2) 话虽如此,如果攻击者创建了一个名为 site2 的站点并拥有一个 JavaScript 代码来对 site1 的更改密码端点进行 HTTP 调用。通过浏览器的默认行为,它会将它对 site1 的所有 cookie 数据附加到请求中,从而使 HTTP 调用成功,从而允许攻击者成功。

3) 为了能够缓解这种情况,浏览器实施了 SOP,它要求浏览器的 javascript 引擎阻止任何跨域的请求,例如从 site2 到 site1,除非指示允许这样做。

4) 现在,在这个具有微服务架构和多个子域的不断发展的现代世界中,这将是一个很大的问题。如果 API 响应使用诸如 Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Credentials 等标头说明,则浏览器支持跨域请求。

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) 现在是第二部分,即 Access-Control-Allow-Credentials。在选项调用的服务器响应中,如果服务器将 header 设置为 true 所有机密会话数据(如 Authorization 头),则将安全 cookie 添加到从 site2 到 site1 的跨域请求中。

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

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

为了能够防止此类攻击(CSRF 攻击),网站还实现了一个 csrf-token 以及一个随状态变化而变化的表单。即使攻击者以某种方式从站点 2 向站点 1 发出请求,该请求也不会通过,因为站点 1 的服务器会验证 csrf 令牌以及攻击者无法访问的请求。 如果源头存在,其他措施将添加基于源的验证。

JSONP 旨在通过回调允许这种机制。

抱歉这么长的回答,话题远不止于此。这只是我自己对它的理解,如果我哪里错了,请告诉我。

【讨论】:

【参考方案3】:

JSONP 通过向 DOM 动态添加脚本标签并使用远程 Web 服务的 JSON 数据作为参数调用预定义函数来绕过同源策略。该标签不受同源策略的约束,因此可以跨域请求内容。

就像您可以在不违反 SOP 的情况下在您的网站上使用 Google 版本的 jQuery 一样,您可以“包含”一个脚本标签,该标签在您从 Web 服务返回的数据上调用预定义函数。

【讨论】:

以上是关于SOP的含义(同源政策)的主要内容,如果未能解决你的问题,请参考以下文章

浏览器同源政策及其规避方法

浏览器同源政策及其规避方法

浏览器同源政策及其规避方法

浏览器同源政策及其规避方法

浏览器同源政策及其规避方法(转)

放宽同源政策