iT邦幫忙

0

寫Web不能不知道的常見網路攻擊:CSRF

CSRF全名是 Cross Site Request Forgery,翻成中文就是跨站請求偽造。

攻擊原理

因為一般cookie是存放在瀏覽器的,網頁開發者不必另外寫程式取用cookie,瀏覽器就會自動帶上先前登入過的狀態到網頁,CSRF攻擊就是利用瀏覽器會自動帶入cookie中存的使用者當前已登入網頁的登入狀態的這個漏洞,將一些攻擊腳本塞進網頁裡,再利用瀏覽器儲存的使用者權限來進行非本意的操作(翻成白話就是讓使用者在不知情的情況下做出一些攻擊者預先埋藏在網頁裡的動作)。

舉例

小美常常在XX論壇發表文章,而因為經常登入這個論壇網站,登入狀態被瀏覽器cookie自動存了下來,而這個網站沒有任何阻擋CSRF攻擊的機制。壞蛋小明發現這件事後,決定要來惡作劇。他知道小美喜歡貓,於是有天在某個部落格網站,放了一個按鈕『可愛貓咪相簿連結』,但按鈕點下去產生的動作是『 刪除 https://XX論壇.com/post/1 」這樣的腳本,當小美上當點了下去,就在不知不覺間把自己寫的一篇文章給刪除了。

身為網頁開發者該如何防範?

  1. CSRF token:由網頁server端產生一組安全驗證碼,每次發送post請求時都要在form表單裡帶入這組驗證碼,如此一來就能辨識該請求來源是否為本網頁。蠻多MVC框架現在都有內建這個功能,讓開發者不用自己手動加入,例如Laravel, Rails。
    以Rails為例:
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end

這個功能會在所有的表單中自動插入安全驗證碼,在進行所有post請求之前,rails server端都會先檢查有沒有戴上正確的安全驗證碼:

<form action="/technical_infos" enctype="multipart/form-data"  method="post">
    <input type="hidden" name="authenticity_token" value="zXeOqhmF0VLxDhtTJVxfDGv1ik5jmIyreAA1qNHtC3/0rTo1dwUr4b4uIUtS2plnD3+PrsCO/aZVrw==">
  1. 將coockie存在local storage:前面有提到,CSRF攻擊的前提是『瀏覽器有自動帶上登入狀態』,若登入資訊存放在local storage(也就是使用者的電腦),當使用者再次瀏覽登入過的網頁時,網頁開發者必須額外寫程式來取用先前的登入狀態。
  2. 危險的操作就要求使用者再次輸入密碼:例如現實中多數銀行APP對於身份驗證是很嚴格的,尤其在付款、轉帳這種敏感的操作前都會要求使用者再次輸入密碼或透過簡訊驗證碼都來確認身份,唯有如此才能更嚴謹的確認這個操作是來自使用者本人的意志(密碼被盜就另當別論了)。

另外,瀏覽器的同源政策,也就是用來阻擋跨域請求(CORS)以避免釣魚網站在網頁內容裡放一些攻擊腳本的一種機制。同源政策某種程度上也可預防CSRF(但只能防止一部份),而身為網頁開發者總不能期望每個瀏覽器都有這層保護機制,該處理的一些安全性問題還是得靠自己。


尚未有邦友留言

立即登入留言