Laravel教我用新思路防范CSRF

用了半年的Laravel揍堕,越來越喜歡他了喉恋,他大量的設(shè)計都和我的觀念相互印證,而且往往更加精妙和通用梭域。今天就提筆記一個關(guān)于CSRF防護的問題。

我以前的方案

在我之前設(shè)計和使用的系統(tǒng)中搅轿,為了避免有人不小心寫出CSRF漏洞病涨,我會全局禁止$_REQUEST的使用以及混用POST和GET的行為,要求開發(fā)人員分清每個傳入數(shù)據(jù)是POST還是GET璧坟。

于是我會在Reqeust對象上增加get($field_name, $default), post($field_name, $default) 的方法既穆。并且直接在框架代碼啟動的時候?qū)⑷肿兞?_REQUEST置為空數(shù)組赎懦。

Laravel的方案

Part 1 Global CSRF Protection

Laravel推薦在全局注冊VerifyCsrfToken的Middleware,對所有Post,Put,Delete請求自動校驗是否帶合法的_csrf token幻工。而要在表單中添加這個Token励两,只需要在form中加一行:

 <?php echo csrf_field(); ?> 

獲取表單值的方法:

$request->input('name', 'default name');

Part 2 路由層面區(qū)分Post/Get

// 同個Path下的Get,Post請求會根據(jù)配置不同進入不同的處理邏輯
Route::get('/path', 'XXXController@func_get');
Route::post('/path', 'XXXController@func_post');

我覺得Laravel這么設(shè)計比我高明在兩個地方:

  1. 對于新人囊颅,如果在Laravel中新增了一個表單伐蒋,Post發(fā)現(xiàn)提交的時候提示CSRF校驗失敗,他很容易知道有這么個校驗迁酸,且開發(fā)環(huán)境下可以友好的提示他如何搞定這個問題先鱼。
    而我的做法由于和PHP原生行為不一致,第一次碰到的人會很奇怪奸鬓,就算花時間最終搞明白了焙畔,他也會覺得自己掉了個坑,因為我沒有任何提示串远。(其實現(xiàn)在想來是可以有提示的宏多,應(yīng)該將$_REQUEST改成一個每次調(diào)用都拋Exception給予提示的閉包)。

  2. Laravel可以方便的配置例外情況澡罚。本周即將發(fā)布的5.1-LTS版包涵一個我很期待的改進就是可以通過配置伸但,忽略特定路徑下的CSRF校驗,以便兼容第三方代碼組件和第三方的Post數(shù)據(jù)回傳留搔。詳見

依然可能有的問題

我之前的項目中更胖,到后來,會發(fā)現(xiàn)有人寫這樣的代碼:

$val = $request->get('name', $request->post('name', 'defailt name'));

這么寫有時候是真的需要隔显;但大多數(shù)時候只是因為懶/或者copy來的代碼自己也沒搞明白却妨。

在Laravel中也無法完全避免這類問題,因為路由配置的時候除了Rouet::get() Route::post() 還有個大殺器 Route::any()括眠,它同時兼容get和post請求彪标,間接引入了同樣的問題。

遺憾

雖然在Laravel中掷豺,上述問題我可以增加UnitTest捞烟,檢查大家對any()的使用,但實在不夠優(yōu)雅当船,誰有更好的思路题画,非常希望你能來信告訴我 icedfish@gmail.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末生年,一起剝皮案震驚了整個濱河市婴程,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抱婉,老刑警劉巖档叔,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桌粉,死亡現(xiàn)場離奇詭異,居然都是意外死亡衙四,警方通過查閱死者的電腦和手機铃肯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來传蹈,“玉大人押逼,你說我怎么就攤上這事〉虢纾” “怎么了挑格?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沾歪。 經(jīng)常有香客問我漂彤,道長,這世上最難降的妖魔是什么灾搏? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任挫望,我火速辦了婚禮,結(jié)果婚禮上狂窑,老公的妹妹穿的比我還像新娘媳板。我一直安慰自己,他們只是感情好泉哈,可當我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布蛉幸。 她就那樣靜靜地躺著,像睡著了一般旨巷。 火紅的嫁衣襯著肌膚如雪巨缘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天采呐,我揣著相機與錄音,去河邊找鬼搁骑。 笑死斧吐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仲器。 我是一名探鬼主播煤率,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乏冀!你這毒婦竟也來了蝶糯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤辆沦,失蹤者是張志新(化名)和其女友劉穎昼捍,沒想到半個月后识虚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡妒茬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年担锤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乍钻。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡肛循,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出银择,到底是詐尸還是另有隱情多糠,我是刑警寧澤,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布浩考,位于F島的核電站夹孔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怀挠。R本人自食惡果不足惜析蝴,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绿淋。 院中可真熱鬧闷畸,春花似錦、人聲如沸吞滞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裁赠。三九已至殿漠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佩捞,已是汗流浹背绞幌。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留一忱,地道東北人莲蜘。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像帘营,于是被迫代替她去往敵國和親票渠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,687評論 2 351

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