关于JS跨域问题的理解与解决方案

关于JS跨域问题的理解与解决方案

2018/05/21

问题复现:今天第一次操作Ajax, 将菜鸟教程Ajax实例的代码复制到本地操作,发现Chrome报错(IE8使用的ActiveX方法正常):

Failed to load http://www.runoob.com/try/ajax/ajax_info.txt: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

百度后发现是跨域问题.

定义:跨域是指一个域下的文档或脚本试图去请求另一个域下的资源.也就是ajax或者iframe指向的地址中,
二级域名、端口、协议必须与主页面完全相同,否则就算跨域.

为什么要有跨域限制:跨域限制主要是为了安全考虑。

AJAX同源策略主要用来防止CSRF攻击。如果没有AJAX同源策略,相当危险,我们发起的每一次HTTP请求都会带上请求地址对应的cookie,那么可以做如下攻击:

  1. 用户登录了自己的银行页面 mybank.com,mybank.com向用户的cookie中添加用户标识。
  2. 用户浏览了恶意页面evil.com。执行了页面中的恶意AJAX请求代码。
  3. evil.com向mybank.com发起AJAX HTTP请求,请求会默认把mybank.com对应cookie也同时发送过去。
  4. 银行页面从发送的cookie中提取用户标识,验证用户无误,response中返回请求数据。此时数据就泄露了。
  5. 而且由于Ajax在后台执行,用户无法感知这一过程。

DOM同源策略也一样,如果iframe之间可以跨域访问,可以这样攻击:

  1. 做一个假网站,里面用iframe嵌套一个银行网站 mybank.com。
  2. 把iframe宽高啥的调整到页面全部,这样用户进来除了域名,别的部分和银行的网站没有任何差别。
  3. 这时如果用户输入账号密码,我们的主网站可以跨域访问到 mybank.com的dom节点,就可以拿到用户的输入了,那么就完成了一次攻击。

所以说有了跨域跨域限制之后,我们才能更安全的上网了。

跨域的解决方案:
知乎:什么是JS跨域访问?
思否:详解js跨域问题
CSDN博客:解决“No 'Access-Control-Allow-Origin'...”错误
博客园:前端常见跨域解决方案(全)

其他相关:
JSONP教程-菜鸟教程
Chrome报错原问题地址

最后修改:2019 年 04 月 15 日 07 : 27 AM
如果觉得我的文章对你有用,请随意赞赏

发表评论