SOP的含义(同源政策)

时间:2010-09-24 02:39:43

标签: javascript jsonp same-origin-policy

SOP(同源政策)的真正含义是什么?

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

  1. Javascript代码可以访问其他网站的图片。
  2. Javascript代码无法向另一方发出ajax请求。
  3. 但是当您使用JSON填充时,在完成填充脚本标记的加载后,第三方脚本将调用您指定的回调 - 来自一个站点的Javascript代码正在调用另一个站点的Javascript代码方法。这会违反SOP吗?

3 个答案:

答案 0 :(得分:2)

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

  

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

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

答案 1 :(得分:1)

“相同来源策略”主要旨在防止其他域的脚本在已加载域的上下文中执行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的影响,该规范要求浏览器的javascript引擎阻止任何跨域请求(例如从site2到site1),除非得到指示允许这样做。

4)现在,在这个具有微服务架构和多个子域的不断发展的现代世界中,这将是非常有问题的。为了解决这个问题,如果API响应这样说明标头,则浏览器支持跨域请求,例如标头,如Access-Control-Allow-Origin,Access-Control-Allow-Methods,Access-Control-Allow-Credentials等。

5)要提出从站点2向站点1发出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-Credentials设置为true,则Access-Control-Allow-Origin标头为*时,浏览器SOP策略将启动并阻止其允许安全数据。

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

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

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

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

答案 2 :(得分:0)

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

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