浅析同源策略和所涉及的安全问题

所谓的同源就是把来自同一个主机,端口,相同协议(http和https不是同种协议)的网络资源叫做同源。

同源策略就是限制一个源中加载来自另一个源中的脚本,文本的交互方式。(一般是A源设置不允许读取源B的脚本,但是允许执行源B的脚本)

这里要记住不遵循同源策略的标签:<script>,<img>,<iframe>中的src, href 等都可以任意连接网络资源,相当于对所要求的源进行了一次Get请求),所谓的无限制跨域请求最终都不外乎这几点

那么如果子域名和顶级域名不同源,在哪里可以设置叫他们同源?

这个问题就是实现跨域访问的目的,简单的办法有在要读取跨域资源的地方的脚本前设置该域document.domain='B.com'; 这是因为在跨域访问中虽然子域不能读取根域的资源
但是还是可以允许修改域限制为比子域更短的域设置,这样在子域的还是可以做读取父域资源的可能。

如何设置可以跨域请求数据?jsonp是做什么的?

说下jsonp跨域的做法:blog.csdn.net/?file =a&callback=funA
上面是一段url请求,但是唯一不同的地方是jsonp要求有callback的参数指定回调函数名(在ajax中是jsonp:"callbackfunA",的参数指定jsonp格式返回),这样服务器端返回的不是json,而是以函数封装的形式返回的如 funA(){file:a.txt;},同时支持post和get的请求

Ajax是否遵循同源策略?
本来js的XmlHttpRequest是遵循同源规则的,Ajax的是异步的xml和javascript,其核心还是javascript,在出现同源策略后,引出了一系列的ajax跨域访问的问题,和对应的解决方案,但是终究jax是遵守同源策略的,只要同源策略设置的当,就可以在一定程度上减少跨域访问。

关于客户端解析的domain 默认是等于window.location.hostname,主域名是不带www的,主域名前带的www或者其他的a.csdn.net其实是csdn.net的二级子域名,而上面提了document.domain只能忘根域名那边靠拢,但是存在的安全性问题是 a.csdn.net遭受攻击了,那c.csdn.net的子域也有被伪造的危险。

自己总结的跨域的办法:
1.隐形的document.domain+iframe的做法,即设置<script type='text/javascript'> document.domain='根域名';(只能解决主域相同的二级子域之间的交互,具体做法是在a域写个a.html,然后里面弄个<iframe src="b.html"/>,这就可以使两个子域间完成交互)
2.通过动态生成或修改不受跨域限制的<script>,<img>,<iframe>标签的src标签,利用里面的src不受限制来实现跨域,但是这样只能是get,如果又使用了jQuery的jsonp直接就支持get和post了(前提是服务器支持)
3.在服务器端做代理,因为服务器端没有跨域设置,首先服务器端主动请求过数据放在服务器,然后统一发给客户端,这样就是在源头解决了跨域的问题(一般的服务器代理是几个子域之间的代理)
4.猥琐的办法在url中可以接受location.hash,就是a.com#admin中的#admin就是location.hash,这个如果是在页面刷新完了之后再修改不会引起页面刷新,但是你知道http get传递的参数长度有限的,都是4M左右,除了safari的奇葩可以无限之外。这里大致的思路有点像DNS tunnel中的附加数据,对于单项连接,A 要给B发消息,B一定要首先设置循环监听的hashcheck()函数,等待请求,然后接受get请求,B处理完之后再把结果信息放在#result后返回给A,这样就能交互了 

最后总结下防止跨域的做法:
1.在代码方面对于页面加载的脚本设置统一的document.domain
2.浏览器的同源策略不要打破,人为降低安全级别(一般默认浏览器对于跨域访问都是 拒绝访问 的处理方式,或者对于不同源的资源或脚本会被加在沙箱中运行,safari等都是这样干了)

题外话,做web应用尽量使用本站的所有js等资源,即使是一个简单的richtextEdit等插件也尽量不要用外联了,这样很容易引起跨域请求伪造漏洞。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值