理解CSRF(跨站請(qǐng)求偽造)

理解CSRF(跨站請(qǐng)求偽造)

原文出處Understanding CSRF

對(duì)于Express團(tuán)隊(duì)的csrf模塊和csurf模塊的加密函數(shù)的用法我們經(jīng)常有一些在意碴里。
這些在意是莫須有的,因?yàn)樗麄儾涣私釩SRF token是如何工作的变勇。
下面快速過(guò)一遍牡拇!

讀過(guò)后還有疑問(wèn)?希望告訴我們錯(cuò)誤?請(qǐng)開(kāi)一個(gè)issue事秀!

一個(gè)CSRF攻擊是如何工作的?

在他們的釣魚(yú)站點(diǎn)野舶,攻擊者可以通過(guò)創(chuàng)建一個(gè)AJAX按鈕或者表單來(lái)針對(duì)你的網(wǎng)站創(chuàng)建一個(gè)請(qǐng)求:

<form action="https://my.site.com/me/something-destructive" method="POST">
  <button type="submit">Click here for free money!</button>
</form>

這是很危險(xiǎn)的易迹,因?yàn)楣粽呖梢允褂闷渌鹔ttp方法例如 delete 來(lái)獲取結(jié)果。
這在用戶的session中有很多關(guān)于你的網(wǎng)站的詳細(xì)信息時(shí)是相當(dāng)危險(xiǎn)的平道。
如果一個(gè)不懂技術(shù)的用戶遇到了睹欲,他們就有可能會(huì)輸入信用卡號(hào)或者個(gè)人安全信息。

如果減輕CSRF攻擊一屋?

只使用JSON api

使用JavaScript發(fā)起AJAX請(qǐng)求是限制跨域的窘疮。
不能通過(guò)一個(gè)簡(jiǎn)單的<form>來(lái)發(fā)送JSON
所以冀墨,通過(guò)只接收J(rèn)SON闸衫,你可以降低發(fā)生上面那種情況的可能性。

禁用CORS

第一種減輕CSRF攻擊的方法是禁用cross-origin requests(跨域請(qǐng)求)诽嘉。
如果你希望允許跨域請(qǐng)求楚堤,那么請(qǐng)只允許 OPTIONS, HEAD, GET 方法疫蔓,因?yàn)樗麄儧](méi)有副作用。

不幸的是身冬,這不會(huì)阻止上面的請(qǐng)求由于它沒(méi)有使用JavaScript(因此CORS不適用)衅胀。

檢驗(yàn)referrer頭部

不幸的是,檢驗(yàn)referrer頭部很麻煩酥筝,
但是你可以阻止那些referrer頭部不是來(lái)自你的頁(yè)面的請(qǐng)求滚躯。
這實(shí)在不值得麻煩。

舉個(gè)例子嘿歌,你不能加載session如果這個(gè)請(qǐng)求的referrer頭部不是你的服務(wù)器掸掏。

GET總是冪等的

確保你的GET請(qǐng)求不會(huì)修改你數(shù)據(jù)庫(kù)中的相關(guān)數(shù)據(jù)。
這是一個(gè)初學(xué)者常犯的錯(cuò)誤宙帝,使得你的應(yīng)用不僅是易于遭受CSRF攻擊丧凤。

避免使用POST

因?yàn)?code><form>只能用GET或是POST,
而不能使用別的方法,例如PUT, PATCH, DELETE步脓,
攻擊者很難有方法攻擊你的網(wǎng)站愿待。

不要復(fù)寫(xiě)方法

許多應(yīng)用程序使用復(fù)寫(xiě)方法來(lái)在一個(gè)常規(guī)表單中使用PUT, PATCH, 和DELETE請(qǐng)求。
這會(huì)使得原先不易受攻擊的方法變得易受攻擊靴患。

不要兼容舊瀏覽器

舊的瀏覽器不支持CORS或是其他安全政策仍侥。
通過(guò)不兼容舊瀏覽器
(那些不懂技術(shù)的人用的越多,我們?cè)饺菀妆还?,
你可以最小化受到攻擊的可能性鸳君。

CSRF Tokens

最終的解決辦法是使用CSRF tokens农渊。
CSRF tokens是如何工作的呢?

  1. 服務(wù)器發(fā)送給客戶端一個(gè)token或颊。
  2. 客戶端提交的表單中帶著這個(gè)token砸紊。
  3. 如果這個(gè)token不合法,那么服務(wù)器拒絕這個(gè)請(qǐng)求囱挑。

攻擊者需要通過(guò)某種手段獲取你站點(diǎn)的CSRF token醉顽,
他們只能使用JavaScript來(lái)做。
所以看铆,如果你的站點(diǎn)不支持CORS,
那么他們就沒(méi)有辦法來(lái)獲取CSRF token盛末,
降低了威脅弹惦。

確保CSRF token不能通過(guò)AJAX訪問(wèn)到!
不要?jiǎng)?chuàng)建一個(gè)/CSRF路由來(lái)獲取一個(gè)token,
尤其不要在這個(gè)路由上支持CORS!

token需要是不容易被猜到的悄但,
讓它很難被攻擊者嘗試幾次得到棠隐。
它不需要是密碼安全的。
攻擊來(lái)自從一個(gè)未知的用戶的一次或者兩次的點(diǎn)擊檐嚣,
而不是來(lái)自一臺(tái)服務(wù)器的暴力攻擊助泽。

BREACH攻擊

