浏览器中的同源策略

简介: 【1月更文挑战第2天】

如果两个 URL 的协议、域名和端口都相同,我们就称这两个 URL 同源。比如下面这两个 URL,它们具有相同的协议 HTTPS、相同的域名www.baidu.com,以及相同的端口 443,所以我们就说这两个 URL 是同源的。

https://www.baidu.com/?category=1
https://www.baidu.com/?category=0

浏览器默认两个相同的源之间是可以相互访问资源和操作 DOM 的。两个不同的源之间若想要相互访问资源或者操作 DOM,那么会有一套基础的安全策略的制约,我们把这称为同源策略。

同源策略主要表现在 DOM、Web 数据和网络这三个层面。

第一个,DOM 层面。同源策略限制了来自不同源的 JavaScript 脚本对当前 DOM 对象读和写的操作。

第二个,数据层面。同源策略限制了不同源的站点读取当前站点的 Cookie、IndexDB、LocalStorage 等数据。由于同源策略,我们依然无法通过第二个页面的 opener 来访问第一个页面中的 Cookie、IndexDB 或者 LocalStorage 等内容。

第三个,网络层面。同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。

Web 世界是开放的,可以接入任何资源,而同源策略要让一个页面的所有资源都来自于同一个源,也就是要将该页面的所有 HTML 文件、JavaScript 文件、CSS 文件、图片等资源都部署在同一台服务器上,这无疑违背了 Web 的初衷,也带来了诸多限制。比如将不同的资源部署到不同的 CDN 上时,CDN 上的资源就部署在另外一个域名上,因此我们就需要同源策略对页面的引用资源开一个“口子”,让其任意引用外部文件。

所以最初的浏览器都是支持外部引用资源文件的,不过这也带来了很多问题。之前在开发浏览器的时候,遇到最多的一个问题是浏览器的首页内容会被一些恶意程序劫持,劫持的途径很多,其中最常见的是恶意程序通过各种途径往 HTML 文件中插入恶意脚本。

除此之外,它还能将页面的的敏感数据,如 Cookie、IndexDB、LoacalStorage 等数据通过 XSS 的手段发送给服务器。具体来讲就是,当你不小心点击了页面中的一个恶意链接时,恶意 JavaScript 代码可以读取页面数据并将其发送给服务器。

为了解决 XSS ,浏览器中引入了内容安全策略,称为 CSP。CSP 的核心思想是让服务器决定浏览器能够加载哪些资源,让服务器决定浏览器是否能够执行内联 JavaScript 代码。通过这些手段就可以大大减少 XSS 。

如果两个页面不是同源的,则无法相互操纵 DOM。不过在实际应用中,经常需要两个不同源的 DOM 之间进行通信,于是浏览器中又引入了跨文档消息机制,可以通过 window.postMessage 的 JavaScript 接口来和不同源的 DOM 进行通信。

同源策略会隔离不同源的 DOM、页面数据和网络通信,进而实现 Web 页面的安全性。

  1. 页面中可以引用第三方资源,不过这也暴露了很多诸如 XSS 的安全问题,因此又在这种开放的基础之上引入了 CSP 来限制其自由程度。
  2. 使用 XMLHttpRequest 和 Fetch 都是无法直接进行跨域请求的,因此浏览器又在这种严格策略的基础之上引入了跨域资源共享策略,让其可以安全地进行跨域操作。
  3. 两个不同源的 DOM 是不能相互操纵的,因此,浏览器中又实现了跨文档消息机制,让其可以比较安全地通信。


相关文章
|
13天前
|
JavaScript 前端开发 安全
JavaScript DOM 操作:解释一下浏览器的同源策略。
**同源策略**是浏览器安全基石,它阻止脚本跨不同协议、域名或端口访问资源,防止恶意行为。例如,HTTP页面无法直接用JS获取HTTPS页面内容。**CORS**允许跨域请求,但需服务器配合设置,通过`document.domain`属性可配置,但仍受限于服务器配置。
14 4
|
7月前
|
JavaScript 安全 前端开发
浏览器基础原理-安全: 同源策略
浏览器基础原理-安全: 同源策略
36 0
|
9月前
|
JSON 前端开发 JavaScript
什么是浏览器同源策略?如何处理同源策略带来的跨域问题?
什么是浏览器同源策略?如何处理同源策略带来的跨域问题?
115 0
|
9月前
|
存储 JSON 安全
浏览器安全之同源策略
浏览器-安全策略
81 0
|
11月前
|
前端开发 Python
Python 使用CORS跨域资源共享解决flask服务器跨域问题、浏览器同源策略
Python 使用CORS跨域资源共享解决flask服务器跨域问题、浏览器同源策略
335 0
|
JavaScript 安全 前端开发
浏览器原理 31 # 同源策略:为什么XMLHttpRequest不能跨域请求资源?
浏览器原理 31 # 同源策略:为什么XMLHttpRequest不能跨域请求资源?
93 0
浏览器原理 31 # 同源策略:为什么XMLHttpRequest不能跨域请求资源?
|
存储 Web App开发 前端开发
浏览器同源策略问题 - Cookie访问限制
对应cookie来说,浏览器的同源策略将会限制不同源间的访问,对于跨站和跨域来说对访问cookie的影响也是不同的。同站请求,对于使用HTTPS协议的API,浏览器会存储cookie,不论`samesite`的值;对于使用HTTP协议的API,浏览器会存储`samesite`的值为`Lax`和`Strict`的cookie。跨站请求,对于HTTPS协议的API返回的cookie,如果设置了属性:`secure; samesite=none`,则浏览器会存储cookie,XHR请求也会带上目标域的cookie。
450 0
|
JavaScript 安全 前端开发
浏览器的同源策略
浏览器的同源策略
141 0
浏览器的同源策略
|
安全 前端开发 网络安全
图解浏览器安全(同源策略、XSS、CSRF、跨域、HTTPS、安全沙箱等串成糖葫芦)
图解浏览器安全(同源策略、XSS、CSRF、跨域、HTTPS、安全沙箱等串成糖葫芦)
图解浏览器安全(同源策略、XSS、CSRF、跨域、HTTPS、安全沙箱等串成糖葫芦)
|
JavaScript 前端开发 中间件
前端人员都懂的浏览器的同源策略,以及如何进行不同源间的相互访问
作为前端开发人员,你要是连同源策略都不知道是什么,那就太说不过去了。本篇文章将讲述同源策略的定义, 以及当我们需要克服同源策略,如何进行跨域访问数据的方法。
238 0
前端人员都懂的浏览器的同源策略,以及如何进行不同源间的相互访问

热门文章

最新文章