Laravel 5.3 POST和tokenmismatch

时间:2017-04-06 01:29:20

标签: php laravel-5 http-post token

我有一个页面,我希望发送一个POST来触发数据库更新。该请求将来自其他网站。

Route::post('update', 'DatabaseController@update');

请求包含单个元素

(原始)

id=12345

(形式数据)

id: 12345

每当我访问该页面时,都会收到此错误

TokenMismatchException in VerifyCsrfToken.php line 68:

1 个答案:

答案 0 :(得分:0)

Laravel可以轻松保护您的应用程序免受跨站点请求伪造(CSRF)攻击。跨站点请求伪造是一种恶意攻击,即代表经过身份验证的用户执行未经授权的命令。

Laravel为应用程序管理的每个活动用户会话自动生成CSRF“令牌”。此令牌用于验证经过身份验证的用户是否是实际向应用程序发出请求的用户。

无论何时在应用程序中定义HTML表单,都应在表单中包含隐藏的CSRF令牌字段,以便CSRF保护中间件可以验证请求。您可以使用csrf_field帮助程序生成令牌字段:

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

除了检查CSRF令牌作为POST参数之外,VerifyCsrfToken中间件还将检查X-CSRF-TOKEN请求头。例如,您可以将令牌存储在HTML元标记中:

<meta name="csrf-token" content="{{ csrf_token() }}">

然后,一旦创建了元标记,就可以指示像jQuery这样的库自动将标记添加到所有请求标头中。这为基于AJAX的应用程序提供了简单,方便的CSRF保护:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

Reference

注意:要从CSRF验证中排除某些URI,请转到project/app/Http/Middleware,打开文件VerifyCsrfToken.php并传递您的网址,如:

protected $except = [
    '/api/authuser',
];

此数组中传递的url将从CSRF验证的URI中排除。