"Сторінка минула через бездіяльність" - Laravel 5.5


111

Моя сторінка реєстру відображає форму належним чином, якщо {{ csrf_field() }}у формі присутній CsrfToken ( ).

Форма HTML

<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
        {{ csrf_field() }}
        ....
</form>

Я використовую вбудовану автентифікацію для користувачів. Не змінили нічого, крім маршрутів та переадресацій.

Коли я надсилаю форму (відразу після перезавантаження також), вона надає, що сторінка минула через бездіяльність. Оновіть і спробуйте ще раз. помилка.

Моя бути, я пропускаю дуже маленьку річ. Але не впевнений, що це таке. Будь-яка допомога?

Оновлення

Знайшов проблему. Драйвер сеансу встановлено на масив. Змінили його на файл і помилка відсутня. Але що не так, якщо я використовую масив?


Може мати щось спільне з тим, що storage_path не піддається запису. Тут зберігаються дані сеансу щодо маркерів, якщо ви використовуєте файлові сеанси.
Девон

1
Знайшов проблему. Драйвер сеансу було встановлено на array. Змінили його на файл і помилка відсутня. Але що не так, якщо я використовую масив?
Сугата Бозе


1
Для нової версії laravel використовуйте @csrf для вирішення проблеми.
Тран

Відповіді:


164

Якщо ви приходите до цієї відповіді безпосередньо з пошуку , переконайтеся, що ви вже додали маркер csrf у свою форму з на {{ csrf_field() }}зразок OP.


Якщо у вас встановлено файл драйвера сеансу:

Може мати щось спільне з тим, що storage_path не піддається запису. Тут зберігаються дані сеансу щодо маркерів, якщо ви використовуєте файлові сеанси. Можна перевірити за допомогоюis_writable(config('session.files'))


Для ОП драйвер сеансу був встановлений на масив. Масив призначений лише для тестування. Оскільки дані не зберігаються, він не зможе порівняти маркер наступного запиту.

Драйвер масиву використовується під час тестування і запобігає збереженню даних, збережених у сеансі.

https://laravel.com/docs/5.5/session#configuration


Перевірте config / session.php

Нарешті, у мене щойно виникла проблема: у нас був проект, який має домен сеансу та захищені налаштування в config / session.php, але сайт розробки не використовував HTTPS (SSL / TLS). Це спричинило цю загальну помилку, оскільки за замовчуванням було встановлено значення true.secure.


3
Гаразд. Але наразі вона знаходиться в стадії розвитку. Тож якщо я використовую масив, чому він давав мені цю помилку?
Сугата Бозе

@SougataBose тестування не є розвитком. Дані масиву не зберігаються ...
Девон

Ось чому слід правильно пройти DOCs .. :)
Sougata Bose

Моя проблема не була вирішена. Основи я робив по-справжньому. Але я використовую власні провайдери та послуги. Немає проблем, коли я викликаю метод контролера, але коли я запускаю сервісний метод у контролері, який дзвонив із запитом на пошту, з’являється проблема!
Бенам Азімі

1
У мене була схожа проблема з сесіями, але щодо тестування. Виявилося, коли я використовував Carbon::setTestNow($time);у тестах, я не очищав його, використовуючи Carbon::setTestNow();згодом.
riotCode

77

Я зіткнувся з тим же номером у Laravel 5.5. У моєму випадку це сталося після зміни маршруту з GET на POST. Проблема полягала в тому, що я забув передати маркер CSRF, коли перейшов на POST.

Ви можете опублікувати маркер CSRF у своїй формі, зателефонувавши:

 {{ csrf_field() }}

Або виключайте маршрут у app / Http / Middleware / VerifyCsrfToken.php

 protected $except = [
        'your/route'
    ];

2
csrf_field()присутній у формі. Прийнята відповідь описує проблему. Дякую.
Sougata Bose

1
У моєму випадку я отримував POST від третьої сторони, тому додавання csrf_field () не було варіантом. Оскільки CSRF не був фактором у моєму випадку, додавання винятку до цього маршруту вирішило проблему. Дякую.
Fábio Duque Silva

Моя проблема не була вирішена. Основи я робив по-справжньому. Але я використовую власні провайдери та послуги. Немає проблем, коли я викликаю метод контролера, але коли я запускаю сервісний метод у контролері, який дзвонив із запитом на пошту, з’являється проблема!
Бенам Азімі

1
Будь ласка, не відключайте перевірку CSRF! Для захисту дуже важливо мати. Дізнайтеся, як правильно надсилати маркер і захищати своїх зареєстрованих користувачів від шкідливого JavaScript, який може подавати дії від їх імені.
Девон



6

