1.同源策略
是指瀏覽器普遍默認的一種安全策略;
例如:
一個惡意網站的頁面通過iframe嵌入了銀行的登錄頁面(二者不同源),如果沒有同源限制,惡意網頁上的javascript腳本就可以在用戶登錄銀行的時候獲取用戶名和密碼。
- 同源:
即是指URL具有相同的協議、域名、端口;可以理解為當前域名下的腳本,只能讀寫當前域名下的數據資源,而無法獲取其他資源;
2.跨域以及跨域有幾種實現形式
通過一些方法,突破同源策略的限制
實現方式包括
- 降域
(當域名有相同后綴時可使用,使用不多,容易產生安全問題,一個子頁面收到攻擊,所有數據都存在泄漏的風險)
在當前域名及調用數據內部都添加
document.domain=XXXX...
XXX只能設置為當前域名的上一級~上N級域名、
可以繼續向下修改,不能向上進行修改
- JSONP
- CORS
3.JSONP的原理
在當前域創建一個函數XXX,創建一個動態script標簽,并將想要調用數據的域名設置為script的src值,且需要添加一個參數值callback=xxx,與之前創建的函數,聲明一致。這樣獲取到了需要的數據,并且在當前域執行xxx(data);
<script>
window.newfun=function(data ){ //當前域聲明一個函數
alert()
}
<script>
var script=document.createElement('script'); //創建一個動態script標簽
script.src='//abc.com/ac.js?callback=newfun' //向服務器請求callback數據
document.body.appendChild('script'); //添加到頁面
<script>
</script>
//后臺服務器寫法
var callback=this.query.newfun;
this.body=callback+'(data)';
- 缺點:
如果a.com可以訪問b.com,那么完全可以讓c.com也訪問b.com,解決方法有要么用正則過濾掉不應該出現的字符串,要么約定好一套數據,比如cookies來互相匹配
不能用post只能get
4.CORS
Cross Origin Rescource Sharing 跨域資源共享
在調用數據文檔內加入響應頭,在當前域名直接用ajax調用即可
this.set('Access-Control-Allow-Origin','當前域名')
缺點是IE8,9兼容存在問題
本地模擬同源策略
首先找到系統的hosts文件(windows系統的路徑 C:\Windows\System32\drivers\etc)默認情況下,只有localhost指向本地IP 127.0.0.1,在hosts文件中我們可以為其添加多個域名
模擬同源策略
- JSONP
window.newfun=function(data){
alert(data);}
var script=document.createElement('script');
script.type='text/javascript';
script.src='//b.com/task31/data.php?callback=newfun';
document.body.appendChild(script);
</script>
//后臺
newfun('我是數據');
JSONP
- CORS
$.ajax({
url:'//b.com/task31/data.php',
type:'get',
datatype:'json',
// jsonp:'callback',
success:function(data){
console.log(data);
},
error:function(){
console.log('there is problem');
}
})
//后臺
<?php
header('Access-Control-Allow-Origin:http://a.com');
$data='i am data';
echo json_encode($data);
?>
CORS