Web安全教程之CSRF(跨站點請求偽造)
我們在前端面試過程中遇到的另一個最多的問題就是web安全了,這次我們來聊聊CSRF攻擊。CSRF是一種常見的攻擊,但是也是web安全中最容易被忽略的一種攻擊方式。下面話不多說了,來一起看看詳細的介紹吧。
什么是CSRF(跨站點請求偽造)
根據(jù)字面意思,大概能猜到,CSRF攻擊就是攻擊者偽造了用戶的請求,在用戶不知道的情況下,以用戶的名義向服務器發(fā)送惡意請求。常見的場景是,用戶首先登陸一個正常(下面稱為被攻擊網(wǎng)站)的網(wǎng)站,攻擊者誘使用戶在不關閉被攻擊網(wǎng)站的同時打開攻擊者的頁面,這時攻擊者就可以以用戶的名義給被攻擊網(wǎng)站發(fā)送惡意請求了??梢钥闯鯟SRF是有條件的,首先用戶要登陸被攻擊網(wǎng)站,并生成Cookie,然后在不登出被攻擊網(wǎng)站的同時,訪問攻擊網(wǎng)站。這兩個條件缺一不可。
CSRF進階
瀏覽器Cookie策略
CSRF之所以能成功,主要還是因為用戶的瀏覽器成功發(fā)送了Cookie的緣故。瀏覽器所持有的Cookie分為兩種:一種是“Session Cookie”,又叫“臨時Cookie”;另一種是“Third-party Cookie”,也稱為“本地Cookie”。
Third-party Cookie,服務器在Set-Cookie時指定了Expire時間,只有到了Expire時間后Cookie才會失效,而Session Cookie則沒有指定Expire時間,瀏覽器關閉后就失效了。如果瀏覽器從一個域的頁面中,要加載另一個域的資源,由于安全原因,某些瀏覽器會阻止Third-party Cookie的發(fā)送。由于新打開的頁面和原來的頁面在同一個瀏覽器進程中,所以Session Cookie將會被發(fā)送。
IE瀏覽器處于安全考慮是禁止瀏覽器在<img>、<iframe>、<script>、<link>等標簽中發(fā)送第三方Cookie的。當前的主流瀏覽器中,默認會攔截Third-party Cookie的有:IE6~8、Safari,不會攔截的有:Firefox、Opera、Chrome等。
只有GET請求么?
在CSRF攻擊流行之初,有一種錯誤的觀點認為CSRF攻擊只能由GET發(fā)起,這種錯誤觀點的形成原因是大多數(shù)CSRF攻擊發(fā)起時,使用的HTML標簽都是<img>、<iframe>、<script>等帶src屬性的標簽,這列標簽只能夠發(fā)起一次GET請求,而不能發(fā)起POST請求。然而,對于攻擊者來說,有若干種方法可以構造出一個POST請求。最簡單的方法就是在一個頁面中構造好一個form表單,然后使用javascript自動提交這個表單。
<form action="http://www.a.com/register" id="register" method="post" accept-charset="utf-8"> <input type="text" name="username" value=""/> <input type="password" name="password" value=""/> <input type="submit" name="submit" value="submit"/> </form> <script> var f = document.getElementById("register"); f.inputs[0].value = "test"; f.inputs[1].value = "passwd"; f.submit(); </script>
CSRF防御
驗證碼
驗證碼是對抗CSRF攻擊最簡單有效地防御方法。CSRF攻擊往往是在用戶不知情的情況下構造了網(wǎng)絡請求。而驗證碼則強制用戶必須與應用進行交互,才能完成最終請求。
但是驗證碼并不是萬能的,我們不可能給頁面的所有操作都加上驗證碼。
Referer Check
Referer Check在互聯(lián)網(wǎng)中最常見的應用就是“防止圖片盜鏈”。同理,Referer Check也可以被用于檢查請求是否來自合法的源。
Anti CSRF Token
CSRF攻擊存在的本質原因還是網(wǎng)頁中重要操作的所有參數(shù)都是可以被攻擊者猜測到的。攻擊者只有預測出url所有參數(shù)與參數(shù)值,才能成功地構造一個偽造的請求。所以我們可以通過把參數(shù)加密,或者使用一些隨機數(shù),從而讓攻擊者無法猜測到參數(shù)值。
我們可以給請求新增加一個token,這個token值是隨機的。
http://host/path/delete?username=abc&item=123&token=[random(seed)]
由于token的存在,攻擊者就無法再構造出一個完整的url來實施CSRF攻擊了。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對本站的支持。
版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。