3

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

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

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

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

4

3 回答 3

2

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

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

在这里,您可以很好地描述不同类型的 SOP。

于 2010-09-24T03:06:34.870 回答
1

同源策略主要是为了防止其他域的脚本在加载域的上下文中执行 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。在选项调用的服务器响应中,如果服务器将标头设置为 true 所有机密会话数据(如授权标头),则会将安全 cookie 添加到从站点 2 到站点 1 的跨域请求中。

注意:- 仅当 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 旨在通过回调允许这种机制。

抱歉这么长的答案,而且话题远不止于此。这只是我自己对它的理解,如果我在任何地方错了,请告诉我。

于 2020-02-11T17:42:23.783 回答
0

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

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

于 2012-08-27T20:52:32.103 回答