CSRF令牌為什么要通過HTTP頭部而不是cookie來驗(yàn)證

首先介紹一下CSRF的驗(yàn)證過程:
client發(fā)送get請(qǐng)求 -> 服務(wù)生成XSRF-TOKEN懂缕,存入用戶session中。返回響應(yīng)王凑,響應(yīng)包含XSRF-TOKEN cookie -> 瀏覽器接收響應(yīng)后自動(dòng)保存cookie -> js獲取此cookie的值搪柑,構(gòu)造X-XSRF-TOKEN頭部 -> 向server發(fā)送post請(qǐng)求 -> server通過client傳遞過來的包含server_id的cookie反序列化此用戶的session數(shù)據(jù) -> 從session中拿出用戶的CSRF-TOKEN與請(qǐng)求頭中的值進(jìn)行對(duì)比 -> 驗(yàn)證通過或失敗

然后想象這么一種場(chǎng)景。有一個(gè)正常域名A被XSS注入索烹,其中的惡意代碼如下:

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

這時(shí)工碾,當(dāng)你打開此頁面后,瀏覽器會(huì)默認(rèn)發(fā)起http請(qǐng)求百姓,請(qǐng)求地址就是src中的地址渊额。因?yàn)槭菫g覽器發(fā)出的請(qǐng)求,所以這個(gè)請(qǐng)求默認(rèn)會(huì)帶上此域名的cookies。如果恰好你在bank.example.com這個(gè)域名是登陸狀態(tài)端圈,那么就會(huì)中招了焦读。

這里重點(diǎn)強(qiáng)調(diào)一下cookie的機(jī)制:瀏覽器向一個(gè)域名發(fā)起http請(qǐng)求時(shí)會(huì)帶上瀏覽器保存的關(guān)于那個(gè)域名的cookies,而不管你從哪個(gè)網(wǎng)站發(fā)請(qǐng)求舱权。上面的例子,請(qǐng)求就是從域名A發(fā)出的仑嗅。

清楚了上面的攻擊手段宴倍,對(duì)于CSRF驗(yàn)證令牌為什么放在頭部這個(gè)問題就很好理解了。為了添加新的頭部仓技,js就必須獲取XSRF-TOKEN的值鸵贬,然后構(gòu)造X-XSRF-TOKEN頭部。而對(duì)于上面那種攻擊手段脖捻,是沒有能力獲取cookie的阔逼。

那么問題又來了,既然域名A都已經(jīng)被入侵了地沮,那攻擊者完全可以植入js代碼嗜浮,然后獲取cookie,構(gòu)造頭部摩疑,這一系列操作不也是輕而易舉的嗎危融?

答案是,不行雷袋。因?yàn)閖s要獲取cookie存在三個(gè)因素的限制:

  • Path吉殃。也就是URI的路徑,路徑不同楷怒,不允許訪問
  • Doamin蛋勺。域名不同不允許訪問
  • http-only。設(shè)置為true之后鸠删,js不能訪問

很顯然抱完,因?yàn)楫?dāng)前發(fā)起請(qǐng)求所在的域名和攻擊者的目標(biāo)域名不一樣,所以即使頁面被注入的js代碼冶共,也無法獲取目標(biāo)域名的cookie乾蛤。其次,對(duì)于存放session_id的cookie捅僵,一般都設(shè)置為http-only家卖,禁止js讀取,這也是防止xss攻擊的主要手段庙楚。

綜上所述上荡,對(duì)于存放CSRF令牌的cookie應(yīng)該取消http-only的設(shè)置,同時(shí)session_idcookie默認(rèn)要啟用http-only屬性,此時(shí)后端采用通過頭部驗(yàn)證令牌的方式才能全面的防范CSRF攻擊酪捡。

備注:

  1. axios在發(fā)送POST請(qǐng)求時(shí)叁征,如果當(dāng)前域名存在XSRF-TOKENcookie,它自動(dòng)會(huì)構(gòu)造好X-XSRF-TOKEN頭部逛薇。
  2. 關(guān)于XSRF-TOKEN捺疼,session_id這些cookie的名字,不同的框架可能會(huì)有所不同永罚,但是功能都是一樣的啤呼。

完!

參考資料
MDN - Cookies
laravel - CSRF Protection
laravel的CSRF防護(hù)機(jī)制和延伸

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呢袱,一起剝皮案震驚了整個(gè)濱河市官扣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羞福,老刑警劉巖惕蹄,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異治专,居然都是意外死亡卖陵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門看靠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赶促,“玉大人,你說我怎么就攤上這事挟炬∨副酰” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵谤祖,是天一觀的道長(zhǎng)婿滓。 經(jīng)常有香客問我,道長(zhǎng)粥喜,這世上最難降的妖魔是什么凸主? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮额湘,結(jié)果婚禮上卿吐,老公的妹妹穿的比我還像新娘。我一直安慰自己锋华,他們只是感情好嗡官,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著毯焕,像睡著了一般衍腥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天婆咸,我揣著相機(jī)與錄音竹捉,去河邊找鬼。 笑死尚骄,一個(gè)胖子當(dāng)著我的面吹牛块差,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乖仇,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼憾儒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了乃沙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤诗舰,失蹤者是張志新(化名)和其女友劉穎警儒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眶根,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜀铲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了属百。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片记劝。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖族扰,靈堂內(nèi)的尸體忽然破棺而出厌丑,到底是詐尸還是另有隱情,我是刑警寧澤渔呵,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布怒竿,位于F島的核電站,受9級(jí)特大地震影響扩氢,放射性物質(zhì)發(fā)生泄漏耕驰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一录豺、第九天 我趴在偏房一處隱蔽的房頂上張望朦肘。 院中可真熱鬧,春花似錦双饥、人聲如沸媒抠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽领舰。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冲秽,已是汗流浹背舍咖。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锉桑,地道東北人排霉。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像民轴,于是被迫代替她去往敵國(guó)和親攻柠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359