同源策略SOP(Same Origin Policy)是一种网络安全策略,它限制了浏览器可以访问的内容和资源。它是在早期的网络浏览器中实施的一种安全机制,以防止恶意网站利用漏洞进行恶意行为。
1. 同源策略产生背景
当浏览器从一个域发送一个HTTP请求到另一个域时,与另一个域相关的任何cookies,包括身份验证会话cookie,也会作为请求的一部分发送。如果没有同源策略,如果你访问一个恶意网站,该网站将能够读取你的电子邮件、私人消息等。
2. 什么是同源策略
同源策略(Same Origin Policy,SOP)是浏览器的一种安全机制,旨在防止网站相互攻击。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问/操作另一个域的绝大部分属性和方法。
这种策略有助于保护用户数据的安全,防止恶意脚本或代码的执行。同时,它也限制了网页能够访问和操作的网络资源范围,有助于提高网页的性能和安全性。
同源策略限制一个源上的脚本访问另一个源的数据。一个源包括一个URI协议、域名和端口号。例如,考虑以下URL:
http://normal-website.com/example/example.html
这使用 http 协议、域名 normal-website.com 和端口号 80 。下表显示了如果上述URL中的内容试图访问其他来源,将如何应用同源策略:
URL | 是否允许访问? |
---|---|
http://normal-website.com/example/ | 是:相同的协议、域名和端口 |
http://normal-website.com/example2/ | 是:相同的协议、域名和端口 |
https://normal-website.com/example/ | 否:不同的协议和端口 |
http://en.normal-website.com/example/ | 否:不同的域名 |
http://www.normal-website.com/example/ | 否:不同的域名 |
http://normal-website.com:8080/example/ | 否:不同端口 |
同源策略的主要原则:来自相同域名的页面可以相互通信,但不同域名的页面之间则无法直接交互。这有助于保护用户免受跨站点脚本攻击(XSS)等攻击。「 典型安全漏洞系列 」01.跨站脚本攻击XSS详解
3. 同源策略的实施细节
同源策略通常控制JavaScript代码对跨域加载的内容的访问。通常允许跨域加载页面资源。例如,SOP允许通过 标签嵌入图像,通过 标签嵌入媒体,以及通过
3.1. 两个关键原则
同源策略主要基于两个关键原则:
- 源匹配是指一个页面只能与其自身的源(协议、主机/域名、端口)匹配。换句话说,如果两个页面来自不同的源(例如,来自不同的协议或主机/域名),那么这些页面就被视为来自不同的源。
- 同源检查是在源匹配的基础上进行的。当一个页面尝试访问其自身的资源(如JavaScript文件、图片等)时,浏览器会进行同源检查。如果两个页面来自相同的源,那么同源检查将允许页面的脚本访问这些资源。
3.2. 实现原理
策略实施的一种常见方式是"SOP"(Same-Origin Policy)或"SOPs"(Same-Origin Policies)。在SOP或SOPs中,实现原理主要涉及以下步骤:
检查请求的来源 :浏览器首先会检查请求的来源是否与当前页面的源匹配。
检查同源检查 :如果请求的来源与当前页面的源匹配,那么浏览器会进一步检查请求是否符合同源策略的其他要求,例如是否在同一域下(即协议、主机和端口都相同)。
执行同源操作:如果请求满足同源策略的所有要求,那么浏览器将允许执行相应的操作,如加载资源、执行脚本等。
值得注意的是,随着Web技术的发展,一些新的安全机制和技术已经出现,例如CORS(Cross-Origin Resource Sharing,跨域资源共享)协议和跨域通信(Cross-Origin Communication)等,它们在一定程度上对同源策略进行了扩展和改进。
关于CORS可以参阅「 典型安全漏洞系列 」10.跨域资源共享CORS漏洞详解
3.3. 例外情况
当然同源政策有多种例外情况:
- 有些对象是跨域可写的,但不可跨域读取,例如
iframes
或新窗口中的location
对象或location.href
属性。 - 有些对象是跨域可读但不可写的,例如
window
对象的length 属性
(用于存储页面上使用的帧数)和closed
属性。 replace
函数通常可以在location
对象上,也被称为跨域函数。- 可以跨域调用某些函数。例如,可以在新窗口上调用函数
close
、blur
和focus
。也可以在iframe和新窗口上调用postMessage
函数,以便将消息从一个域发送到另一个域。
由于传统要求,在处理cookie时,同源策略更为宽松,因此通常可以从网站的所有子域访问cookie,即使每个子域在技术上都是不同的来源。您可以使用 HttpOnly cookie标志部分降低此风险。
4. 参考
[1] https://portswigger.net/web-security/cors/same-origin-policy