ajax跨域问题
跨域方式
1.基于iframe实现跨域
基于iframe实现的跨域要求两个域具有aa.xx.com,bb.xx.com这种特点,也就是两个页面必须属于一个基础域(例如都是xxx.com,或是xxx.com.cn),使用同一协议(例如都是 http)和同一端口(例如都是80),这样在两个页面中同时添加document.domain,就可以实现父页面调用子页面的函数。
2.基于script标签实现跨域
script标签本身就可以访问其它域的资源,不受浏览器同源策略的限制,可以通过在页面动态创建script标签。
3.后台代理方式
这种方式可以解决所有跨域问题,也就是将后台作为代理,每次对其它域的请求转交给本域的后台,本域的后台通过模拟http请求去访问其它域,再将返回的结果返回给前台,这样做的好处是,无论访问的是文档,还是js文件都可以实现跨域。
跨域攻击
使用ajax技术让人头痛的地方就是如何跨域,受同源策略所限不同域名包括子域名在内是无法进行AJAX请求的,随后衍生出一类技术可以通过设置document.domain实现跨域。如a.test.com和b.test.com,当两个网站通过javascript操作DOM接口 document.domain=’test.com’ 将网站的域设置为test.com后,两个网站就处于同一个域内,可以进行各种跨域操作。在开发人员方面这是很方便的跨域技术,但是在攻击者眼中这简直就是一个大后门,黑客只需要找到*.test.com下任意一个XSS漏洞,在任意一个子域名里的网页都可以跨域攻击a.test.com和b.test.com。
为什么要禁止跨域的 Ajax 请求?
同源策略
- DOM同源策略:禁止对不同源页面DOM进行操作
- XmlHttpRequest同源策略:禁止向不同源的地址发起HTTP请求
AJAX同源策略主要用来防止CSRF攻击。如果没有AJAX同源策略,攻击过程如下:
我们发起的每一次HTTP请求都会全额发送request地址对应的cookie,那么
- 用户登录了自己的银行页面http://MyBank.com,http://MyBank.com向用户的cookie中添加用户标识
- 用户浏览了恶意页面 http://Evil.com。执行了页面中的恶意AJAX请求代码
- http://Evil.com向http://MyBank.com发起AJAX HTTP请求,请求同时http://MyBank.com对应cookie也同时发送过去
- 银行页面从发送的cookie中提取用户标识,验证用户标识无误,response中返回请求数据。此时数据泄露。
- 由于Ajax的后台执行,此时用户没有意识这一过程。