Web - JSONP和同源策略漫谈

0x00 前言

关于JSONP网上有很多文章了,我也是在拜读了别人的文章的基础上来写写自己的看法,这样可以加深自己印象,巩固一下学习效果。我们需要做的就是站在巨人的肩膀上眺望远方。

0x01 起

在Web前端开发中有一种安全机制,Javascript脚本只能访问与它同域的内容,这就是同源策略。
这里就需要先说明一个问题:如果确定脚本的域?

html页面中试用脚本有两种方式:内联和引用。

上图中滑红框部分,src为引用方式,直接在script中写代码是内联方式。
如果html的页面url为:http://a.huangjacky.com/a.html,那么内联方式脚本的域是a.huangjacky.com,这应该比较容易理解。
引用方式有两种情况,引用的js文件就是A站点、引用的js是其他站点,但是不过是内联还是引用方式的脚本代码它执行都是在当前html下,因此它的域是和html相同的。

图中例子用的是AJAX网络请求,其实Javascript访问内容还可以DOM操作,当iframe之间的域不相同时,也无法通过Javascript去操作其他iframe中的DOM元素。

上面这个还比较基础,老鸟别喷。

现在开始我们的例子:

  1. 有两个站点a.huangjacky.com, b.huangjacky.com
  2. A站点的a.html要去请求B站点的b.php

a.html的代码如上图,b.php的代码如下:

1 <?php
2 echo"from b site";

我们点击a.html中按钮看一下会是什么样的效果?


提示说的很清楚,A站的Javascript的XMLHttpRequest对象无法加载B站,因为没有Access-Control-Allow-Origin头,那么接下来我们就来看看这个HTTP头有什么用?

在跨域HTTP请求中,会有一个HTTP头叫Origin,上图中也可以看出来,响应中HTTP头中的Access-Control-Allow-Origin包含Origin域,那么就满足跨域,浏览器就不会报错了,接下来我们修改PHP代码:

1 <?php
2 header("Access-Control-Allow-Origin: http://a.huangjacky.com");
3 echo"from b site"

代码中就增加一行header设置,看看运行效果:

运行正常了,AJAX也获得到了B站数据了,但是如果有个C站也要获取B站数据呢?我们分别尝试设置Access-Control-Allow-Orgin为http://huangjacky.com和http://*.huangjacky.com。都出现了通源策略访问错误的提示,我这里就不截图了,我肯定是试了的。

现在问题出来了,我就是有这样的需求,多个子域都要访问B站来获取数据,怎么办?

其实这里可以设置Access-Control-Allow-Orgin: * ,就可以了。

但是这样安全性又是一个问题了,所有的网站都可以访问来访问数据了,而Access-Control-Allow-Orgin头要么是*,要么指定子域名。其实这里我们可以在PHP中做一些逻辑判断,比如判断Origin头是否huangjacky.com的请求,那么就设置Access-Control-Allow-Orgin为*,不就可以了么?代码如下:

1 <?php
2 $origin = $_SERVER[‘HTTP_ORIGIN‘];
3 if(preg_match(‘/^http:\/\/\w+\.huangjacky\.com/i‘,$origin))
4     header("Access-Control-Allow-Origin: *");
5 echo"from b site";

具体其他的参数可以参考附录中的详细文档咯。

0x02 承

JSONP也是Web开发中针对跨域提出来一种方法,它不是新技术,反而是一些老技术的整合,这样在浏览器的兼容性上面做得不错。前面我们说到过script标签的src是可以跨域引用js,把js加载到自己的域中来执行。因此我们可以在引用js的同时提交一些参数,这样B站根据参数做出相应的操作后,将操作的结果写入到js文件中,并返回给A站点,这样A站点就得到了B站点的数据了。

第一框中function是A站在加载完B站数据后执行的函数。第二框是一个DOM中添加一个script标签。因此我们现在有必要看看B站后台是怎么实现的:

重点是要输出要确定Content-Type,然后就是拼凑javascript代码了。

是吧很简单的,在jQuery在$.ajax函数中将参数dataType设置成jsonp的话,就会按照这种原理来实现跨域,和XMLHttpRequest没有半毛钱的关系了。

0x03 转

从JSONP的原理来看的话,script标签只能GET方式。还有就是后台程序需要对callback参数进行有效性过滤,不然恶意用户可以插入攻击代码了。一般使用正则:

^[a-z0-9_]+$

来判断用户的回调函数名是否合法。

而JSONP中经常还会遇到一个问题就是JSON劫持,这是CSRF中的一种,常用的防御方式都是部署TOKEN。

0x04 附录

  1. https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
  2. http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/
  3. http://www.nowamagic.net/librarys/veda/detail/224

?

时间: 2024-08-28 11:45:48

Web - JSONP和同源策略漫谈的相关文章

jsonp突破同源策略,实现跨域访问请求

