淺析同源策略和所涉及的安全問題

所謂的同源就是把來自同一個主機,端口,相同協議(http和https不是同種協議)的網絡資源叫做同源。

同源策略就是限制一個源中加載來自另一個源中的腳本,文本的交互方式。(一般是A源設置不允許讀取源B的腳本,但是允許執行源B的腳本)

這裏要記住不遵循同源策略的標籤:<script>,<img>,<iframe>中的src, href 等都可以任意連接網絡資源,相當於對所要求的源進行了一次Get請求),所謂的無限制跨域請求最終都不外乎這幾點

那麼如果子域名和頂級域名不同源,在哪裏可以設置叫他們同源?

這個問題就是實現跨域訪問的目的,簡單的辦法有在要讀取跨域資源的地方的腳本前設置該域document.domain='B.com'; 這是因爲在跨域訪問中雖然子域不能讀取根域的資源
但是還是可以允許修改域限制爲比子域更短的域設置,這樣在子域的還是可以做讀取父域資源的可能。

如何設置可以跨域請求數據?jsonp是做什麼的?

說下jsonp跨域的做法:blog.csdn.net/?file =a&callback=funA
上面是一段url請求,但是唯一不同的地方是jsonp要求有callback的參數指定回調函數名(在ajax中是jsonp:"callbackfunA",的參數指定jsonp格式返回),這樣服務器端返回的不是json,而是以函數封裝的形式返回的如 funA(){file:a.txt;},同時支持post和get的請求

Ajax是否遵循同源策略?
本來js的XmlHttpRequest是遵循同源規則的,Ajax的是異步的xml和javascript,其核心還是javascript,在出現同源策略後,引出了一系列的ajax跨域訪問的問題,和對應的解決方案,但是終究jax是遵守同源策略的,只要同源策略設置的當,就可以在一定程度上減少跨域訪問。

關於客戶端解析的domain 默認是等於window.location.hostname,主域名是不帶www的,主域名前帶的www或者其他的a.csdn.net其實是csdn.net的二級子域名,而上面提了document.domain只能忘根域名那邊靠攏,但是存在的安全性問題是 a.csdn.net遭受攻擊了,那c.csdn.net的子域也有被僞造的危險。

自己總結的跨域的辦法:
1.隱形的document.domain+iframe的做法,即設置<script type='text/javascript'> document.domain='根域名';(只能解決主域相同的二級子域之間的交互,具體做法是在a域寫個a.html,然後裏面弄個<iframe src="b.html"/>,這就可以使兩個子域間完成交互)
2.通過動態生成或修改不受跨域限制的<script>,<img>,<iframe>標籤的src標籤,利用裏面的src不受限制來實現跨域,但是這樣只能是get,如果又使用了jQuery的jsonp直接就支持get和post了(前提是服務器支持)
3.在服務器端做代理,因爲服務器端沒有跨域設置,首先服務器端主動請求過數據放在服務器,然後統一發給客戶端,這樣就是在源頭解決了跨域的問題(一般的服務器代理是幾個子域之間的代理)
4.猥瑣的辦法在url中可以接受location.hash,就是a.com#admin中的#admin就是location.hash,這個如果是在頁面刷新完了之後再修改不會引起頁面刷新,但是你知道http get傳遞的參數長度有限的,都是4M左右,除了safari的奇葩可以無限之外。這裏大致的思路有點像DNS tunnel中的附加數據,對於單項連接,A 要給B發消息,B一定要首先設置循環監聽的hashcheck()函數,等待請求,然後接受get請求,B處理完之後再把結果信息放在#result後返回給A,這樣就能交互了 

最後總結下防止跨域的做法:
1.在代碼方面對於頁面加載的腳本設置統一的document.domain
2.瀏覽器的同源策略不要打破,人爲降低安全級別(一般默認瀏覽器對於跨域訪問都是 拒絕訪問 的處理方式,或者對於不同源的資源或腳本會被加在沙箱中運行,safari等都是這樣幹了)

題外話,做web應用盡量使用本站的所有js等資源,即使是一個簡單的richtextEdit等插件也儘量不要用外聯了,這樣很容易引起跨域請求僞造漏洞。
發佈了75 篇原創文章 · 獲贊 15 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章