轉載大佬的文章,好好觀摩學習:CSRF攻擊原理及防禦:https://www.cnblogs.com/shytong/p/5308667.html
CSRF是什麼呢?CSRF全名是Cross-site request forgery,是一種對網站的惡意利用,CSRF比XSS更具危險性。想要深入理解CSRF的攻擊特性我們有必要了解一下網站session的工作原理。
session我想大家都不陌生,無論你用.net或PHP開發過網站的都肯定用過session對象,然而session它是如何工作的呢?如果你不清楚請往下看。
先問個小問題:如果我把瀏覽器的cookie禁用了,大家認爲session還能正常工作嗎?
答案是否定的,我在這邊舉個簡單的例子幫助大家理解session。
比如我買了一張高爾夫俱樂部的會員卡,俱樂部給了我一張帶有卡號的會員卡。我能享受哪些權利(比如我是高級會員卡可以打19洞和後付費喝飲料,而初級會員卡只能在練習場揮杆)以及我的個人資料都是保存在高爾夫俱樂部的數據庫裏的。我每次去高爾夫俱樂部只需要出示這張高級會員卡,俱樂部就知道我是誰了,並且爲我服務了。
這裏我們的高級會員卡卡號 = 保存在cookie的sessionid;
而我的高級會員卡權利和個人信息就是服務端的session對象了。
我們知道http請求是無狀態的,也就是說每次http請求都是獨立的無關之前的操作的,但是每次http請求都會將本域下的所有cookie作爲http請求頭的一部分發送給服務端,所以服務端就根據請求中的cookie存放的sessionid去session對象中找到該會員資料了。
當然session的保存方法多種多樣,可以保存在文件中,也可以內存裏,考慮到分佈式的橫向擴展我們還是建議把它保存在第三方媒介中,比如redis或者mongodb。
我們理解了session的工作機制後,CSRF也就很容易理解了。CSRF攻擊就相當於惡意用戶A複製了我的高級會員卡,哪天惡意用戶A也可以拿着這張假冒的高級會員卡去高爾夫俱樂部打19洞,享受美味的飲料了,而我在月底就會收到高爾夫俱樂部的賬單!
瞭解CSRF的機制之後,危害性我相信大家已經不言而喻了,我可以僞造某一個用戶的身份給其好友發送垃圾信息,這些垃圾信息的超鏈接可能帶有木馬程序或者一些欺騙信息(比如借錢之類的),如果CSRF發送的垃圾信息還帶有蠕蟲鏈接的話,那些接收到這些有害信息的好友萬一打開私信中的連接就也成爲了有害信息的散播着,這樣數以萬計的用戶被竊取了資料種植了木馬。整個網站的應用就可能在瞬間奔潰,用戶投訴,用戶流失,公司聲譽一落千丈甚至面臨倒閉。曾經在MSN上,一個美國的19歲的小夥子Samy利用css的background漏洞幾小時內讓100多萬用戶成功的感染了他的蠕蟲,雖然這個蠕蟲並沒有破壞整個應用,只是在每一個用戶的簽名後面都增加了一句“Samy 是我的偶像”,但是一旦這些漏洞被惡意用戶利用,後果將不堪設想,同樣的事情也曾經發生在新浪微博上面。
舉例:
CSRF攻擊的主要目的是讓用戶在不知情的情況下攻擊自己已登錄的一個系統,類似於釣魚。如用戶當前已經登錄了郵箱,或bbs,同時用戶又在使用另外一個,已經被你控制的站點,我們姑且叫它釣魚網站。這個網站上面可能因爲某個圖片吸引你,你去點擊一下,此時可能就會觸發一個js的點擊事件,構造一個bbs發帖的請求,去往你的bbs發帖,由於當前你的瀏覽器狀態已經是登陸狀態,所以session登陸cookie信息都會跟正常的請求一樣,純天然的利用當前的登陸狀態,讓用戶在不知情的情況下,幫你發帖或幹其他事情。
二、CSRF防禦
- 通過 referer、token 或者 驗證碼 來檢測用戶提交。
- 儘量不要在頁面的鏈接中暴露用戶隱私信息。
- 對於用戶修改刪除等操作最好都使用post 操作 。
- 避免全站通用的cookie,嚴格設置cookie的域。