【问题标题】:Laravel 5.4 token mismatch caused by a select field由选择字段引起的 Laravel 5.4 令牌不匹配
【发布时间】:2021-02-28 15:26:50
【问题描述】:

我正在处理一个旧的 Laravel 项目 (5.4),我对 Laravel 的 TokenMismatchException 并不陌生。但是,这种情况很奇怪,我尝试了一些我可以做的修复。一个视图中的某个选择字段导致 Laravel 抛出此异常。该字段是使用 Ajax 根据先前的选择输入动态填充的。相同的字段组合在我编辑时完美运行,但在我存储时不起作用。以下是我的代码:

<form action="{{ route('feedback.store') }}" method="post" enctype="multipart/form-data" >
        {{ csrf_field() }}
    <div class="row">
        <div class="col-12">
            {{ Form::booleanField('visible', '', '', [], 'Visible') }}
        </div>
    </div>

    <div class="row">
        <div class="col-12">
            <label for="employee_id">Employee</label><span class="required_field"></span>
            <select name="employee_id" id="employee_id" class="form-control">
                <option value="">----</option>
                @foreach($employees as $employee)
                    <option value="{{ $employee['id'] }}">{{ $employee['name'] }}</option>
                @endforeach
            </select>
            <br/>
        </div>
    </div>

    <div class="row">
        <div class="col-12">
            <label for="period_id">{{ translate('Period') }}</label>
            <select id="period_id" name="periods_id" class="form-control"></select>
        </div>
    </div>
...

这里是填写句点字段的 Ajax 函数:

 $('#employee_id').on('change', function () {
            let id = $(this).val();

            if(id == null){
                return;
            }

            $.ajax({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
                url: '/performance/employee-period/'+ id,
                type: 'GET',
                success: function (data) {
                    let select = $('#period_id');
                    select.html(null);
                    select.append(new Option('---', ''));
                    $.each(data, function (key, value) {
                        let option = new Option(value.period.start_date + ' - ' + value.period.end_date, value.period.id);
                        select.append(option);
                    })
                },
            });
        });

商店的路线受到我用于所有其他路线的相同中间件的保护,它们不会引起任何问题。我正在扩展的布局中有一个包含 csrf 令牌的元数据。 如果我提交时没有选择期限,则请求直接通过。 这可能很愚蠢,但我浪费了大约 2 小时试图解决它而无济于事,因此不胜感激。

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    首先注意:在 ajax 中你使用get 方法,你不需要csrf

    第二次这个问题是由 PHP 引起的。更改upload_max_filesizepost_max_size 并重新启动您的apachenginx

    中间解决方案:

    您可以从 App/Http/Middleware/VerifyCsrfToken.php 的某些路由中删除 csrf 限制。下面的代码忽略所有路由中的 csrf 令牌:

    protected $except = [
       '/*'
    ];
    

    但它不安全,只是用来测试和调试你的问题。

    【讨论】:

    • 感谢您的回答,是的,我知道忽略 csrf 解决方案,但正如您所说,它非常不安全并且允许漏洞利用,所以我避免了它。我尝试从 ajax 中删除 csrf 并按照您的建议进行 php 服务器更改,但结果是一样的。
    • 删除 csrf 不是很不安全,但它是不安全的。有时在必要的情况下你可以这样做。但是用它发现错误是不是和csrf有关还是不错的。而且最好用csrf。
    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2016-10-24
    • 2017-10-06
    • 2015-09-29
    • 2020-07-08
    相关资源
    最近更新 更多