這也就是salt(加鹽)出現(xiàn)的原因啰扛。
Breach攻擊相當(dāng)簡(jiǎn)單:如果服務(wù)器通過(guò)HTTPS+gzip多次發(fā)送相同或者相似的響應(yīng),攻擊者就可以猜測(cè)響應(yīng)的內(nèi)容(使得HTTPS完全無(wú)用)嗡贺。
解決辦法隐解?讓每一個(gè)響應(yīng)都有那么一點(diǎn)不同。
于是诫睬,CSRF tokens依據(jù)每一個(gè)不同的請(qǐng)求還有不同的時(shí)間來(lái)生成煞茫。
但是服務(wù)器需要知道客戶端請(qǐng)求中帶的token是否是合法的。
因此:

  1. 一般認(rèn)為安全加密的CSRF tokens是防護(hù)CSRF的關(guān)鍵
  2. CSRF tokens現(xiàn)在通常是一個(gè)秘鑰或者salt的hash

了解更多:

注意摄凡,CSRF沒(méi)有_解決_BREACH攻擊续徽,
但是這個(gè)模塊通過(guò)隨機(jī)化請(qǐng)求來(lái)為你減輕BREACH攻擊。

salt不需要加密

因?yàn)榭蛻舳酥纒alt!!!
服務(wù)器會(huì)發(fā)送 <salt>;<token> 亲澡,然后客戶端會(huì)通過(guò)請(qǐng)求返回相同的值給服務(wù)器钦扭。服務(wù)器然后會(huì)檢驗(yàn) <secret>+<salt>=<token>
salt必須跟token一起被發(fā)送給服務(wù)器床绪,否則服務(wù)器不能驗(yàn)證這個(gè)token客情。
這是最簡(jiǎn)單的加密方式。
還有很多方法会涎,不過(guò)他們更加復(fù)雜裹匙,犯不著那么麻煩。

創(chuàng)建tokens必須要快

因?yàn)槊慨?dāng)進(jìn)來(lái)一個(gè)請(qǐng)求他們就會(huì)被創(chuàng)建!
Math.random().toString(36).slice(2)這么做也是性能足夠好的!
你不需要OpenSSL來(lái)為每一個(gè)請(qǐng)求創(chuàng)建一個(gè)密碼安全的token末秃。

秘鑰不需要是加密的概页,但需要是安全的

如果你正在使用一個(gè)數(shù)據(jù)庫(kù)后端來(lái)存儲(chǔ)session,客戶端是不會(huì)知道秘鑰的练慕,因?yàn)樗淮鎯?chǔ)在數(shù)據(jù)庫(kù)中惰匙。
如果你正在使用cookie來(lái)存儲(chǔ)session,那么秘鑰就會(huì)被存儲(chǔ)在cookie中發(fā)送給客戶端铃将。
因此项鬼, 確保cookie sessions 使用 httpOnly 那樣客戶端就不能通過(guò)客戶端JavaScript來(lái)讀取到秘鑰!

當(dāng)你不正確的使用CSRF token

把它們加到JSON AJAX調(diào)用中

正如上面提到的,如果你不支持CORS并且你的API是傳輸?shù)膰?yán)格的JSON劲阎,
絕沒(méi)可能在你的AJAX 調(diào)用中加入CSRF token绘盟。

通過(guò)AJAX暴露你的CSRF token

不要?jiǎng)?chuàng)建一個(gè)GET /csrf路由
并且尤其不要在這個(gè)路由上支持CORS。
不要發(fā)送CSRF token在API響應(yīng)的body中悯仙。

結(jié)論

因?yàn)閣eb正在向JSON API轉(zhuǎn)移龄毡,并且瀏覽器變得更安全,有更多的安全策略锡垄,
CSRF正在變得不那么值得關(guān)注沦零。
阻止舊的瀏覽器訪問(wèn)你的站點(diǎn),并盡可能的將你的API變成JSON API货岭,
然后你將不再需要CSRF token路操。
但是為了安全起見(jiàn)疾渴,你還是應(yīng)該盡量允許他們尤其是當(dāng)難以實(shí)現(xiàn)的時(shí)候。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屯仗,一起剝皮案震驚了整個(gè)濱河市搞坝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祭钉,老刑警劉巖瞄沙,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異慌核,居然都是意外死亡距境,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)垮卓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)垫桂,“玉大人,你說(shuō)我怎么就攤上這事粟按∥芴玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵灭将,是天一觀的道長(zhǎng)疼鸟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)庙曙,這世上最難降的妖魔是什么空镜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮捌朴,結(jié)果婚禮上吴攒,老公的妹妹穿的比我還像新娘。我一直安慰自己砂蔽,他們只是感情好洼怔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著左驾,像睡著了一般镣隶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诡右,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天安岂,我揣著相機(jī)與錄音,去河邊找鬼稻爬。 笑死嗜闻,一個(gè)胖子當(dāng)著我的面吹牛蜕依,可吹牛的內(nèi)容都是我干的桅锄。 我是一名探鬼主播琉雳,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼友瘤!你這毒婦竟也來(lái)了翠肘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辫秧,失蹤者是張志新(化名)和其女友劉穎束倍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盟戏,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绪妹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柿究。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邮旷。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝇摸,靈堂內(nèi)的尸體忽然破棺而出婶肩,到底是詐尸還是另有隱情,我是刑警寧澤貌夕,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布律歼,位于F島的核電站,受9級(jí)特大地震影響啡专,放射性物質(zhì)發(fā)生泄漏险毁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一植旧、第九天 我趴在偏房一處隱蔽的房頂上張望辱揭。 院中可真熱鬧,春花似錦病附、人聲如沸问窃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)域庇。三九已至,卻和暖如春覆积,著一層夾襖步出監(jiān)牢的瞬間听皿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工宽档, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尉姨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓吗冤,卻偏偏與公主長(zhǎng)得像又厉,于是被迫代替她去往敵國(guó)和親九府。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容