„Strona wygasła z powodu braku aktywności” - Laravel 5.5


111

Moja strona rejestru prawidłowo wyświetla formularz z CsrfToken ( {{ csrf_field() }}) obecnym w formularzu).

Formularz HTML

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

Używam wbudowanego uwierzytelniania dla użytkowników. Nie zmieniłem niczego poza trasami i przekierowaniami.

Kiedy wysyłam formularz (tuż po ponownym załadowaniu również), daje to, że Strona wygasła z powodu braku aktywności. Odśwież i spróbuj ponownie. błąd.

Być może brakuje mi bardzo małej rzeczy. Ale nie wiem, co to jest. Jakaś pomoc?

Aktualizacja

Znalazłem problem. Sterownik sesji został ustawiony na array. Zmieniono go na plik i błąd zniknął. Ale co jest nie tak, jeśli używam tablicy?


Może mieć coś wspólnego z tym, że storage_path nie jest zapisywalny. Tutaj przechowuje dane sesji dotyczące tokenów, jeśli używasz sesji opartych na plikach.
Devon,

1
Znalazłem problem. Sterownik sesji został ustawiony na array. Zmieniono go na plik i błąd zniknął. Ale co jest nie tak, jeśli używam tablicy?
Sougata Bose


1
W nowej wersji laravel użyj @csrf, aby rozwiązać problem.
Vuong Tran

Odpowiedzi:


164

Jeśli dochodzisz do tej odpowiedzi bezpośrednio z wyszukiwania , upewnij się, że dodałeś już token csrf do formularza za pomocą {{ csrf_field() }}podobnego OP.


Jeśli masz sterownik sesji ustawiony na plik:

Może mieć coś wspólnego z tym, że storage_path nie jest zapisywalny. Tutaj przechowuje dane sesji dotyczące tokenów, jeśli używasz sesji opartych na plikach. Można zweryfikować za pomocąis_writable(config('session.files'))


W przypadku OP sterownik sesji został ustawiony na array. Tablica służy tylko do testowania. Ponieważ dane nie są utrwalane, nie będzie można porównać tokena przy następnym żądaniu.

Sterownik macierzy jest używany podczas testowania i zapobiega utrwalaniu danych przechowywanych w sesji.

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


Sprawdź config / session.php

Wreszcie problem, który właśnie miałem, mieliśmy projekt, który ma domenę sesji i bezpieczne ustawienia w config / session.php, ale strona programistyczna nie używa HTTPS (SSL / TLS). To spowodowało ten ogólny błąd, ponieważ session.secure było domyślnie ustawione na true.


3
Dobrze. Ale na razie jest w fazie rozwoju. Więc jeśli używam tablicy, dlaczego dawała mi ten błąd?
Sougata Bose

Testowanie @SougataBose to nie programowanie. Dane tablicy nie są utrwalane ...
Devon,

To jest powód, dla którego należy poprawnie przejść przez DOC .. :)
Sougata Bose

Mój problem nie został rozwiązany. Naprawdę zrobiłem podstawy. Ale korzystam z niestandardowych dostawców i usług. Nie ma problemu, kiedy wywołuję metodę kontrolera, ale kiedy uruchamiam metodę serwisową w kontrolerze, który wywołał z żądaniem postu, pojawia się problem!
Behnam Azimi

1
Miałem podobny problem z sesjami, ale w odniesieniu do testów. Okazało się, że kiedy używałem Carbon::setTestNow($time);w testach, nie wyczyściłem go Carbon::setTestNow();później.
riotCode

77

Napotkałem ten sam problem w Laravel 5.5. W moim przypadku stało się to po zmianie trasy z GET na POST. Problem polegał na tym, że zapomniałem przekazać tokena CSRF po przełączeniu na POST.

Możesz opublikować token CSRF w swoim formularzu, dzwoniąc pod numer:

 {{ csrf_field() }}

Lub wyklucz swoją trasę w app / Http / Middleware / VerifyCsrfToken.php

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

2
csrf_field()obecny w formularzu. Przyjęta odpowiedź opisuje problem. Dzięki.
Sougata Bose

1
W moim przypadku otrzymywałem POST od strony trzeciej, więc dodanie csrf_field () nie wchodziło w grę. Ponieważ CSRF nie był w moim przypadku czynnikiem, dodanie wyjątku do tej trasy rozwiązało problem. Dzięki.
Fábio Duque Silva

Mój problem nie został rozwiązany. Naprawdę zrobiłem podstawy. Ale korzystam z niestandardowych dostawców i usług. Nie ma problemu, kiedy wywołuję metodę kontrolera, ale kiedy uruchamiam metodę serwisową w kontrolerze, który wywołał z żądaniem postu, pojawia się problem!
Behnam Azimi

1
Nie wyłączaj weryfikacji CSRF! Ochrona jest bardzo ważna. Dowiedz się, jak prawidłowo wysłać token i chronić zalogowanych użytkowników przed złośliwym skryptem javascript, który może przesyłać działania w ich imieniu.
Devon,



