【问题标题】:Laravel 5.3 POST and tokenmismatchLaravel 5.3 POST 和令牌不匹配
【发布时间】:2017-04-06 01:29:19
【问题描述】:

我有一个页面,我想要一个 POST 发送到该页面,该页面将触发数据库更新。该请求将来自另一个站点。

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

请求包含单个元素

(原始)

id=12345

(表单数据)

id: 12345

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

TokenMismatchException in VerifyCsrfToken.php line 68:

【问题讨论】:

    标签: php laravel-5 http-post token


    【解决方案1】:

    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 并传递您的 url,例如:

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

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

    【讨论】:

    • 我真的无法控制“发件人”发送的内容。我只知道有一个名为“id”的元素有一个 5 位数的 id。
    • 在您的参考资料中,我确实找到了描述如何从 csrf 中排除 URI 的部分!所以,这解决了我的问题!谢谢。
    • 如果您认为这个答案对您有帮助,您可以投票赞成:P
    猜你喜欢
    • 2017-06-21
    • 2017-06-06
    • 2015-10-24
    • 2015-12-20
    • 1970-01-01
    • 2019-11-11
    • 2020-05-10
    • 2016-10-24
    • 2015-09-03
    相关资源
    最近更新 更多