維基百科,自由的百科全書php
跨站請求僞造(英語:Cross-site request forgery),也被稱爲 one-click attack 或者 session riding,一般縮寫爲 CSRF 或者 XSRF, 是一種挾制用戶在當前已登陸的Web應用程序上執行非本意的操做的攻擊方法。[1] 跟跨網站腳本(XSS)相比,XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶網頁瀏覽器的信任。web
[隱藏] 瀏覽器
跨站請求攻擊,簡單地說,是攻擊者經過一些技術手段欺騙用戶的瀏覽器去訪問一個本身曾經認證過的網站並執行一些操做(如發郵件,發消息,甚至財產操做如轉帳和購買商品)。因爲瀏覽器曾經認證過,因此被訪問的網站會認爲是真正的用戶操做而去執行。這利用了web中用戶身份驗證的一個漏洞:簡單的身份驗證只能保證請求發自某個用戶的瀏覽器,卻不能保證請求自己是用戶自願發出的。安全
假如一家銀行用以執行轉帳操做的URL地址以下: http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName服務器
那麼,一個惡意攻擊者能夠在另外一個網站上放置以下代碼: <img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">cookie
若是有帳戶名爲Alice的用戶訪問了惡意站點,而她以前剛訪問過銀行不久,登陸信息還沒有過時,那麼她就會損失1000資金。session
這種惡意的網址能夠有不少種形式,藏身於網頁中的許多地方。此外,攻擊者也不須要控制放置惡意網址的網站。例如他能夠將這種地址藏在論壇,博客等任何用戶生成內容的網站中。這意味着若是服務器端沒有合適的防護措施的話,用戶即便訪問熟悉的可信網站也有受攻擊的危險。網站
透過例子可以看出,攻擊者並不能經過CSRF攻擊來直接獲取用戶的帳戶控制權,也不能直接竊取用戶的任何信息。他們能作到的,是欺騙用戶瀏覽器,讓其以用戶的名義執行操做。spa
HTTP頭中有一個Referer字段,這個字段用以標明請求來源於哪一個地址。在處理敏感數據請求時,一般來講,Referer字段應和請求的地址位於同一域名下。以上文銀行操做爲例,Referer字段地址一般應該是轉帳按鈕所在的網頁地址,應該也位於www.examplebank.com之下。而若是是CSRF攻擊傳來的請求,Referer字段會是包含惡意網址的地址,不會位於www.examplebank.com之下,這時候服務器就能識別出惡意的訪問。token
這種辦法簡單易行,工做量低,僅須要在關鍵訪問處增長一步校驗。但這種辦法也有其侷限性,因其徹底依賴瀏覽器發送正確的Referer字段。雖然http協議對此字段的內容有明確的規定,但並沒有法保證來訪的瀏覽器的具體實現,亦沒法保證瀏覽器沒有安全漏洞影響到此字段。而且也存在攻擊者攻擊某些瀏覽器,篡改其Referer字段的可能。
因爲CSRF的本質在於攻擊者欺騙用戶去訪問本身設置的地址,因此若是要求在訪問敏感數據請求時,要求用戶瀏覽器提供不保存在cookie中,而且攻擊者沒法僞造的數據做爲校驗,那麼攻擊者就沒法再執行CSRF攻擊。這種數據一般是表單中的一個數據項。服務器將其生成並附加在表單中,其內容是一個僞亂數。當客戶端經過表單提交請求時,這個僞亂數也一併提交上去以供校驗。正常的訪問時,客戶端瀏覽器可以正確獲得並傳回這個僞亂數,而經過CSRF傳來的欺騙性攻擊中,攻擊者無從事先得知這個僞亂數的值,服務器端就會由於校驗token的值爲空或者錯誤,拒絕這個可疑請求。