任务31-同源策略、跨域、jsonp

问答

1. 什么是同源策略?

同源定义:所谓同源是指,域名,协议,端口相同。
<pre>例:http://www.x.com/index.html(与以下URL对比) http://www.x.com/reg.html (同源) http://1s.x.com/reg.htm(域名不同,不同源) https://www.x.com/index.htm(协议不同,不同源) http://www.x.com:8080/reg.html (端口不一致,不同源)</pre>
同源策略:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。同源策略规定不同源的客户端脚本未经明确授权的情况下,不能读写对方的资源,但是可以引用。
<pre>a.com/index.html 可以引用b.com/main.js 可以引用b.com/style.css 可以引用b.com/logo.bng 但是a.com里面的b.com/main.js不能对b.com的资源进行读写(ajax报错)</pre>

2. 什么是跨域?跨域有几种实现形式?

跨域:指不同脚本之间的相互访问,由于浏览器同源策略的限制,不同域名下的脚本之间不可以相互读写数据,这种情况下我们就需要用到跨域请求。
跨域的情况:

跨域的形式:

  • 降域:

    • 定义及作用:在同一主域名下进行降域。通过降域可以使两个一级域名相同,二级域名不同的网页实现跨域资源共享。如child1.a.com和child2.a.com,他们有共同的父域名a.com,同时在当前页面和iframe加上document.domain = a.com进行降域处理。
  • 缺点:

    • 适用场景有限:它要求两个域名是父子域名的关系,需要在ifame嵌套时有用。
    • 安全性低:当子域名被攻击或者恶意注入时,父域名下的信息会被暴露。
  • JSONP

    • 原理:通过script方式请求资源,并把回调函数以参数的形式传递给服务端,并在服务端执行回调函数。
  • 缺点:

    • 安全性问题,任意网站只要通过jsonp方式就可以跨域访问目标域名下的信息,那么如何解决?在跨域请求数据时在参数中加上与目标域名约定好的一个token变量,这样其他网站访问该域名时,目标网站通过辨认这个约定好的信息而决定是否可以被跨域访问。
    • 不能用POST方法获取数据,只能用GET方法获取数据。
    • callback方法由于是根据用户需求自己实现的,可能会被恶意注入脚本,获取隐私信息。
  • CORS

    • 原理:使用"Origin:"请求头和"Access-Control-Allow-Origin"响应头来扩展HTTP。其实就是利用新的HTTP头部来进行浏览器与服务器之间的沟通。
    • 缺点:IE浏览器不支持或者部分支持CORS方式
  • postMessage

    • postMessge()是HTML5新定义的通信机制。所有主流浏览器都已实现。该API定义在Window对象。该方法可以通过绑定window的message事件来监听发送跨文档消息传输内容。
  • window.name实现的跨域数据传输

    • window 对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。那么我们可以在页面 A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给window.name,iframe加载完成之后(iframe.onload),页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出iframe的window.name的值了(因为A中的window.name和iframe中的window.name互相独立的,所以不能直接在A中获取window.name,而要通过iframe获取其window.name)。这个方式非常适合单向的数据请求,而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。
  • location.hash

    • 因为父窗口可以对iframe进行URL读写,iframe也可以读写父窗口的URL,URL有一部分被称为hash,就是#号及其后面的字符,它一般用于浏览器锚点定位,Server端并不关心这部分,应该说HTTP请求过程中不会携带hash,所以这部分的修改不会产生HTTP请求,但是会产生浏览器历史记录。此方法的原理就是改变URL的hash部分来进行双向通信。每个window通过改变其他 window的location来发送消息(由于两个页面不在同一个域下IE、Chrome不允许修改parent.location.hash的值,所以要借助于父窗口域名下的一个代理iframe),并通过监听自己的URL的变化来接收消息。这个方式的通信会造成一些不必要的浏览器历史记录,而且有些浏览器不支持onhashchange事件,需要轮询来获知URL的改变,最后,这样做也存在缺点,诸如数据直接暴露在了url中,数据容量和类型都有限等。

3. jsonp 的原理是什么?

原理:因为通过script标签引入的js是不受同源策略的限制的,所以我们可以通过script标签引入一个js或者是一个其他后缀形式(如php,jsp等)的文件,此文件返回一个js函数的调用,如返回JSONP_getUsers(["mike","john","ruby"]),也就是说此文件返回的结果调用了JSONP_getUsers函数,并且把["mike","john","ruby"]传进去,这个["mike","john","ruby"]是一个用户列表。那么如果此时我们的页面中有一个JSONP_getUsers函数,那么JSONP_getUsers就被调用到,并且传入了用户列表。此时就实现了在本域获取其他域数据的功能,也就是跨域。

4. CORS是什么?

CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制,实现原理是服务器在响应头加入Access-Control-Allow-Origin字段,如果发出请求的网站包含在被请求网站的允许名单中,就能实现跨域AJAX请求,它支持现代浏览器,IE支持10以上。

练习

本地搭建服务器,演示同源策略。

  1. 本地搭建服务器(如果使用 SAE 可创建不同的代码版本,这样可通过1.xxx.sinapp.com和2.xxx.sinapp.com 访问了)
  1. 修改 本地host,通过不同域名访问本地服务器。比如访问http://a.com/index.html, http://b.com/ajax.php,本质是

  2. 在 index.html 里使用 ajax 接口访问 http://b.com/ajax.php 里的数据。

  3. 查看输出报错

  4. 同个IP不同域名:通过设置hosts文件,对本机127.0.0.1设置多个域名


  5. http://snow.com/task31.html里使用ajax接口访问http://xmz.com/ajax.php

    snow.com/task31.html

xmz.com/ajax.php

ajax请求发送失败,查看输出报错:

至少使用一种方式解决跨域问题

成功获取到了xmz.com/ajax.php的数据,输出结果如下:


  • jsonp方式:利用动态的script便签的创建获取到数据
snow.com/task31-1.htm
xmz.com/ajax.php

输出结果:

本文版权归本人和饥人谷所有,转载请注明来源。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容