浏览器安全之同源策略

硅基生命体
• 阅读 3587

同源策略

同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能会受到影响.可以说Web是构建在同源策略的基础之上的,浏览器只是针对同源策略的一种实现.

浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性.影响"源"的因素有:协议,域名,端口号.
需要注意的是,对于当前页面来说,页面存放JavaScript文件的域并不重要,重要的是加载JavaScript页面所在的域是什么.

在浏览器中,<script>,<img>,<ifram>,<link>等标签都可以跨域加载资源,而不受同源策略的限制.这些带"src"属性的标签每次加载时,实际上是由浏览器发起了一次GET请求.不同于XMLHttpRequest的是,通过src属性加载的资源,浏览器限制了JavaScript的权限,使其不能读写返回的内容.

XMLHttpRequest受到同源策略的约束,不能跨域访问资源.如果XMLHttpRequest能够跨域访问资源,则可能会导致一些敏感数据泄露,比如CSRF的token,从而导致发生安全问题.

但是互联网是开放的,随着业务的发展,跨域请求的需求越来越迫切,因此W3C委员会制定了XMLHttpRequest跨域访问标准.它需要通过目标域返回的HTTP头来授权是否允许跨域访问,因为HTTP头对于JavaScript来说一般是无法控制的.

对于浏览器来说,除了DOM,Cookie,XMLHttpRequest会受到同源策略的限制外,浏览器加载的一些第三方插件也有各自的同源策略.最常见的一些插件如Flash,Java Applet等都有自己的控制策略.以Flash为例,它主要通过目标网站提供的crossdomain.xml文件判断是否允许当前
"源"的Flash跨域访问目标资源.

然而浏览器的同源策略也并非坚不可摧,由于实现上的一些问题,一些浏览器的同源策略也曾经被多次绕过.比如下面这个IE8的CSS跨域漏洞.

www.a.com/test.html

<body>
{} body {font-family:
aaaaaaaaaaaa
bbbbbbbbbbb

</body>

www.b.com/test2.html

<style>
@import url("http://www.a.com/test.html")
</style>
<script>
setTimeout(function() {
  var t = document.body.currentStyle.fontFamily;
  alert(t);
},2000);

在"www.b.com/test2.html"汇总通过@import加载了"http://www.a.com/test.html"为CSS文件,渲染进入当前页面DOM,同时通过"document.body.currentStyle.fontFamily"访问内容.问题发生在IE的CSS PARSE的过程中,IE将fontFamily后面的内容当做了value,从而可以读取"www.a.com/test.html"的页面内容.

点赞
收藏
评论区
推荐文章
室与 室与
4年前
Cors跨域解决
一、浏览器跨域问题产生1、跨源资源共享(CORS)中文文档:https://developer.mozilla.org/zhCN/docs/Web/HTTP/Access_control_CORS2、什么是浏览器跨域问题指的是浏览器不能执行其他网站的脚本。JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象,即同源策略。就好比我
徐小夕 徐小夕
4年前
当遇到跨域开发时, 我们如何处理好前后端配置和请求库封装(koa/axios版)
我们知道很多大型项目都或多或少的采用跨域的模式开发,以达到服务和资源的解耦和高效利用.在大前端盛行的今天更为如此,前端工程师可以通过nodejs或者Nginx轻松搭建起web服务器.这个时候我们只需要请求后端服务器的接口即可实现系统的业务功能开发.这个过程中会涉及到web页面向API服务器的跨域访问(由于受到浏览器的同源策略,但是业界已有很多解决方案,
芝士年糕 芝士年糕
2年前
什么是跨域
域: 是指浏览器不能执行其他网站的脚本跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol,主机 host 和端口号 port 则就会造成 
kenx kenx
4年前
SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑
前言最近在做项目的时候,基于前后端分离的权限管理系统,后台使用SpringSecurity作为权限控制管理,然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用SpringSecurity时候单独配置,SpringBoot跨越还不行,还需要配置Security跨域才行。什么是跨域跨域是一种浏览器同源安全策略,即浏
专注IP定位 专注IP定位
3年前
浅析九种跨域方式实现原理
我们在解决一个问题的时候应该先去了解这个问题是如何产生的,为什么会有跨域的存在呢?其实,最终的罪魁祸首都是浏览器的同源策略,浏览器的同源策略限制我们只能在相同的协议、IP地址、端口号相同,如果有任何一个不通,都不能相互的获取数据。并且,http和https之间也存在跨域,因为https一般采用的是443端口,http采用的是80端口或者其他。同源策略是一种约
Stella981 Stella981
3年前
Https请求的页面中无法使用http访问
今天遇到一个问题,使用https访问的页面,其间发起http的ajax的请求都被浏览器拒绝,必须为https,否则无法请求,导致页面局部未初始化。浏览器报错Thisrequesthasbeenblocked;thecontentmustbeservedoverHTTPS.百度了下,了解到同源策略。所谓“同源”指的是:协议相同、域名相
Stella981 Stella981
3年前
Js中的跨域问题
一、什么是跨域?1.定义:跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com页面去请求www.google.com的资源。但是一般情况下不能这么做,它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。跨域的严格一点的定义是:只要协议,域名,端口有任何一
Stella981 Stella981
3年前
Django自身安全机制
XSS攻击什么是XSS攻击XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(https://www.oschina.net/action/GoT
Stella981 Stella981
3年前
35道面向初中级前端的基础面试题
如需获取完整版229页PDF面试题,请直接滑到文末。1\.什么是同源策略?同源策略可防止JavaScript发起跨域请求。源被定义为协议、主机名和端口号的组合。此策略可防止页面上的恶意脚本通过该页面的文档对象模型,访问另一个网页上的敏感数据。参考资料:浏览器的同源策略(https://www.oschina.
liam liam
1年前
解决 Axios 跨域阻碍,提高前端接口访问效率
跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用XMLHttpRequest和Fetch请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对施加的安全限制。Axios跨域常见报错跨域请求被阻止(CrossOriginRe
ZOS对象存储跨域资源访问的实现和使用
跨域指的是从一个域名去请求另外一个域名的资源,即跨域名请求。跨域时,浏览器不能执行其他域名网站的脚本,这是由浏览器的同源策略造成的,是浏览器施加的安全限制。同源策略是一种约定,是浏览器最核心也最基本的安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这是一个用于隔离潜在恶意文件的重要安全机制。
硅基生命体
硅基生命体
Lv1
春风十里扬州路,卷上珠帘总不如。
文章
4
粉丝
0
获赞
0