6

Mój przypadek został rozwiązany SESSION_DOMAIN, w moim lokalnym komputerze trzeba było ustawić xxx.localhost. Powodowało to konflikty z produkcją SESSION_DOMAIN, xxx.comktóra została ustawiona bezpośrednio w pliku konfiguracyjnym session.php.


Którego sterownika sesji używasz? fileczy cookie?
KeitelDOG

4

Niektóre informacje są przechowywane w pliku cookie, który jest powiązany z poprzednimi wersjami laravel w fazie rozwoju. Jest to więc sprzeczne z tokenami wygenerowanymi przez csrf, które są generowane przez inne wersje. Po prostu wyczyść plik cookie i spróbuj.


czy udało Ci się zobaczyć <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">rodzaj kodu w wygenerowanym html?
Suresh Velusamy

Jest tam. Znalazłem problem. Sterownik sesji został ustawiony na array. Zmieniono go na plik i błąd zniknął.
Sougata Bose

4

Dla tych, którzy nadal mają problem i nic nie pomogło. Zwróć uwagę na parametr mbstring.func_overload php.ini. Musi być ustawiony na 0. A mbstring.internal_encoding ustawiony na UTF-8. W moim przypadku to był problem.


Dziękuję Ci bardzo! Twoja odpowiedź uratowała mój mózg przed awarią)
Rustembek Kaliyev,

3

Zmieniłem uprawnienia do przechowywania i błąd zniknął. Wyglądało na to, że problemem był brak pozwolenia.

sudo chmod -R 775 storage/

2
Uważaj przy rekurencyjnym korzystaniu z takich otwartych uprawnień. Zdecydowanie odradzam 775 dla plików. 755 dla katalogów i 644 dla plików to norma.
Devon

3

dodaj @csrfw formularzu, a także przejdź do VerifyCsrfToken.php

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

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

1

W moim przypadku strona działała poprawnie na serwerze, ale nie lokalnie. Wtedy pamiętam, że pracowałem nad bezpieczną stroną internetową.
Więc w pliku config.session.php ustaw zmienną secure na false

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

0

Miałem aplikację z wieloma subdomenami i problemem między nimi był plik cookie sesji. Usunięcie plików cookie rozwiązało mój problem.

Spróbuj także ustawić plik SESSION_DOMAINin .env . Użyj dokładnie tej subdomeny, którą przeglądasz.


0

Upewnij się, że masz poprawny czas systemowy na serwerze WWW. W moim przypadku maszyna włóczęga była w przyszłości (26 stycznia 14:08:26 UTC 2226), więc oczywiście czas w pliku cookie sesji mojej przeglądarki wygasł około 200+ lat temu.



0

Wymyśliłem dwa rozwiązania, aby uniknąć tego błędu 1), dodając chroniony $ z wyjątkiem = ['/ yourroute'] możliwe wyłączenie kontroli tokenu csrf ze zdefiniowanego katalogu głównego. 2) Po prostu skomentuj \ App \ Http \ Middleware \ VerifyCsrfToken :: wiersz klasy w chronionej grupie oprogramowania pośredniego w jądrze


0

Miałem ten sam problem, ale problem nie tkwi w frameworku, ale w przeglądarce. Nie wiem dlaczego, ale w moim przypadku Google Chrome automatycznie blokuje pliki cookie. Po dozwolonych plikach cookie problem został rozwiązany.


0

Krótka odpowiedź

Dodaj wpis trasy dla registerwapp/Http/Middleware/VerifyCsrfToken.php

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

i wyczyść pamięć podręczną i trasę pamięci podręcznej za pomocą poleceń:

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

Detale

Za każdym razem, gdy wchodzisz na stronę Laravel, generowany jest token, nawet jeśli sesja nie została rozpoczęta. Następnie w każdym żądaniu ten token (przechowywany w plikach cookie) zostanie zweryfikowany pod kątem czasu wygaśnięcia, ustawionego w SESSION_LIFETIMEpolu w config/session.phppliku.

Jeśli pozostawisz witrynę otwartą dłużej niż przez czas wygaśnięcia i spróbujesz wysłać żądanie, ten token zostanie oceniony i zwróci błąd wygaśnięcia. Tak więc, aby pominąć tę walidację na formularzach, które są poza funkcjami uwierzytelnionych użytkowników (takich jak rejestracja lub logowanie), możesz dodać trasę except w app/Http/Middleware/VerifyCsrfToken.php.


1
Jeśli ta strona przetwarza dane wejściowe użytkownika, powinna przejść przez testy CSRF .
Sougata Bose

@SougataBose Rzeczywiście, w takim przypadku myślę, że najlepiej jest użyć walidatora captcha jako Google reCAPTCHA
JC Gras

0

Wiele razy tak się dzieje, ponieważ testujesz projekt w przeszłości


0

Rozwiązanie:

użyj nowej karty incognito, a następnie przetestuj ją ponownie.

powód:

w moim przypadku inny użytkownik zalogował się do mojego panelu administratora

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.