2015-12-26 7 views
7

Привет, Почему значение токена csrf равно null? И когда я не использую токен, я не знаю TokenMismatchException !!!! как я могу это исправить?Laravel 5.2: токен csrf не работает

Look at the image Please

я копал глубже и обнаружил, что сеанс не регистрируется в SessionServiceProvider. Есть ли что-то, что должно быть включено для этого, чтобы работать по умолчанию? Поскольку я начинающий Laravel, я не уверен, как следовать приведенному выше совету. Как я могу убедиться, что мои маршруты добавлены в группу «Интернет»?

<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> 
+1

Публикация изображения не очень поможет. Является ли ваша страница шаблоном клинка? например 'Ваш-page.blade.php'? – Franco

+0

@Franco Да. моя страница имеет .blade.php. Я пишу csrf_token(), но когда я проверяю элемент страницы. Значение входного значения _token равно null! –

+1

Это странно. Я использую это все время без проблем. Попробуйте повторить токен, посмотрите, что произойдет «value =» "' – Franco

ответ

22

Убедитесь, что на вашем маршруте есть web milddleware.

Практически любой маршрут, где вам нужны сессии, защита csrf, зашифрованные файлы cookie, ошибки сеанса и т. Д., Вам понадобится группа промежуточного программного обеспечения «web».

Проверьте routes.php файл для группы маршрутов, как так:

Route::group(['middleware' => 'web'], function() { 
    // 
}); 

Обновление: С 5.2.27 RouteServiceProvider теперь помещает все ваши маршруты в routes.php в маршрутной группе, имеющей web промежуточное программное обеспечение подал заявку на вас.

0

Может быть, вы можете использовать это: (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> 
+0

Доза не работает !! Aa, я работаю в localhost! Ваш csrf_fied или токен работал в localhost? localhost нужна конфигурация? –

+0

Я отредактировал свой ответ, надеюсь, он вам поможет – Kokno

+0

Спасибо, но не работает –

0

Я могу подтвердить эту проблему, как csrf_token() и csrf_field() производят пустые поля маркера в Laravel 5.2. Согласно документам, оба метода должны работать, но они, похоже, не делают этого. Моя установка полностью свежая, так что документы являются неправильными или присутствует ошибка.

+2

- ваш маршрут, используя «web» промежуточное ПО? – lagbox

+0

Сделал трюк! :) – Jasper

0

У меня такая же проблема. Я не нашел, как исправить основную проблему, но я думаю, что это достойное исправление: Laravel 5.x: Redirect CSRF Errors to Previous Page
Так что вместо этого выкинуть TokenMismatchExceptionredirect пользователь на предыдущую страницу с сообщением об ошибке.
Для этого overrideVerifyCsrfToken.($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 является использование Caffeine For Laravel.
Caffeine For Laravel - это пакет, предназначенный для предотвращения использования токена CSRF от тайм-аутов на вашем сайте при заполнении формы.
Майк, создатель пакета, хотел иметь безопасный способ облегчить жизнь пользователям, которые забирают свое время, заполняя формы, сохраняя токен, просыпающийся за кулисами ajax call.

0

Вы можете просто использовать это:

<form method="POST" action="/addUser" > 
{!! csrf_field() !!} 
... 
</form> 
4

В версии 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(); ?>"> 
1

Я думаю, что это довольно глубокая проблема, так как может быть много причин этого. Для меня я обновлялся с Laravel 5.1 до 5.2. Я также использую базу данных для хранения моих сеансов. Это дало мне эту ошибку, но когда я проверил журналы ошибок laravel (/ storage/logs), я обнаружил, что Laravel 5.2 ожидает, что таблица сеанса будет иметь поля user_id, ip_address и user_agent. Мой не сделал. Когда я добавил эти поля, все они работали так же, как и до обновления. Итак, мой совет - проверить журнал ошибок!

-1

Мое предложение - использовать FormHelper и Form::open() с вашего взгляда. Fomr и HTML-помощники были удалены из ядра laravels в версии 5.0, но вы можете установить их снова, следуя инструкциям these.

Во всяком случае, на ваш взгляд, есть опечатка. Правильное имя поля - _token, а не _Token. Возможно, в этом и проблема

0

Чтобы не проверять безопасность этой формы, необходимо перейти к пути к файлу: config/auth.php на Laravel. В этом файле вы должны найти (или создать его) строку 'no_csrf' => array(), Эта строка предназначена для добавления маршрутов, безопасность которых не может быть проверена. В этом устройстве необходимо добавить путь к вашей форме, например:

'No_csrf' => array('/form'), 
3

Убедитесь, что сессия путь записи. Если нет, laravel сравнивает значение null (без токена сеанса) с значением $ _POST ['_ token'] и выдает ошибку несоответствия, несмотря на настоящую причину.

0

У меня была такая же проблема. Решил его, удалив все файлы в папку сеансов. Путь папки сеансов: yourApplication/хранение/каркасные/сессии/

3

Корректировать 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» очень раздражает право?

0

Этот ответ для всех тех людей, которые уже использовали {{ csrf_field() }} после <form> тега в их файле view.blade.php и также запустить команду php artisan key:generate, но все еще получаю ошибку Токен несовпадение. Это шаги, которые я предпринял для устранения ошибки TokenMismatchException для одного из моих проектов, которые все еще находятся в разработке.

Удаление файлов кэша из следующих двух папок внутри вашего Laravel проекта:

  1. хранения/каркасные/сессии/
  2. хранения/каркасные/просмотров/

После удаления кэш-файлов, очистите кеш браузера.

3

Просто упакуйте кто-то еще ударяя эту проблему,

внутри конфигурации/session.php мои сеансы по существу не работали (хотя они, казалось, хорошо на некоторое время)

Убедитесь, что 'домен' меняется на null!

Исправлено все для меня, как ничто другое, на самом деле моя проблема.

Надеюсь, это поможет кому-то.

Смежные вопросы