我們知道,目前最流行的API設計規格就是restFul API設計了。 restful有五種常見的HTTP方法,分別為:get、post、put、patch及delete。使用html表單非常容易建構get或post方法,但是另外三種方法卻不支援。但是在laravel中,你可以透過表單偽造技術來使用上述的其他三種方法。
推薦教學:《laravel框架》
#準備工作
首先我們要把準備工作做好。我們需要建立兩個路由:一個表單路由,一個接受表單的路由。
// 表单页 Route::get('form', function () { return view('form'); }); // 接受表单请求 Route::any('getform', function () { return \Illuminate\Support\Facades\Request::method(); });
剛開始,我們弄一個最簡單的get請求表單,內容如下:
<form method="get" action="/getform"> <input type="submit" value="sub" /> </form>
點擊提交按鈕後,瀏覽器出現'GET',表示get請求成功發送並被接受。
CSRF保護
然後,我們換成post方法,然後刷新點擊提交按鈕,看會出現設麼情況。你會發現出現“page expired”,狀態碼為419的錯誤。 laravel為什麼接受不了post請求?這裡就要引出laravel的預設CSRF保護機制了。
laravel為了防止被跨站請求偽造攻擊,提供了CSRF令牌保護,所以,除了get方法請求外的所有方法,讀取需要在表單裡加上CSRF令牌,如下:
<input type="hidden" name="_token" value="{{csrf_token()}}">
它還有一個簡寫方法,如下:
@csrf
關閉CSRF保護功能
一般不建議關閉整站CSRF功能,想要關閉非常簡單,只需將Kernel.php檔案中的
\App\Http\Middleware\VerifyCsrfToken::class
這行註解即可。
CSRF 白名單
經常我們需要設定一組不需要CSRF保護的URL,例如對第三方提供的API接口,我們希望所有對外的API介面都不需要CSRF保護。那麼,可以透過CSRF白名單的功能,設定白名單在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/*' ]; }
注意:為方便測試,當測試環境時,csrf功能會自動關閉
表單偽造
#學完了CSRF保護機制後,我們來看看如何進行表單偽造。想要偽造表單也非常的簡單,只需要在表單裡加上
<input type="hidden" name="_method" value="PUT">
或簡寫成
@method('PUT')
下面是一個偽造put請求的表單
以上是laravel的表單偽造與CSRF保護的詳細內容。更多資訊請關注PHP中文網其他相關文章!