Laravel 5.2: токен csrf не работает
Привет, почему мое значение токена csrf равно null ? И когда я не использую маркер, я не TokenMismatchException!!!! как я могу это исправить ?
я копнул глубже и обнаружил, что сеанс не регистрируется в SessionServiceProvider. Есть ли что-то, что нужно включить, чтобы это работало по умолчанию? Поскольку я новичок в Laravel, я не уверен, как следовать приведенным выше советам. Как убедиться, что мои маршруты добавлены в группу "web"?
<form method="post" action="<?php echo url('/form'); ?>">
<input type="hidden" name="_Token" value="{{ csrf_token() }}">
<input type="text" name="Title" placeholder="Title"><br>
<textarea rows="10" name="Content" placeholder="Content"></textarea><br>
<input type="submit" value="Send">
</form>
15 ответов
убедитесь, что ваш маршрут имеет web milddleware применяется к нему.
практически любой маршрут, где вам понадобятся сеансы, защита csrf, зашифрованные файлы cookie ,ошибки сеанса и т. д... вам понадобится группа промежуточного программного обеспечения "web".
Проверьте свои маршруты.php файл для группы маршрутов так:
Route::group(['middleware' => 'web'], function () {
//
});
обновление: С 5.2.27 В RouteServiceProvider
теперь помещает все ваши маршруты в routes.php
в группе маршрутов, которая имеет web
промежуточное применяется для вас.
В версии 5.2: вы перемещаете маршрут в:
Route::group(['middleware' => ['web']], function () {
//Your route here
});
есть два способа использовать токен в форме (https://laravel.com/docs/master/routing#csrf-protection):
// Vanilla PHP
<?php echo csrf_field(); ?>
// Blade Template Syntax
{{ csrf_field() }}
или
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
убедитесь в том, что путь сеанса доступен для записи. Если нет, laravel сравнивает null (без токена сеанса) со значением $_POST['_token'] и выдает ошибку несоответствия, несмотря на реальную причину.
просто incase кто-нибудь все еще ударяет по этой проблеме,
внутри config / session.в PHP мои сеансы по существу не работали (хотя какое-то время они казались нормальными)
убедитесь, что 'домен установлен null!
исправлено все для меня, как ни одна из других вещей, где на самом деле моя проблема.
надеюсь, это кому-то поможет.
отредактируйте VerifyCsrfToken.php из папки Middleware в эту
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
return $response;
}
}
У меня такая же проблема, как и у вас, я на Laravel 5.2, у меня также есть поле токена в моей форме, но все еще бросает мне ошибку "TokenMismatch" очень раздражает, верно?
Я думаю, что это довольно глубокая проблема, поскольку может быть много причин этого. Для меня я обновлялся с Laravel 5.1 до 5.2. Я также использую базу данных для хранения моих сеансов. Это давало мне эту ошибку, но когда я проверил журналы ошибок laravel (/storage / logs), я обнаружил, что Laravel 5.2 ожидает, что таблица сеанса будет иметь поля user_id, ip_address и user_agent. Моя нет. Когда я добавил Эти поля все же, как и до обновления. Итак, мой совет-проверить ошибку бревно!
это ответ для всех людей, которые уже использовали {{ csrf_field() }}
после <form>
тег в view.blade.php
файл, а также запустить php artisan key:generate
команда, но все еще получает ошибку несоответствия маркеров. Вот шаги, которые я предпринял для устранения ошибки TokenMismatchException для одного из моих проектов, который все еще находился в разработке.
удалить файлы кэша из следующих двух папок в проекте laravel:
- хранение / рамки / сеансы/
- хранение/рамки/просмотров/
после удаления файлов кэша очистите кэш браузера.
возможно, вы можете использовать это : (src = https://laravel.com/docs/5.2/routing)
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
Я могу подтвердить эту проблему, как csrf_token (), так и csrf_field () производят пустые поля токенов в Laravel 5.2. Согласно документам, оба метода должны по-прежнему работать, но они, похоже, этого не делают. Моя установка полностью свежая, поэтому либо документы неверны, либо присутствует ошибка.
вы можете просто использовать это:
<form method="POST" action="/addUser" >
{!! csrf_field() !!}
...
</form>
у меня такая же проблема. Я не нашел как исправить основную проблему, но я думаю, что это достойный исправить:
Laravel 5.x: перенаправить ошибки CSRF на предыдущую страницу
Так что вместо того, чтобы бросить TokenMismatchException
redirect
пользователя на предыдущую страницу с сообщением об ошибке.
Для того, чтобы сделать это override
VerifyCsrfToken.($request, Closure $next)
метод.
Открыть App\Http\Middleware\VerifyCsrfToken.php
и попал в базовый класс (Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
) и скопировать метод дескриптора внутри App\Http\Middleware\VerifyCsrfToken.php
и изменить строку, которая бросает TokenMismatchException
перенаправить на предыдущую страницу. также добавить импорт use Closure;
. Так что после всех изменений,App\Http\Middleware\VerifyCsrfToken.php
будет выглядеть так:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
/**
* Class VerifyCsrfToken
* @package App\Http\Middleware
*/
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
public function handle($request, Closure $next)
{
if (
$this->isReading($request) ||
$this->runningUnitTests() ||
$this->shouldPassThrough($request) ||
$this->tokensMatch($request)
) {
return $this->addCookieToResponse($request, $next($request));
}
//throw new TokenMismatchException;
return Redirect::back()->withError('Sorry, we could not verify your request. Please try again.');
}
}
решение 2-использовать Кофеин Для Laravel.
Кофеин для Laravel-это пакет, предназначенный для предотвращения тайм-аута пользователей CSRF token на вашем сайте при заполнении формы.
Майк, создатель пакета, хотел иметь безопасный способ облегчить жизнь пользователям, которые не торопятся заполнять формы, сохраняя токен бодрствующим через закулисный ajax вызов.
У меня была такая же проблема. Решил это, удалив все файлы в папку sessions. Путь к папке сеансов: yourApplication / storage/framework/ sessions/
чтобы не проверять безопасность в этой форме, необходимо перейти к пути к файлу: config / auth.php на Laravel. В этом файле вы должны найти (или создать) строку 'no_csrf' => array(),
эта строка должна добавить маршруты, безопасность которых не может быть проверена. В этом расположении вы должны добавить путь к своей форме, например:
'No_csrf' => array('/form'),
мое предложение использовать FormHelper
и Form::open()
на ваш взгляд. Помощники FOMR и HTML были удалены из laravels core в версии 5.0, но вы можете установить их снова после эти инструкция.
в любом случае, в вашем представлении есть опечатка. Правильное имя поля -_token
, а не _Token
. Может, в этом и проблема!--7-->