32 | 同源策略:为什么XMLHttpRequest不能跨域请求资源?
Web页面安全、浏览器网络安全、浏览器系统安全
- 打开一个银行站点,然后打开恶意站点,恶意站点可以有以下操作:
- 修改银行站点的CSSOM,DOM等信息
- 在银行站点内部插入JS脚本
- 劫持用户登录的用户名和密码
- 读取银行站点的Cookie,IndexDB等数据
- 将上述信息上传自家服务器,然后伪造交易记录或者转账请求等信息
- 同源:两个URL协议、域名、端口相同
- 浏览器默认两个相同源可以互相访问资源和操作DOM
- 主要表现在DOM,Web数据和网络三个层面
- DOM:同源策略限制了不同源的JS脚本对当前DOM对象读写操作,可以在第一个源中操作第二个页面的DOM
- 数据层面:同源策略限制了不同源站点读取当前站点的Cookie,IndexDB,不同源下依然无法通过
opener
获取相关数据内容 - 网络层 XMLHttpRequest等请求方式同源策略拒绝
- 安全和便利性的权衡
- CSP(Content Security Policy)内容安全策略
- 为解决XSS攻击引入,核心思想让服务器决定浏览器可以加载的资源,同时让服务器决定浏览器是否能执行内联JS代码,减少XSS攻击
- 经典攻击:XSS攻击, CSRF攻击
- 页面可以嵌入第三方资源
- 跨域资源共享和跨文档消息机制
- 跨域资源共享(CORS):可以让页面跨域访问控制,使跨域数据传输安全进行
- 页面不同源的情况下需要两个不同源DOM进行通信,浏览器引入跨文档消息机制。通过window.postMessage的JS API和不同源DOM进行通信
- 同源策略隔离不同源的DOM,页面数据和网络通信,确保网络的安全性,然而安全和便利性不可兼得,要绝对的安全必然会牺牲便利性,所以找到了一个平衡点进行权衡,二者共同做出让步,也就是页面安全策略的模型,如下特征
- 页面可以引用第三方资源,但是XSS安全问题也随之而来。所以在开放的基础上引入CSP内容安全策略。
- 使用XMLHttpRequest和Fetch等都无法直接进行跨域请求,所以在严格策略的基础上引入CORS(access-control-allow-origin: *最挫做法)引入跨站资源共享策略
- 不同源DOM无法进行操作,浏览器之后有引入了跨文档消息机制,通过window.postMessage等通信机制让文档进行通信