Browser Security-同源策略、伪URL的域
同源策略
同源策略的文档模型
同源策略(Same Origin policy,SOP),也称为单源策略(Single Origin policy),它是一种用于Web浏览器编程语言(如JavaScript和Ajax)的安全措施,以保护信息的保密性和完整性。
同源策略能阻止网站脚本访问其他站点使用的脚本,同时也阻止它与其他站点脚本交互。
| 原始资源 | 要访问的资源 | 非IE浏览器 | IE浏览器 |
|---|---|---|---|
| http://example.com/a/ | http://example.com/b/ | 可以访问 | 可以访问 |
| http://example.com/ | http://www.example.com/ | 主机不匹配 | 主机不匹配 |
| http://example.com/a/ | https://example.com/a/ | 协议不匹配 | 协议不匹配 |
| http://example.com:81/ | http://example.com/ | 端口不匹配 | 可以访问 |
同源策略一开始是为了管理DOM之间的访问,后来逐渐扩展到Javascript对象,但并非是全部。
例如非同源的脚本之间可以调用location.assign()和location.replace()。
同源策略在提高了安全性,但同时也降低了灵活性。
例如很难将login.example.com与payments.example.com两个域之间的数据可以方便的传送。
介绍两种解决方式:document.domain和postMessage()。
javascript允许子域之间使用顶级域名。
例如login.example.com和payments.example.com都可以进行如下设置:
document.domain="example.com"
设置这个属性之后,子域之间可以方便的通信,需注意的是协议和端口号必须相同。
| 原始资源 | 访问的资源 | 结果 | ||
| URL | document.domain | URL | document.domain | |
| http://www.example.com/ | example.com | http://payments.example.com/ | example.com | 可以访问 |
| http://www.example.com/ | example.com | https://payments.example.com/ | example.com | 协议不匹配 |
| http://payments.example.com | example.com | http://example.com/ | (不设置) | 拒绝访问 |
| http://www.example.com/ | (不设置) | http://www.example.com | example.com | 拒绝访问 |
postMessage()是HTML5的一个API接口,由于比较新,所以在IE6和IE7中不支持。 1 向另外一个iframe发送消息:
var message = "Hello" + (new Date().getTime());
window.parent.frames[1].postMessage(message, "*");
iframe1.html需要向iframe2.html发送消息,也就是第二个iframe,所以是window.parent.frames[1]。
如果是向父页面发送消息就是window.parent。
postMessage这个函数接收二个参数,缺一不可,第一个参数即你要发送的数据。
第二个参数是非常重要,主要是出于安全的考虑,一般填写允许通信的域名。
这里为了简化,所以使用’*",即不对访问的域进行判断。
2 另外一个iframe监听消息事件:
iframe2.html中写个监听message事件,当有消息传到iframe2.html时就会触发这个事件。
var onmessage = function(e) {
var data = e.data,p = document.createElement("p");
p.innerHTML = data;
document.getElementById("display").appendChild(p);
};
//监听postMessage消息事件
if (typeof window.addEventListener != "undefined") {
window.addEventListener("message", onmessage, false);
} else if (typeof window.attachEvent != "undefined") {
window.attachEvent("onmessage", onmessage);
}
如果你有加域名限,比如下面的代码:
window.parent.frames[1].postMessage(message, "http://www.test.com");
就要在onmessage中追加个判断:
if(event.origin !== "http://www.test.com") return;
XMLHttpRequest的同源策略
一个简单的同步XMLHttpRequest请求:
var x = new XMLHttpRequest();
x.open("POST", "/some_script.cgi", false);
x.setRequestHeader("X-Random-Header", "Hi mom!");
x.send("...POST payload here...");
alert(x.responseText);
XMLHttpRequest请求严格遵守同源策略,非同源不可以请求。
这个API也做过很多测试与改进,下面列出之前的测试方法:
var x = new XMLHttpRequest();
x.open("POST", "http://www.example.com/", false);
// 定义发送内容长度为7
x.setRequestHeader("Content-Length", "7");
// 构造的http请求。
x.send(
"Gotcha!\n" +
"GET /evil_response.html HTTP/1.1\n" +
"Host: www.bunnyoutlet.com\n\n"
);
现在的浏览器都不存在上面的隐患,包括基本都禁用了TRACE方法,防止httponly的cookie泄漏问题等。
Web Storage的同源策略
Web Storage是由Mozilla的工程师在Firefox1.5中加入的,并且加入了HTML5中,现在的浏览器都支持,除了IE6与IE7。
JavaScript可以通过localStorage与sessionStorage对Web Storage进行创建,检索和删除:
localStorage.setItem("message", "Hi mom!");
alert(localStorage.getItem("message"));
localstorage.removeItem("message");
localStorage对象可以长时间保存,并且遵守同源策略。
但是在IE8中localStorage会把域名相同但是协议分别为HTTP和HTTPS的内容放在一起,IE9中已修改。
在Firefox中,localStorage没有问题,但是sessionStorage也是会把域名相同的HTTP与HTTPS放在一起。
Cookie的安全策略
设置Cookie总结
|
在foo.example.com设置cookie,domain设置为: |
最终cookie的范围 |
|
|
非IE浏览器 |
IE浏览器 |
|
|
设置为空 |
foo.example.com(一个域) |
*.foo.example.com |
|
bar.foo.example.com |
cookie设置失败,设置的域是当前域的一个子域 |
|
|
foo.example.com |
*.foo.example.com |
|
|
baz.example.com |
cookie设置失败,域名不匹配 |
|
|
example.com |
*.example.com |
|
|
ample.com |
cookie设置失败,域名不匹配 |
|
|
.com |
设置失败,域名太广,存在安全风险。 |
|
Cookie中的path参数可以设定指定目录的cookie。
例如设定domain为example.com,path为/some/path/ 在访问下面url的时候会带上设定的cookie:
http://foo.example.com/some/path/subdirectory/hello_world.txt
存在一定的安全风险,因为path的设定没有考虑到同源策略。
httponly属性可以防止通过document.cookie的API访问设定的cookie。
secure属性设定后只有在通过https传输时才会带上设定的cookie,可以防止中间人攻击。
Adobe Flash
AllowScriptAccess参数:用来控制flash通过ExternallInterface.call()函数调用javascript的时的限制。
有三个值:always,never和sameorigin,最后一个值只允许同域的JavaScript操作(08年之前默认为always,现在默认为sameorigin)。
AllowNetworking参数:用来控制flash与外部的网络通讯。
可选的值为:all(允许使用所有的网络通讯,默认值),internal(flash不能与浏览器通讯如navigateToURL,但是可以调用其他的API),none(禁止任何的网络通讯)
本地文件
由于本地文件都是通过file:协议进行访问的,由于不存在host,所以无法遵循同源策略。
所以本地保存的一个HTML文件,在浏览器中通过file:协议访问后,可以通过XMLHttpRequest或DOM对本地其他文件进行操作。
与此同时,也可以对互联网的其他资源做同样的操作。各浏览器厂商意识到这个问题,并努力做了修改:
测试代码:
1.html(1.txt随机写一些字符串即可)
<script>
function createXHR(){
return window.XMLHttpRequest?
new XMLHttpRequest():
new ActiveXObject("Microsoft.XMLHTTP");
}
function getlocal(url){
xmlHttp = createXHR();
xmlHttp.open("GET",url,false);
xmlHttp.send();
result = xmlHttp.responseText;
return result;
}
function main(){
url = "file://路径/1.txt";
alert(url);
result = getlocal(url);
alert(result);
}
main();
</script>
结论:
1 Chrome浏览器(使用WebKit内核的浏览器)
完全禁止跨文档的XMLHttpRequest和DOM操作,并禁止了document.cookie和<meta http-equiv="Set-Cookie" ...>的操作。
2 Firefox
允许访问同目录与子目录里的文件。也可通过document.cookie与<meta http- equiv="Set-Cookie" ...>设定cookie,file:协议下cookie共享,storage也是。
3 IE7及以上
允许本地文件之间的访问,但是在执行JavaScript之前会有一个提示,用户点击通过之后可以执行,cookie域Firefox类似,但是file:协议下不支持storage。
4 IE6
允许本地文件的访问,同时也允许对http协议的访问,cookie也是一样。
伪URL的域
一些web应用用到了伪URL例如about:,javascript:,和data:来创建HTML文档。
这种方法是为了不需要再与服务器通信,可以节约时间更快的响应,但是也带进了很多安全隐患。
about:blank
about协议在现在的浏览器中有很多用途,但是其中大部分不是为了获取正常的页面。
about:blank这个URL可以用来被创建DOM对象,例如:
<iframe src="about:blank" name="test"></iframe>
<script>
frames["test"].document.body.innerHTML = "<h1>Hi!</h1>";
</script>
在浏览器中,创建一个about:blank页面,它继承的域为创建它的页面的域。
例如,点击一个链接,提交一个表单,创建一个新窗口,但是当用户手动输入about:或者书签中打开的话,他的域是一个特殊的域,任何其他的页面都不可以访问。
data:协议
data:协议是设计用来放置小数据的,例如图标之类的,可以减少http请求数量,例如:
<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD...">
用以下代码研究域的问题:
<iframe src="data:text/html;charset=utf-8,<script>alert(document.domain)</script>" >
在Chrome与Safari中,所有的data:都会赋予一个单独的,不可获取的域,而不是从父域中继承的。
Firefox与Opera中,域是继承于当前页面。
IE8之前的版本不支持data:协议。
javascript:和vbscript:
javascript:协议允许后面执行javascript代码,并且继承了调用的当前域。
有些情况会对后面的内容处理两次,如果代码正确的话,会把后面的代码当成html解析,覆盖掉原来的html代码:
<iframe src="javascript:"<b>2 + 2 = " + (2+2) + "</b>"">
</iframe>
Browser Security-同源策略、伪URL的域的更多相关文章
- jsonp突破同源策略,实现跨域访问请求
跨域访问问题,相信大家都有遇到过.这是一个很棘手的问题.不过道高一尺,魔高一丈,对于这类问题,总有解决问题的方案.最近我又接触到了这个问题,解决的途径是ajax+jsonp. 说到这个问题,不得不说一 ...
- jsonp突破同源策略,实现跨域訪问请求
版权声明:本文为博主原创文章,未经博主同意不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] https://blog.csdn.net/xiao ...
- 学习AJAX必知必会(4)~同源策略、解决跨域问题(JSONP、CORS)
一.同源策略(Same-Origin Policy),是浏览器的一种安全策略. 1.同源(即url相同):协议.域名.端口号 必须完全相同.(请求是来自同一个服务) 2.跨域:违背了同源策略,即跨域. ...
- AJAX_违反了同源策略_就是"跨域"——jsonp 和 cors
https 协议 默认端口号 443 http 协议 默认端口号 80 同源策略 由网景公司提出的——浏览器 的 为了浏览器安全而生 同源策略: 协议.域名.端口号 必须完全一致 违 ...
- 浏览器的同源策略及CORS跨域解决方案 DRF
一个源的定义 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: UR ...
- 什么是同源策略,什么是跨域,如何跨域,Jsonp/CORS跨域
同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. 可以说Web是构建在同源策略基础之上 ...
- 浏览器同源策略与ajax跨域方法汇总
原文 什么是同源策略 如果你进行过前端开发,肯定或多或少会听说过.接触过所谓的同源策略.那么什么是同源策略呢? 要了解同源策略,首先得理解“源”.在这个语境下,源(origin)其实就是指的URL.所 ...
- 同源策略引发对跨域jsonp跨域的理解
一,同源策略其实网络的安全基石,既:http://www.baidu.com:80协议(http或者HTTPS或者ws或者wss).域名(www.baidu.com).端口(默认80,可以不写 htt ...
- 同源策略与CORS跨域请求
一.同源策略 1.简介 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源 ...
随机推荐
- dotnet 通过 WMI 获取系统启动的服务
本文告诉大家如何通过 WMI 获取系统启动的服务 通过 Win32_Service 可以获取系统启动的服务 获取的时候只需要拿Caption和State就可以 var mc = "Win32 ...
- 洛谷——P1305 新二叉树(新建二叉树以及遍历)
题目描述输入一串二叉树,用遍历前序打出. 输入输出格式输入格式: 第一行为二叉树的节点数n.(n \leq 26n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ...
- springBoot从入门到源码分析
先分享一个springBoot搭建学习项目,和springboot多数据源项目的传送门:https://github.com/1057234721/springBoot 1. SpringBoot快速 ...
- k8s生产环境部署
建议配置: 服务器 900G*2 SSD 安装操作系统 CPU 16核心*2 40G网卡*2 RAM 64G*8 操作系统建议:Centos7.4/Centos 7.6 不建议使用CentOS8 分布 ...
- stm32外部时钟源8M换成12M后库函数相应修改总结
前言 在做“自制继电器上位机控制软件”项目的时候,下位机用到USB虚拟串口,将以前写好的USB虚拟串口程序移植到下位机,发现程序计算机无法识别到虚拟串口STMicroelectronics Virtu ...
- PyTorch深度学习:60分钟入门(Translation)
这是https://zhuanlan.zhihu.com/p/25572330的学习笔记. Tensors Tensors和numpy中的ndarrays较为相似, 因此Tensor也能够使用GPU来 ...
- acwing 239. 奇偶游戏 并查集
地址 https://www.acwing.com/problem/content/241/ 小A和小B在玩一个游戏. 首先,小A写了一个由0和1组成的序列S,长度为N. 然后,小B向小A提出了M个 ...
- MyBatis使用mapper动态代理实现DAO接口
工具: mysql 5.5.62 IDEA 参考自:https://www.cnblogs.com/best/p/5688040.html 遇到的问题: 无法读取src/main/java下配置文 ...
- Echarts大数据可视化物流航向省份流向迁徙动态图,开发全解+完美参数注释
最近在研究Echarts的相关案例,毕竟现在大数据比较流行,比较了D3.js.superset等相关的图表插件,还是觉得echarts更简单上手些. 本文是以原生JS为基础,如果使用Vue.js的话, ...
- shell脚本一键配置本地yum源
效果如图: #!/bin/bash #Author:GaoHongYu #QQ: #Time:-- :: #Name:yumgz.sh #Version:V1. CKGZ=$( df -Th | gr ...