CSRF全名是 Cross Site Request Forgery,翻成中文就是跨站請求偽造。
因為一般cookie是存放在瀏覽器的,網頁開發者不必另外寫程式取用cookie,瀏覽器就會自動帶上先前登入過的狀態到網頁,CSRF攻擊就是利用瀏覽器會自動帶入cookie中存的使用者當前已登入網頁的登入狀態的這個漏洞,將一些攻擊腳本塞進網頁裡,再利用瀏覽器儲存的使用者權限來進行非本意的操作(翻成白話就是讓使用者在不知情的情況下做出一些攻擊者預先埋藏在網頁裡的動作)。
小美常常在XX論壇發表文章,而因為經常登入這個論壇網站,登入狀態被瀏覽器cookie自動存了下來,而這個網站沒有任何阻擋CSRF攻擊的機制。壞蛋小明發現這件事後,決定要來惡作劇。他知道小美喜歡貓,於是有天在某個部落格網站,放了一個按鈕『可愛貓咪相簿連結』,但按鈕點下去產生的動作是『 刪除 https://XX論壇.com/post/1
」這樣的腳本,當小美上當點了下去,就在不知不覺間把自己寫的一篇文章給刪除了。
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==">
另外,瀏覽器的同源政策,也就是用來阻擋跨域請求(CORS)以避免釣魚網站在網頁內容裡放一些攻擊腳本的一種機制。同源政策某種程度上也可預防CSRF(但只能防止一部份),而身為網頁開發者總不能期望每個瀏覽器都有這層保護機制,該處理的一些安全性問題還是得靠自己。