什么是 CSRF?
????CSRF Cross-site request forgery因宇,稱為“跨站請求偽造”葛作,是指黑客引誘用戶打開?黑客的網站箭窜,在黑客的網站中膀篮,利用用戶的登錄狀態(tài)發(fā)起的跨站請求嘹狞。簡單來講,CSRF攻擊就是黑客利用了用戶的登錄狀態(tài)誓竿,并通過第三方的站點來做一些壞事磅网。
CSRF 如何攻擊
? ? 1. 用戶登陸網站 A, 網站 A 返回了 登陸狀態(tài) Cookie筷屡;
? ? 2. 用戶又登陸黑客的網站 B涧偷, 此時
? ? ? ? ? ? ① 自動發(fā)請 GET 請求
?????????????????網站 B 中有 圖片,該圖片的地址指向 網站 A
? ? ? ? ? ? ? ? <img src=''http:// 網站 A / 轉賬或者其他接口" />
? ? ? ? ? ? 這樣會自動發(fā)起 img 請求毙死, 請求 A 的時候 會自動帶上 A 的 Cookie, 那么 網站 A 如果沒有做相應的處理的話燎潮,就會轉賬 或者 其他操作;
? ? ? ? ? ? ② 自動發(fā)請?POST 請求
? ? ? ? ? ? ? ? 網站 B 中有一個隱藏的表單扼倘,表單的 action 就是 A 網站轉賬或其他操作接口确封,用戶 打開 網站 B 會自動 提交表單。此?構建自動提交表單這種方式再菊,就可以自動實現(xiàn)跨站點 POST 數(shù)據提交爪喘。
? ? ③ 引用用戶點擊鏈接
? ? ? ? ? ? 這種方式跟 ① 差不多,只是多了一個點擊的步驟袄简,黑客網站 B 上有 誘惑的圖片腥放,誘導用戶點擊 圖片下載的地址
? ??????????<a src=''http:// 網站 A / 轉賬或者其他接口" > 點擊下載</a>
? ? ? ? ? ? 方式 和 ① 一樣 ,只是 需要用戶點擊绿语。
? ? 注意:?和XSS不同的是秃症,CSRF攻擊不需要將惡意代碼注入用戶的頁面候址,僅僅是利用服務器的漏洞和用戶的登錄狀態(tài)來實施攻擊。
預防措施
? ??要發(fā)起CSRF攻擊需要具備三個條件:目標站點存在漏洞种柑、用戶要登錄過目標站點?和?黑客需要通過第三方站點發(fā)起攻擊岗仑。
? ? 1. 驗證碼
? ? ? ? 對于每一次的請求,要求用戶驗證聚请,以確保請求的真是可靠荠雕。
? ? 2.?Referer 檢查、Origin 檢查
? ? ? ? 驗證請求的來源網站驶赏,檢查發(fā)起請求的服務器炸卑,是否為目標服務器。HTTP 請求中的 Referer 頭傳遞了當前請求的域名煤傍,如果此域名是非法服務器的域名盖文,則需要禁止訪問;
? ??????但在服務器端驗證請求頭中的 Referer 并不是太可靠蚯姆,因此又制定了 Origin 屬性五续,在?些重要的場合,比如通過 XMLHttpRequest龄恋、Fecth 發(fā)起跨站請求或者通過 Post 方法發(fā)送請求時疙驾,都會帶上Origin屬性。
? ??????Origin屬性只包含了域名信息郭毕,并沒有包含具體的 URL 路徑它碎,這是 Origin 和 Referer 的?個主要區(qū)別。
? ??????因此铣卡,服務器的策略是優(yōu)先判斷 Origin链韭,如果請求頭中沒有包含 Origin 屬性偏竟,再根據實際情況判斷是否使用 Referer 值煮落。
? ? 3. Token
? ??????在瀏覽器向服務器發(fā)起請求時,服務器生成?個CSRF Token踊谋,這段隨機碼由用戶保存蝉仇,每次請求必須帶上 token。
? ? 4. Cookie 的?SameSite 屬性
? ???????客會利用用戶的登錄狀態(tài)來發(fā)起 CSRF 攻擊殖蚕,而 Cookie 正是瀏覽器和服務器之間維護登錄狀態(tài)的?個關鍵數(shù)據轿衔。
? ??????通常CSRF攻擊都是從第三方站點發(fā)起的,要防止 CSRF 攻擊睦疫,我們最好能實現(xiàn)從第三方站點發(fā)送請求時禁止 Cookie 的發(fā)送害驹,因此在瀏覽器通過不同來源發(fā)送 HTTP 請求時,我們需要進行區(qū)分:
? ? ? ? ????1. 如果是從第三方站點發(fā)起的請求蛤育,那么需要瀏覽器禁止發(fā)送某些關鍵 Cookie 數(shù)據到服務器宛官;
? ? ? ? ????2. 如果是同?個站點發(fā)起的請求葫松,那么就需要保證 Cookie 數(shù)據正常發(fā)送。
? ? ????????我們可以通過設置?set-cookie 的?SameSite底洗, SameSite 選項通常有 Strict腋么、Lax 和 None 三個值。
? ??????Strict最為嚴格亥揖,瀏覽器會完全禁止第三方 Cookie珊擂,比如 A 網站的 Cookie 設置了這個屬性,那么 B 網站訪問 A 费变,Cookie 是不會發(fā)送到 A 網站上的摧扇,只有 A 的站點 去請求 A 服務器,才會帶上;
? ??????Lax 相對寬松?點赖阻。在跨站點的情況下峡扩,從第三方站點的鏈接打開和從第三方站點提交Get?式的表單這兩種?式都會攜帶Cookie。但如果在第三方站點中使用 Post 方法庇绽,或者通過img、iframe等標簽加載的URL橙困,這些場景都不會攜帶 Cookie瞧掺;
????????使用 None 的話,在任何情況下都會發(fā)送 Cookie 數(shù)據凡傅。
? ? ? ? 所以在實際情況下辟狈,我們將?些關鍵的 Cookie 設置為 Strict 或者 Lax 模式,這樣在跨站點請求時夏跷,這些關鍵的 Cookie 就不會被發(fā)送到服務器哼转,這樣 CSRF 就會攻擊失效。