同源策略(SOP)
翻译
原文:https://portswigger.net/web-security/cors/same-origin-policy
- name: 翻译
desc: 原文:https://portswigger.net/web-security/cors/same-origin-policy
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 同源策略(SOP)
在本节中,我们将解释什么是同源策略(SOP)以及如何实现它。
# 1什么是同源策略?
同源策略是一种 Web 浏览器安全机制,旨在防止网站相互攻击。
同源策略对 一个源上的脚本 访问 另一个源的数据 进行了限制。源由 URI 协议、域名和端口号组成。例如,请考虑以下 URL:
http:/example/example.html
上述 URL 使用协议http
、域名normal-website.com
和端口号80
。下表显示了,如果上述 URL 中的内容试图访问其他来源,同源策略将如何应用:
访问的目标URL | 允许访问? |
---|---|
http://normal-website.com/example/ | Yes:相同的协议、域名和端口 |
http://normal-website.com/example2/ | Yes:相同的协议、域名和端口 |
https://normal-website.com/example/ | No:不同的协议和端口 |
http://en.normal-website.com/example/ | No:不同的域名 |
http://www.normal-website.com/example/ | No:不同的域名 |
http://normal-website.com:8080/example/ | No:不同的端口(Internet Explorer 将允许此访问,因为 IE 在应用同源策略时不考虑端口号。) |
# 2为什么需要同源策略?
当浏览器从一个源 向 另一个源发送 HTTP 请求时,与另一个域相关的任何 Cookie(包括身份验证会话Cookie)也会作为请求的一部分发送。这意味着,将在用户的会话中生成响应,并在其中包含特定于用户的任何相关数据。如果没有了同源策略,那么当你访问一个恶意网站时,它将能够从 Gmail 读取你的电子邮件,从 Facebook 读取你的私人消息等。
# 3同源策略是如何实现的?
同源策略通常会控制 JavaScript 代码对跨域加载内容的访问,但其一般允许跨域加载页面资源。例如,SOP 允许通过<img>
标签嵌入图像、通过<video>
标签嵌入媒体,JavaScript 包含在<script>
标签中。但是,虽然这些外部资源可以由页面加载,但页面上的任何 JavaScript 都无法读取这些资源的内容。
同源策略有多种例外情况:
- 某些对象是可写的,但不能跨域读取,例如
location
对象、iframe 标签中的location.href
属性、新窗口。 - 某些对象是可读的,但不能跨域写入,例如
window
对象的length
属性(存储当前页面的帧数)和closed
属性。 replace
函数通常可以在location
对象上调用跨域。- 你可以跨域调用某些函数。例如,你可以在新窗口上调用函数
close
、blur
和focus
。postMessage
函数也可以在 iframe 和新窗口上调用,以便将消息从一个域 发送到 另一个域。
由于旧版本的要求,同源策略在处理 Cookie 时更加宽松,因此,即使每个子域在技术上都是处于不同的来源,也可以从网站的所有子域访问这些 Cookie。你可以使用HttpOnly
cookie 标志来缓解部分此种风险。
你可以使用document.domain
来放宽同源策略。这个特殊的属性允许你放宽特定域的 SOP,但前提是当它为 FQDN(完全限定域名)的一部分时。例如,你可能有一个域marketing.example.com
,并且你希望在example.com
上读取该域的内容。为此,两个域都需要将document.domain
设置为example.com
。然后,SOP 将允许两个域之间的访问,尽管它们的来源不同。在过去,可以将document.domain
设置为诸如com
之类的 TLD,这允许在同一 TLD 上的任何域之间进行访问,但是现代浏览器阻止了这种情况。