首頁  >  文章  >  php框架  >  laravel的表單偽造與CSRF保護

laravel的表單偽造與CSRF保護

齐天大圣
齐天大圣原創
2020-12-14 11:23:311611瀏覽

我們知道,目前最流行的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 = [
        /* 这里是白名单列表 */
        &#39;http://example.com/api/*&#39;,
        &#39;api/*&#39;,
        &#39;a/b/*&#39;
    ];
}

注意:為方便測試,當測試環境時,csrf功能會自動關閉

表單偽造

#學完了CSRF保護機制後,我們來看看如何進行表單偽造。想要偽造表單也非常的簡單,只需要在表單裡加上

<input type="hidden" name="_method" value="PUT">

或簡寫成

@method(&#39;PUT&#39;)

下面是一個偽造put請求的表單

@csrf @method(&#39;PUT&#39;)

以上是laravel的表單偽造與CSRF保護的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn