web安全二,CSRF攻擊

什麼是CSRF

全稱是(Cross Site Request Forgery)跨站請求僞造。也就是惡意網站假裝成用戶向目標網站服務器發送請求,騙取服務器執行請求中的命令,直接在服務器改變數據值的一種攻擊手段。javascript

CSRF是怎麼產生的

用戶須要獲取操做的權限,目標網站服務器會要求一次驗證,一般都是一次帳號密碼登陸。服務器驗證經過以後,會在瀏覽器寫一個會話ID,來標識用戶的身份。這是一種隱式驗證的方法,用戶只要驗證一次獲取到會話ID以後,在會話ID未過時的一段時間內的請求操做是不須要再次驗證的。但服務器只能判斷請求是來源於這個受權過的瀏覽器,而不能判斷請求是不是用戶發起或者是用戶受權的。因此當用戶瀏覽了惡意網站以後,惡意網站就能夠給服務器發起帶有命令的請求,嘗試改變服務器中的數據值。java

CSRF的攻擊對象

CSRF的攻擊對象也就是咱們要保護的對象。CSRF利用的是受權瀏覽器向目標網站服務器發送任何請求時,都會自動帶上會話ID或者cookie進行身份驗證。可是因爲瀏覽器同源策略的限制,惡意網站沒法看到目標網站的cookie或者回話ID,也沒有辦法解析返回的內容,因此惡意所能作的就是給服務器發送請求,以執行請求中所描述的命令,在服務器端直接改變數據的值,而非竊取服務器中的數據web

CSRF的攻擊手段

  1. 利用天生具備跨域能力的標籤-- <script>,<a>,<img>等,發起get請求
<img src="http://www.target.com/order/pay?money=10000&to=34j34">
  1. 利用iframe和javascipt發起post請求
<iframe name="steal" style="display: none;"></iframe>
<form method="post" action="http:www.xxxx.com/trading/product/addCartProduct" name="transfer" target="steal">
        <input type="hidden" name="id" value="b21a59eaa7e604b44fe8a3bf">
        <input type="hidden" name="money" value="1000">
    <input type="submit" value="提交">
          
</form>
window.onload=function(){
    function steal()
    {
      var iframe = window.frames['steal'].document;
      var form = document.getElementsByTagName('form')[0];
      form.submit();
    }
    steal();
}

CSRF的防護措施

1. 涉及到數據更改的操做服務器嚴格使用post請求而不是get請求
2. 驗證HTTP Referer 字段
根據 HTTP 協議,在 HTTP 頭中有一個字段叫 Referer,它記錄了該 HTTP 請求的來源地址。惡意網站只能在他本身的網站僞造請求,因此驗證referer應該是能夠過濾掉一部分CSRF攻擊的。可是使用Rerferer值,就至關於把安全性交給了第三方,瀏覽器實現referer的方式不能保證沒有漏洞。聽說IE6是能夠修改referer的值的。另外referer會記錄下用戶的訪問來源,有些用戶會以爲是侵犯了其隱私,並且用戶是能夠設置使用瀏覽器時再也不提供referer的。(因此說這種方法雖然簡單可是不可靠)
3. 在請求地址中添加token
CSRF 攻擊之因此可以成功,是由於黑客能夠徹底僞造用戶的請求。服務器驗證地址中加密的token,能夠比較有效地避免攻擊
4. HTTP頭自定義屬性驗證
這個是token驗證的變種,能夠利用 XMLHttpRequest 這個類,一次性給ajax請求加上 特定的 HTTP 頭屬性,並把 token 值放入其中。
5 顯式驗證,添加驗證碼驗證,密碼驗證等。
CSRF 攻擊之因此可以成功,也是因爲隱式驗證,服務器沒法判斷請求真實地由用戶發起和用戶受權的。ajax

總的來講,CSRF防護沒有十全十美的方法,只有適合的方法。segmentfault

參考跨域

【相關】
web安全,是一個很重要的技能,也是一個領域的知識。我把這個領域的東西寫成了一個系列,之後還會繼續完善下去:
web安全一:同源策略與跨域
web安全二:CSRF 攻擊
web安全三:XSS 攻擊瀏覽器

相關文章
相關標籤/搜索