跨域访问问题,相信大家都有遇到过.这是一个很棘手的问题.不过道高一尺,魔高一丈,对于这类问题,总有解决问题的方案.最近我又接触到了这个问题,解决的途径是ajax+jsonp. 说到这个问题,不得不说一下"同源策略(Same-Origin Policy)",它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源,就是必须协议.域名.端口都一致的,才叫做同源.例如:http://www.12306.cn和https://www.

web安全之同源策略

为什么使用同源策略?一个重要原因就是对cookie的保护,cookie 中存着sessionID .如果已经登录网站,同时又去了任意其他网站,该网站有恶意JS代码.如果没有同源策略,那么这个网站就能通过js 访问document.cookie 得到用户关于的各个网站的sessionID.其中可能有银行网站,通过已经建立好的session连接进行攻击,这里有一个专有名词,CSRF,还有需要注意的是同源策略无法完全防御CSRF,这里需要服务端配合. 什么是同源策略? URL由协议.域名.端口和路径组

对同源策略与多页面通讯、跨域请求的深入探索

为了网页的安全,现在主要的浏览器都遵循了同源策略.同源策略究竟有哪些规范?怎么体现安全作用?个人总结同源策略的一个首要宗旨是: 阻止能向外传输信息的模块(如javascript)获取到来自不同源的资源,不能获取也就从源头阻止了资源和其中信息的泄露. 很重要的一点是,同源策略阻止的是跨域资源的获取,而不是阻止跨域的请求,请求可以正常发出,但返回的内容被阻止,无法让JS脚本获取 针对javascript,且看几个直观的现象:1.一个页面的javascript能获取到其他页面的window.但在非同源

同源策略和JSONP(概念性)

同源策略 浏览器有一个很重要的概念——同源策略(Same-Origin Policy). 所谓同源是指,域名,协议,端口相同.不同源的客户端脚本(javascript.ActionScript)在没明确授权的情况下,不能读写对方的资源. 同源策略是基于安全考虑的,当前域不能访问其他域的东西.但这也带来一个问题,不同域之间如何协助.    简单的来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上. 同源策略是由Netscape提出的一个著名的安全策

同源策略——浏览器安全卫士

对于软件开发人员来说,理解同源策略.能够非常好地攻克了一个痛点. 不同域名下的资源读写 ! 古代的楚河汉界明白地规定了两方的活动界限.假设没有这些界限,天下必将大乱.相同,在我们的浏览器,也有着一些界限和策略,才让 Web 世界之所以能如此美好地呈如今我们面前.这些安全策略有效地保障了用户计算机的本地安全与Web安全. 同源策略 浏览器有一个非常重要的概念--同源策略(Same-Origin Policy).所谓同源是指,域名,协议.port同样.不同源的client脚(javascript.A

同源策略——浏览器的安全卫士

对于软件开发者来说,理解同源策略,可以很好地解决了一个痛点, 不同域名下的资源读写 ! 古代的楚河汉界明确地规定了双方的活动界限,如果没有这些界限,天下必将大乱.同样,在我们的浏览器,也有着一些界限和策略,才让 Web 世界之所以能如此美好地呈现在我们面前,这些安全策略有效地保障了用户计算机的本地安全与Web安全. 同源策略 浏览器有一个很重要的概念--同源策略(Same-Origin Policy).所谓同源是指,域名,协议,端口相同.不同源的客户端脚(javascript.ActionScr

解说同源策略和跨域访问

尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措施之间都试图保持相互独立,但是攻击者只要能在出错的地方注入少许JavaScript,所有安全控制几乎全部瓦解--最后还起作用的就是最弱的安全防线:同源策略.同源策略管辖着所有保安措施,然而,由于浏览器及其插件,诸如Acrobat Reader.Flash 和Outlook Express漏洞频出,致使同源策略也频频告破. 既然web应用的最

XSS前置课程--同源策略

什么是同源策略: 在用户浏览互联网中的网页的过程中,身份和权限的思想是贯穿始终的 同源策略(Same-Origin Policy),就是为了保证互联网之中,各类资源的安全性而诞生的产物,它实际上是一个众多浏览器厂商共同遵守的约定.同源策略是浏览器中基本的安全功能,缺少同源策略,很多浏览器的常规功能都会受到影响,可以说WEB是构建在同源策略基础之上的. 如果WEB世界没有同源策略,当你登录FreeBuf账号并打开另一个站点时,这个站点上的JavaScript可以跨越读取你的FreeBuf账号数据,

第二百七十四节,同源策略和跨域访问

同源策略和跨域访问  什么是同源策略 尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措施之间都试图保持相互独立,但是攻击者只要能在出错的地方注入少许JavaScript,所有安全控制几乎全部瓦解--最后还起作用的就是最弱的安全防线:同源策略.同源策略管辖着所有保安措施,然而,由于浏览器及其插件,诸如Acrobat Reader.Flash 和Outlook Express漏洞频出,致使同