Zainstalowałem Laravel 5.7
Dodano formularz do pliku \resources\views\welcome.blade.php
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
Dodano do pliku \routes\web.php
Route::post('/foo', function () {
echo 1;
return;
});
Po wysłaniu żądania POST:
419 Przepraszamy, sesja wygasła. Odśwież i spróbuj ponownie.
W wersji 5.6
nie było takiego problemu.
return;
ciebie możesz zadzwonićreturn redirect()->back();
. Z tego, co widzę, aplikacja nie ma nic do zrobienia po wysłaniu żądania. Może po przetworzeniu żądania możesz przekierować go do widoku.file
naSESSION_DRIVER
w.env
to działa dobrze. Dlaczego sesja oparta na bazie danych nie działa.vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
linii pliku 67, aby dowiedzieć się dlaczegosessions
stołu do innego celu. Po zmianie nazwy tabeli na bardziej dopasowaną oraz uruchomieniuartisan session:table
i odświeżeniu migracji wszystko działa dobrzeOdpowiedzi:
Przed przeczytaniem poniżej upewnij się,
@csrf
czy{{ csrf_field() }}
w swojej formie jak<form method="post"> @csrf <!-- {{ csrf_field() }} --> ... rest of form ... </form>
W larvel pojawia się komunikat o błędzie Session Expired lub 419 Page Expired, ponieważ gdzieś weryfikacja tokenu csrf kończy się niepowodzeniem, co oznacza, że
App\Http\Middleware\VerifyCsrfToken::class
oprogramowanie pośredniczące jest już włączone. W formie@csrf
dyrektywa ostrza została już dodana, co również powinno być w porządku.Następnie kolejnym obszarem do sprawdzenia jest sesja.
csrf
Weryfikacja tokena jest bezpośrednio związany z sesją, więc warto sprawdzić, czy kierowca sesja działa, czy nie, taki jak niepoprawnie skonfigurowanego Redis może powodować problem.Może możesz spróbować zmienić sterownik / oprogramowanie sesji z
.env
pliku, obsługiwane sterowniki są podane poniżejObsługiwane sterowniki sesji w Laravel 5, Laravel 6 i Laravel 7 (Doc Link)
file
- sesje są przechowywane w pamięci / ramach / sesjach.cookie
- sesje są przechowywane w bezpiecznych, zaszyfrowanych plikach cookie.database
- sesje są przechowywane w relacyjnej bazie danych.memcached
/redis
- sesje są przechowywane w jednym z tych szybkich sklepów opartych na pamięci podręcznej.array
- sesje są przechowywane w tablicy PHP i nie będą utrwalane.Jeśli twój formularz działa po przełączeniu sterownika sesji, oznacza to, że coś jest nie tak z tym konkretnym sterownikiem, spróbuj naprawić błąd z tego miejsca.
Możliwe scenariusze podatne na błędy
Prawdopodobnie sesje oparte na plikach mogą nie działać z powodu problemów z uprawnieniami do
/storage
katalogu (szybkie wyszukiwanie w Google przyniesie Ci rozwiązanie), pamiętaj również, że umieszczenie 777 dla katalogu nigdy nie jest rozwiązaniem.W przypadku sterownika bazy danych połączenie z bazą danych może być nieprawidłowe lub
sessions
tabela może nie istnieć lub być nieprawidłowo skonfigurowana (potwierdzono, że błędna część konfiguracji jest problemem zgodnie z komentarzem @Junaid Qadir).redis/memcached
konfiguracja jest nieprawidłowa lub jest manipulowana przez inny fragment kodu w systemie w tym samym czasie.Dobrym pomysłem może być wykonanie
php artisan key:generate
i wygenerowanie nowego klucza aplikacji, który z kolei opróżni dane sesji.Wyczyść pamięć podręczną przeglądarki TRUDNE. Uważam, że Chrome i Firefox są winowajcami bardziej, niż pamiętam.
Przeczytaj więcej o tym, dlaczego klucze aplikacji są ważne
źródło
_token
wartością otrzymaną z FORMULARZA. Unikaj używaniaSESSION_DOMAIN=...
adresów IP, które Chrome i specyfikacje plików cookie HTTP uważają za niezabezpieczone.419 Page Expired
pojawi się. Ze względu na użyteczność, jak powiedzieć prostemu użytkownikowi, co się właśnie wydarzyło i jak rozwiązać ten problem?Dzieje się tak, ponieważ formularz wymaga csrf. W wersji 5.7 zmienili go na @csrf
<form action="" method="post"> @csrf ...
Odniesienie: https://laravel.com/docs/5.7/csrf
źródło
csrf
pole, właśnie przejrzałem historię edycjinastępnie
dodaj
SESSION_DOMAIN=
swój plik .envlub w twoim config / session.php
'domain' => env('SESSION_DOMAIN', ''),
a potem biegnij
php artisan cache:clear
dodaj
SESSION_DOMAIN=mydomain.com
swój plik .envlub w twoim config / session.php
'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
a potem biegnij
php artisan cache:clear
źródło
Co powiesz na używanie
{{ csrf_field() }}
zamiast@csrf
Błąd 419 jest spowodowany głównie problemami z tokenem CSRF.
źródło
{{ csrf_field() }}
?Używam Laravel 5.7 miałem ten sam problem a to dlatego, że token csrf nie był w formularzu, więc dodając
naprawiono problem
źródło
Spróbuj wypowiedzieć się
\App\Http\Middleware\EncryptCookies::class
w\app\Http\Kernel.php
Mam podobny problem i rozwiązać go w ten sposób. Zapewne nie najlepsze rozwiązanie bo zabezpieczenia ale przynajmniej zadziałało.Wcześniej próbowałem:
\App\Http\Middleware\VerifyCsrfToken::class
w\app\Http\Kernel.php
\Illuminate\Session\Middleware\AuthenticateSession::class
w\app\Http\Kernel.php
Ale żaden z powyższych nie działał dla mnie.
EDYTOWAĆ
Mój przypadek jest taki, że przy każdym logowaniu zostanie utworzony nowy plik sesji (stary nadal istnieje, ale nagle zapomniany. Sprawdź
storage/framework/sessions
) i generowany jest nowy token CSRF. Więc problem nie dotyczy VerifyCsrfToken.Jak @Vladd wspomniał w sekcji komentarzy, nigdy nie powinieneś komentować
\App\Http\Middleware\VerifyCsrfToken::class
. Musisz sprawdzić, czy wysłałeś odpowiedni ŻETON CSRF na serwer.źródło
zmień swój
@csrf
plik w welcome.blade.php na<input type="hidden" name="_token" value="{{ csrf_token() }}">
więc twój kod w ten sposób:
<form method="POST" action="/foo" > <input type="hidden" name="_token" value="{{ csrf_token() }}"> <input type="text" name="name"/><br/> <input type="submit" value="Add"/> <button type="submit">Submit</button> </form>
źródło
To może być problem z twoją sesją. Po zabawie z tymi ustawieniami rozwiązałem problem. Dla mnie to ostatnia opcja.
Źródło: Laravel Session zawsze zmienia każde odświeżenie / żądanie w Laravel 5.4
źródło
SESSION_SECURE_COOKIE
przełącznik (zmienił go nafalse
) zrobił to za mnie. (wł.localhost:8000
)dodaj token csrf, a Twój problem zostanie rozwiązany. {{csrf_token}} lub @csrf
źródło
Aby rozwiązać ten błąd, musisz najpierw wstawić jedno z następujących poleceń do znacznika formularza.
@csrf
LUB{{ csrf_field }}
Jeśli problem nie został rozwiązany, wykonaj następujące czynności: (Zauważ, że jedno z powyższych poleceń musi znajdować się w tagu formularza)
1. wstaw jedno z następujących poleceń do znacznika formularza
@csrf
LUB{{ csrf_field }}
2. Otwórz plik .env i zmień wartości na „plik” w sekcji SESSION_DRIVER.
3.Następnie zresetuj pamięć podręczną Laravel. wpisz poniższe polecenia w terminalu
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:cache
4. Na ostatnim etapie odłącz projekt od serwisu i ponownie kliknij serwis php artisan
Mam nadzieję, że problem został rozwiązany
źródło
Po tak długim czasie udało mi się to rozwiązać w ten sposób
Moja ścieżka instalacyjna laravel nie była taka sama, jak ustawiona w pliku konfiguracyjnym session.php
'domain' => env('SESSION_DOMAIN', 'example.com'),
źródło
To może być przesada, ale możesz spróbować tego:
// Wywołanie formularza o nazwie route z dodanym ukrytym polem tokena.
<form method="POST" action="{{ route('foo') }}" > @csrf <input type="hidden" name="_token" value="{!! csrf_token() !!}"> <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>
// Nazwana trasa
Route::post('/foo', function () { return 'bar'; })->name('foo');
// Dodaj to w
<head></head>
bloku:<meta name="_token" content="{!! csrf_token() !!}" />
Przetestowałem to na moim lokalnym komputerze przy użyciu Homestead na Laravel 5.7, który był świeżą instalacją przy użyciu Laravel Installer 2.0.1 i zadziałało. Jakie jest Twoje środowisko?
Teoria: Zastanawiam się, czy ma to coś wspólnego z renderowaniem tagów html przez blade z
{{ }}
vs.{!! !!}
w twoim środowisku lub jak to serwujesz (np.php artisan serve
). Co sprawia, że myślę, że jestline 335
wśród/vendor/laravel/framework/src/illuminate/Foundation/helpers.php
powinno uczynić tę samą linię ręcznie wpisany powyżej.źródło
<meta>
tagi powinny być umieszczane wewnątrz<head>
, a nie wewnątrz<body>
. Nie jestem pewien, czy walidator HTML chciałby tego.W kodzie nie ma problemu. Sprawdziłem tym samym kodem, który napisałeś przy nowej instalacji.
Kod formularza:
<form method="POST" action="/foo" > @csrf <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>
web.php
kod pliku:Route::get('/', function () { return view('welcome'); }); Route::post('/foo', function () { echo 1; return; });
Wynik po przesłaniu formularza to:
Jeśli wyczyścisz pamięć podręczną przeglądarki lub spróbujesz z inną przeglądarką, myślę, że zostanie to naprawione.
źródło
Szybkim złym podejściem jest przejście do app \ http \ middleware \ verifycsrftoken.php i dodanie trasy w $ except list. Żądanie pocztowe będzie ignorowane przy weryfikacji tokena CSRF.
protected $except = [ // 'doLogin.aspx', 'create_coupon', ];
źródło
419 | strona ten błąd oznacza problem z zabezpieczeniami laravel oznacza to, że pole tokena csrf nie jest używane poprawnie.
użyj,
{{csrf_field}}
a problem zostanie rozwiązany.źródło
Powinno działać, jeśli wypróbujesz wszystkie te kroki:
Upewnij się, że Twoja sesja jest dobrze skonfigurowana. Najłatwiejszym sposobem jest utworzenie pliku i upewnienie się, że folder przechowywania ma uprawnienia chmod 755, a następnie w
.env
ustawieniach jak poniżej, najłatwiejszym sposobem ustawienia jest sterownik sesji plików.SESSION_DRIVER=file SESSION_DOMAIN= SESSION_SECURE_COOKIE=false
Upewnij się, że folder pamięci podręcznej jest wyczyszczony i można go zapisać, możesz to zrobić, uruchamiając poniższe polecenie artisan.
Upewnij się, że uprawnienia do folderów są dobrze ustawione, powinny być skonfigurowane jak poniżej:
sudo chmod -R 755 storage sudo chmod -R 755 vendor sudo chmod -R 644 bootstrap/cache
Upewnij się, że formularz zawiera
@csrf
token.Mam nadzieję, że to rozwiąże Twój problem.
źródło
W Twoim
Http/Kernel.php
spróbuj skomentować tę linię:
\Illuminate\Session\Middleware\AuthenticateSession::class,
w sieciowym oprogramowaniu pośrednim
to może być źródłem Twojego problemu
źródło
Domyślnie nie miałem tego problemu. Więc zrobiłem
chmod -R 644 sessions
powtórzenie problemu.Następnie nadałem uprawnienia do folderu sesji wg
chmod -R 755 sessions
teraz mój kod projektu znów działa.
Przyczyną tego jest to, że przechowujesz pamięć podręczną w pliku bez uprawnień do zapisu.
Rozwiązania:
1 - Jak naprawiłem powyżej, możesz nadać 755 uprawnienia do folderu sesji. 2 - Możesz użyć innej konfiguracji sterownika sesji.
Miej na uwadze; Jeśli chcesz używać memcached / redis, musisz mieć je zainstalowane na serwerze lub Twój kontener docker redis musi być uruchomiony.
źródło
W rzeczywistości CSRF jest tokenem opartym na sesji. Dodaj trasę do grupy tras i dodaj oprogramowanie pośredniczące, które kontroluje sesje.
web jest domyślnym oprogramowaniem pośredniczącym w programie laravel i może kontrolować żądania sesji.
Route::group(array('middleware' => ['web']), function () { Route::post('/foo', function () { echo 1; return; }); });
źródło
Jeśli masz już dyrektywę csrf , być może zmieniłeś sposób działania sesji.
W
config/session.php
sprawdzić „bezpieczny” pole. Powinna mieć wartość false, jeśli protokół https nie jest dostępny na Twoim serwerze.Możesz również umieścić
SESSION_SECURE_COOKIE=FALSE
swój.env
plik (katalog główny).źródło
otwórz wiersz poleceń cmd w swoim projekcie.
1. polecenie
2. komenda
źródło
Czy masz również csrf w nagłówku swojej aplikacji?
<meta name="csrf-token" content="{{ csrf_token() }}">
źródło
Chociaż formularz ma
@csrf
, nadal jest widoczny419 pages has expired
Rozwiązałem to po aktualizacji
SESSION_SECURE_COOKIE
na false w config / session.php'secure' => env('SESSION_SECURE_COOKIE', false)
niż wyczyść pamięć podręczną
źródło
Przejdź do config / session.php
znajdź wiersz
'secure' => env('SESSION_SECURE_COOKIE', true),
zmień to na fałsz
'secure' => env('SESSION_SECURE_COOKIE', false),
Jeśli ten parametr jest ustawiony na TRUE, przeglądarka będzie wymagać użycia protokołu HTTPS, w przeciwnym razie nie zapisze sesji. Ponieważ to nie jest ważne
źródło
Po prostu przeszedłem przez to i zatrzymałem się tutaj, aby uzyskać odpowiedź. W moim przypadku rozwiązaniem było wyczyszczenie historii przeglądarki.
źródło
W moim przypadku?> Na końcu route.php. Spędziłem tam dużo czasu ...
źródło
?>
do końcaweb.php
Po prostu miałem dokładnie ten sam problem i sprowadziłem się do tego, że byłem całkowicie głupi. Wyłączyłem wszystkie pola formularza (a nie tylko przycisk przesyłania) za pomocą javascript przed wysłaniem tego formularza! To oczywiście spowodowało, że wszystkie elementy formularza nie zostały przesłane (w tym ukryte
_token
pole), co z kolei spowodowało błąd 419!Mam nadzieję, że to pomoże komuś po kilku godzinach drapania się po głowie!
Wyłączone dane wejściowe formularza nie pojawiają się w żądaniu
źródło
Dostałem ten numer dawno temu. Przypomniałem sobie, że powoduje to pozwolenie
storage/framework/sessions
. Możesz chcieć to zmienić za pomocąchmod -R 0777 storage/framework/sessions
polecenia. U mnie to zadziałało.źródło
W moim przypadku jest to bardzo śmieszne. Otrzymuję błąd 419, kiedy umieszczam
Auth::routes()
na górze pliku trasy.Auth::routes(); Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); });
Naprawiłem błąd, przechodząc
Auth::routes();
do dolnej części pliku trasy.Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); }); Auth::routes();
Może pomoże to również w twojej sprawie. Powodzenia.
źródło
Zwróć uwagę, że pojawia się błąd 419, jeśli próbujesz przesłać duży plik, który przekracza limit rozmiaru pliku post. W takim przypadku możesz zwiększyć zarówno upload_max_filesize, jak i post_max_size do rozsądnej kwoty (np. 10 mln lub 20 mln zależy od twojego przypadku użycia i zasobów), sprawdź tutaj: https://stackoverflow.com/a/2184541/2100489
Może to jednak powodować problemy ze zużyciem zasobów, np. Przepustowością i pamięcią masową. Jako rozwiązanie możesz sprawdzić rozmiar pliku przed wysłaniem formularza i wyświetlić ostrzeżenie.
źródło