Мою справу вирішили SESSION_DOMAIN, в моїй місцевій машині довелося налаштувати xxx.localhost. Це викликало конфлікти з виробництвом SESSION_DOMAIN, xxx.comяке було встановлено безпосередньо у конфігураційному файлі session.php.


Який драйвер сесії ви використовували? fileабо cookie?
KeitelDOG

4

Деякі відомості зберігаються у файлі cookie, що стосується попередніх версій програми laravel у розробці. Тож це конфліктує з маркерами, створеними csrf, які генеруються чужими версіями. Просто очистіть файл cookie і спробуйте.


Ви змогли побачити <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">вид коду в генерованому HTML?
Суреш Велусамий

Саме там. Знайшов проблему. Драйвер сеансу встановлено на масив. Змінили його на файл і помилка відсутня.
Сугата Босе

4

Для тих, хто все ще має проблеми і ніщо не допомогло. Зверніть увагу на параметр php.ini mbstring.func_overload. Його потрібно встановити на 0. А mbstring.internal_encoding встановити на UTF-8. У моєму випадку це була проблема.


Велике спасибі! Ваша відповідь врятувала мій мозок від збоїв)
Рустембек Калієв

3

Я міняю дозвіл на зберігання і помилки не було. Здавалося, це було відсутністю дозволу.

sudo chmod -R 775 storage/

2
Будьте обережні, використовуючи такі відкриті дозволи рекурсивно. Я настійно рекомендую проти файлів 775 для файлів. 755 для каталогів і 644 для файлів - норма.
Девон

3

додайте @csrfу форму, а також перейдіть до VerifyCsrfToken.php

app-> Http-> Middleware-> VerifyCsrfToken.php

protected $except = [
        'paste your route here'
    ];

1

У моєму випадку сайт був чудовим на сервері, але не на локальному. Тоді я пам'ятаю, що працював на захищеному веб-сайті.
Отже, у файлі config.session.php встановіть змінну secure на false

'secure' => env('SESSION_SECURE_COOKIE', false),

0

У мене була програма з кількома субдоменами, і між ними було печиво файлів cookie. Очищення файлів cookie вирішило мою проблему.

Крім того , спробуйте встановити SESSION_DOMAINв .env файлі. Використовуйте точний піддомен, який ви переглядаєте.


0

Не забудьте мати правильний системний час на своєму веб-сервері. У моєму випадку бродячий апарат був у майбутньому (26 січня 14:08:26 UTC 2226), тому, звичайно, час у файлі cookie сеансу мого браузера минув приблизно 200+ років тому.



0

Я з'ясував два рішення, щоб уникнути цих помилок 1), додавши захищений $ за винятком = ['/ yourroute'] можливого відключення перевірки токена csrf від визначеного кореня. 2) просто прокоментуйте \ App \ Http \ Middleware \ VerifyCsrfToken :: рядок класу в захищеній групі середнього програмного забезпечення в ядрі


0

У мене була така ж проблема, але проблема не в рамках, а в браузері. Я не знаю чому, але Google Chrome chrome автоматично блокує файли cookie, в моєму випадку. Після дозволених файлів cookie проблема була вирішена.


0

Коротка відповідь

Додати запис маршруту для registerвapp/Http/Middleware/VerifyCsrfToken.php

protected $except = [
        '/routeTo/register'
    ];

і очистіть кеш і маршрут кешу за допомогою команд:

php artisan cache:clear && php artisan route:clear

Деталі

Кожен раз, коли ви отримуєте доступ до сайту Laravel, генерується маркер, навіть якщо сеанс не був запущений. Потім у кожному запиті цей маркер (зберігається у файлах cookie) буде підтверджений відповідно до його терміну дії, встановленого в SESSION_LIFETIMEполі config/session.phpфайлу.

Якщо ви будете тримати сайт відкритим довше, ніж термін придатності, і намагаєтесь зробити запит, цей маркер буде оцінено, і помилка закінчення терміну дії повернеться. Отже, щоб пропустити цю перевірку на форми, які не входять у функції автентифікованих користувачів (наприклад, зареєструватися або ввійти), ви можете додати винятковий маршрут у app/Http/Middleware/VerifyCsrfToken.php.


1
Якщо ця сторінка обробляє введення користувача, то вона повинна пройти перевірки CSRF .
Сугата Босе

@SougataBose Дійсно, у цьому випадку я думаю, що найкраще використовувати валідатор капчу як Google reCAPTCHA
JC Gras

0

Багато разів це відбувається, тому що ви протестуєте проект на дату


0

Рішення:

використовувати інкогніто нову вкладку, а потім перевірити її ще раз.

причина:

у моєму випадку інший користувач увійшов у систему за допомогою моєї панелі адміністратора

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.