当前位置: 首页 > 知识库问答 >
问题:

即使在后Laravel 5中提供了令牌,CSRF令牌也不匹配

莘翰采
2023-03-14

我试图张贴使用ajax在laravel 5.我得到CSRF令牌不匹配异常。我环顾四周,发现可能存在这样的问题,但在这种情况下,我确实包括了所有必要的代码。

请看一下我的代码。

看法

{!! Form::open(array('url'=>'admin/index','method'=>'POST', 'id'=>'addrole')) !!}
<div class="control-group">
  <div class="controls">
     {!! Form::text('user','',array('id'=>'','class'=>'form-control span6','placeholder' => 'Username')) !!}
  </div>
</div>
<div class="control-group">
  <div class="controls">
      {!! Form::text('role','faculty',array('class'=>'form-control span6', 'placeholder' => 'User Role')) !!}
      <input type="hidden" name="_token" value="{{ csrf_token()}}">
  </div>
</div>
{!! Form::button('Submit', array('class'=>'send-btn')) !!}
{!! Form::close() !!}

<script type="text/javascript">

    $.ajaxSetup({
       headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') }
    });

    $(document).ready(function(){
        $('.send-btn').click(function(){
            $.ajax({
                url: 'index',
                type: "post",
                data: {
                    '_token': $('input[name="_token"]').val(),
                    'user':$('input[name=user]').val(),
                    'role':$('input[name=role]').val()
                }, //, '_token': $('input[name=_token]').val()
                success: function(data) {
                    alert(data);
                }
            });
        });
    });
</script>

我已经在隐藏输入中提供了令牌,并将其包含在我的帖子中。

我有一个元在头如下。

<meta name="_token" content="{!! csrf_token() !!}"/>

下面是我的控制器。

public function index()
{
    if(Request::ajax()) {
        $data = Input::all();
        print_r($data);die;
    }
}

这个只是测试用的,这里没什么。我的路线如下

Route::get('admin/index', function() {
  return View::make('admin');
});
Route::post('admin/index', 'AdminController@index');

请帮我解决这个问题

这是日志中的输出。

[2015-11-12 09:04:31] local.ERROR: exception 'Illuminate\Session\TokenMismatchException' in /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:46
Stack trace:
#0 /var/www/html/vidman-laravel/app/Http/Middleware/VerifyCsrfToken.php(17): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#1 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(125): App\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#2 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(55): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#3 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(125): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#4 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(61): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#5 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(125): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#6 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(36): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#7 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(125): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#8 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(40): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#9 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(125): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(42): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#11 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(125): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#12 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#13 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(101): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#14 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(115): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#15 /var/www/html/vidman-laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(84): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#16 /var/www/html/vidman-laravel/public/index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#17 {main} 

以下是我的浏览器控制台帖子标题和页面内csrf令牌不匹配。请看下面

页面中的令牌==

浏览器文章标题

共有1个答案

史昊焱
2023-03-14

我觉得当你用

{!!  Form::open() !!}

这已经在表单输入标记中包含了csrf_标记。因此,不需要在meta标记或input标记中包含。例如:当您这样做时:

{!! Form::open() !!}
{!! Form::close() !!}

您的表单标签将是这样的:

<form action="your action" method="POST" accept-charset="UTF-8">
     <input type="hidden" value="token_string" name="_token" > 
</form>

现在,在js文件中验证令牌,您可以执行以下操作:

$.ajaxSetup({
    headers:{
        'X-CSRF-Token' : $("input[name='_token'").attr('value')
    }
});
 类似资料:
  • 我已经用html登录表单记录了基本的Apache Jmeter场景,它使用csrf令牌。 应用程序记录的示例令牌如下所示: 到目前为止,我不能得到什么是错误的,非常简单的场景,但有一个问题。我使用的是apache JMeter3.1。

  • 我刚刚创建了一个全新的Laravel6项目,安装了Passport功能(LaravelPassport),并想尝试一下。现在,在Postman中,我尝试访问缺省路由POST/oauth/clients,按预期填充名称并重定向参数。 在这一点上,我将得到一个“CSRF令牌不匹配”错误,我在这里会做错什么?我知道这是一个非常有限的信息继续下去,如果需要更多的问了。 运行Laravel网站与'php工匠

  • 我在Laravel5.2中遇到AJAX POST请求问题。我正在AJAX请求中传递一个有效的CSRF令牌。 使用Laravel Collective HTML package form标记打开和关闭表单,该标记会自动添加一个带有CSRF标记的隐藏标记输入。呈现的HTML: 使用Fetch API和FormData执行AJAX请求: CSRF令牌和表单数据位于请求负载中: 请求有效负载和x-csrf

  • 我在PayPal沙盒账户中创建了一个应用程序。我想当一些用户点击“转账”按钮时,然后PayPal将钱从我的账户转移到用户的账户(注意:我们有用户的电子邮件ID)。 因此,可以在没有身份验证的情况下将资金转移到PayPal帐户,就像离线访问方法一样。 感谢先进。

  • 本页描述了解释CSRF攻击的用例(16.1): https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html 但是,如果用户确实登录了银行的网站,那么邪恶的网站难道不可能发出GET请求以获取新的CSRF令牌,并在根本不需要用户的情况下撰写帖子吗? 答案必须是否定的,否则CSRF令牌将毫无用处,但我

  • 问题内容: 我有使用mod_wsgi在apache服务器上运行的django,以及由apache(而不是django)直接提供服务的angularjs应用。我想对django服务器进行POST调用(运行rest_framework),但csrf令牌存在问题。 是否可以通过某种方式从服务器设置令牌而不将其作为模板的一部分放置(因为这些页面没有经过django)? 我希望能够通过GET请求以cooki