„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?

Sougata Bose
źródło
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
lub ten adres URL sprawdź stackoverflow.com/questions/39997180/…
Fatih TÜZEN
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.

Devon
źródło
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'
    ];
Hajdar B.
źródło
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,
11

Wypróbuj je wszystkie.

composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
Sagar Chamling
źródło
Zamiast wypróbować wszystkie powyższe polecenia, użyj tego pakietu github.com/afrazahmmad/clear-all-cached-data
Afraz Ahmad
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.

Andrés Ruiz
źródło
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.

Suresh Velusamy
źródło
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.

andrew_jackson
źródło
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/
Buddhi Kasun
źródło
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'
    ];
Shery
źródło
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),
Irfandi D. Vendy
źródło
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.

Mladen Janjetovic
źródło
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.

mim.ms
źródło
0

zestaw mbstring.func_overload = 2

pomogło mi

Toxi Gen
źródło
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

Damitha Dayananda
źródło
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.

Anwar Pervez
źródło
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.

JC Gras
źródło
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

oparam
źródło
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

saber tabatabaee yazdi
źródło