我們知道,目前最流行的api設(shè)計規(guī)范就是restful api設(shè)計了。restful有五種常見的http方法,即:get、post、put、patch及delete。使用html表單非常容易構(gòu)造get或post方法,但是另外三種方法卻不支持。但是在laravel中,你可以通過表單偽造技術(shù)來使用上述的其他三種方法。
推薦教程:《laravel框架》
準備工作
首先我們要把準備工作做好。我們需要創(chuàng)建兩個路由:一個表單路由,一個接受表單的路由。
//?表單頁 Route::get('form',?function?()?{ ????return?view('form'); }); //?接受表單請求 Route::any('getform',?function?()?{ ????return?IlluminateSupportFacadesRequest::method(); });
剛開始,我們弄一個最簡單的get請求表單,內(nèi)容如下:
點擊提交按鈕后,瀏覽器出現(xiàn)’GET’,表示get請求成功發(fā)送并被接受。
csrf保護
然后,我們換成post方法,然后刷新點擊提交按鈕,看會出現(xiàn)設(shè)么情況。你會發(fā)現(xiàn)出現(xiàn)“page expired”,狀態(tài)碼為419的錯誤。laravel為什么接受不了post請求?這里就要引出laravel的默認CSRF保護機制了。
laravel為了防止被跨站請求偽造攻擊,提供了CSRF令牌保護,所以,除了get方法請求外的所有方法,讀需要在表單里加上CSRF令牌,如下:
<input>
它還有一種簡寫方法,如下:
@csrf
關(guān)閉CSRF保護功能
一般不建議關(guān)閉整站CSRF功能,想要關(guān)閉非常簡單,只需將Kernel.php文件中的
AppHttpMiddlewareVerifyCsrfToken::class
這行注釋即可。
CSRF 白名單
經(jīng)常我們需要設(shè)置一組不需要CSRF保護的URL,比如對第三方提供的API接口,我們希望所有對外的API接口都不需要CSRF保護。那么,可以通過CSRF白名單的功能,設(shè)置白名單在app/Http/Middleware/VerifyCsrfToken.php文件操作。如下:
class?VerifyCsrfToken?extends?Middleware { ????/** ?????*?The?URIs?that?should?be?excluded?from?CSRF?verification. ?????* ?????*?@var?array ?????*/ ????protected?$except?=?[ ????????/*?這里是白名單列表?*/ ????????'http://example.com/api/*', ????????'api/*', ????????'a/b/*' ????]; }
注意:為方便測試,當(dāng)測試環(huán)境時,csrf功能會自動關(guān)閉
表單偽造
學(xué)完了CSRF保護機制后,我們來看看如何進行表單偽造。想要偽造表單也非常的簡單,只需要在表單里添加
<input>
或簡寫成
@method('PUT')
下面是一個偽造put請求的表單