Saya menginstal Laravel 5.7
Menambahkan formulir ke file \resources\views\welcome.blade.php
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
Ditambahkan ke file \routes\web.php
Route::post('/foo', function () {
echo 1;
return;
});
Setelah mengirim permintaan POST:
419 Maaf, sesi Anda telah berakhir. Segarkan dan coba lagi.
Dalam versi 5.6
tidak ada masalah seperti itu.
return;
Anda bisa meneleponreturn redirect()->back();
. Dari apa yang saya lihat, aplikasi tidak ada hubungannya setelah permintaan posting. Mungkin Anda bisa mengarahkannya ke tampilan setelah memproses permintaan.file
untukSESSION_DRIVER
di.env
dalamnya berfungsi dengan baik. Mengapa sesi berbasis database tidak berfungsi.vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
baris file 67 ini untuk mengetahui alasannyasessions
meja untuk tujuan yang berbeda. Setelah Mengubah nama tabel ini menjadi yang lebih cocok dan menjalankanartisan session:table
dan menyegarkan migrasi semuanya berfungsi dengan baikJawaban:
Sebelum membaca di bawah ini pastikan Anda memiliki
@csrf
atau{{ csrf_field() }}
dalam bentuk seperti Anda<form method="post"> @csrf <!-- {{ csrf_field() }} --> ... rest of form ... </form>
Pesan kesalahan Session Expired atau 419 Page Expired di larvel muncul karena di suatu tempat verifikasi token csrf Anda gagal yang berarti
App\Http\Middleware\VerifyCsrfToken::class
middleware sudah dihidupkan. Dalam bentuk@csrf
petunjuk bilah sudah ditambahkan, yang seharusnya juga bagus.Kemudian area lain yang harus diperiksa adalah sesi. The
csrf
token verifikasi secara langsung terlibat dengan sesi Anda, Jadi Anda mungkin ingin memeriksa apakah pengemudi sesi Anda bekerja atau tidak, seperti Redis tidak dikonfigurasi dengan benar dapat menyebabkan masalah.Mungkin Anda dapat mencoba mengalihkan driver sesi / perangkat lunak dari
.env
file Anda , driver yang didukung diberikan di bawah iniDriver Sesi yang Didukung di Laravel 5, Laravel 6 dan Laravel 7 (Doc Link)
file
- sesi disimpan dalam penyimpanan / kerangka / sesi.cookie
- sesi disimpan dalam cookie terenkripsi yang aman.database
- sesi disimpan dalam database relasional.memcached
/redis
- sesi disimpan di salah satu penyimpanan berbasis cache yang cepat ini.array
- sesi disimpan dalam array PHP dan tidak akan dipertahankan.Jika formulir Anda berfungsi setelah mengganti driver sesi, maka ada yang salah dengan driver tersebut, coba perbaiki kesalahan dari sana.
Skenario rawan kesalahan yang mungkin terjadi
Mungkin sesi berbasis file mungkin tidak berfungsi karena masalah izin dengan
/storage
direktori (googling cepat akan memberi Anda solusi), ingat juga meletakkan 777 untuk direktori bukanlah solusi.Dalam kasus pengandar database, koneksi DB Anda mungkin salah, atau
sessions
tabel mungkin tidak ada atau salah dikonfigurasi (bagian konfigurasi yang salah dikonfirmasi menjadi masalah sesuai komentar oleh @Junaid Qadir).redis/memcached
konfigurasi salah atau sedang dimanipulasi oleh beberapa bagian kode lain di sistem pada saat yang bersamaan.Mungkin ada baiknya untuk mengeksekusi
php artisan key:generate
dan membuat kunci aplikasi baru yang akan, pada gilirannya, menghapus data sesi.Bersihkan Cache Browser SULIT , saya menemukan chrome dan firefox sebagai penyebabnya lebih dari yang dapat saya ingat.
Baca lebih lanjut tentang mengapa kunci aplikasi penting
sumber
_token
dari FORM. Hindari penggunaanSESSION_DOMAIN=...
dengan IP yang oleh Chrome dan Spesifikasi Cookie HTTP dianggap tidak aman.419 Page Expired
muncul. Demi kegunaan, bagaimana Anda memberi tahu pengguna sederhana apa yang baru saja terjadi dan bagaimana mengatasinya?Ini karena formulir membutuhkan csrf. Di versi 5.7, mereka mengubahnya menjadi @csrf
<form action="" method="post"> @csrf ...
Referensi: https://laravel.com/docs/5.7/csrf
sumber
csrf
bidang, saya baru saja melihat ke dalam riwayat editkemudian
tambahkan
SESSION_DOMAIN=
file .env Andaatau di config / session.php Anda
'domain' => env('SESSION_DOMAIN', ''),
lalu lari
php artisan cache:clear
tambahkan
SESSION_DOMAIN=mydomain.com
file .env Andaatau di config / session.php Anda
'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
lalu lari
php artisan cache:clear
sumber
Bagaimana kalau menggunakan
{{ csrf_field() }}
dari pada@csrf
Kesalahan 419 sebagian besar karena masalah token csrf.
sumber
{{ csrf_field() }}
?Saya menggunakan Laravel 5.7 Saya memiliki masalah yang sama dan itu karena token csrf tidak ada di formulir, jadi menambahkan
memperbaiki masalah
sumber
Cobalah untuk berkomentar
\App\Http\Middleware\EncryptCookies::class
di\app\Http\Kernel.php
Saya memiliki masalah yang sama dan menyelesaikannya dengan melakukannya. Mungkin bukan solusi terbaik karena keamanan tetapi setidaknya berhasil.Sebelumnya saya mencoba:
\App\Http\Middleware\VerifyCsrfToken::class
dalam\app\Http\Kernel.php
\Illuminate\Session\Middleware\AuthenticateSession::class
dalam\app\Http\Kernel.php
Tapi tidak satu pun di atas yang berhasil untuk saya.
EDIT
Kasus saya di sini adalah setiap kali saya login, file sesi baru akan dibuat (yang lama masih ada, tetapi tiba-tiba dilupakan. Periksa
storage/framework/sessions
) dan token CSRF baru dibuat. Jadi masalahnya bukan dengan VerifyCsrfToken.Seperti yang disebutkan @Vladd di bagian komentar, Anda tidak boleh berkomentar
\App\Http\Middleware\VerifyCsrfToken::class
. Anda harus memastikan bahwa Anda telah mengirimkan TOKEN CSRF yang benar ke server.sumber
ubah
@csrf
welcome.blade.php Anda menjadi<input type="hidden" name="_token" value="{{ csrf_token() }}">
jadi kodemu seperti ini:
<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>
sumber
Mungkin ada masalah dengan sesi Anda. Setelah bermain-main dengan pengaturan ini, saya menyelesaikan masalah saya. Bagi saya, itu adalah pilihan terakhir.
Sumber: Laravel Session selalu mengubah setiap refresh / request di Laravel 5.4
sumber
SESSION_SECURE_COOKIE
saklar (mengubahnya menjadifalse
) melakukannya untuk saya. (aktiflocalhost:8000
)Untuk mengatasi kesalahan ini Anda harus terlebih dahulu memasukkan salah satu dari perintah berikut ke dalam tag formulir.
@csrf
ATAU{{ csrf_field }}
Jika masalah Anda tidak teratasi, lakukan hal berikut: (Perhatikan bahwa salah satu dari perintah di atas harus dalam bentuk tag)
1. Sisipkan salah satu dari perintah berikut ke dalam tag formulir
@csrf
ATAU{{ csrf_field }}
2. Buka file .env dan ubah nilainya menjadi "file" di bagian SESSION_DRIVER.
3. Kemudian Anda harus mengatur ulang cache laravel. ketik perintah di bawah ini di terminal
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:cache
4. Pada langkah terakhir, cabut project dari serve dan klik lagi pada php artisan serve
Saya harap masalah Anda teratasi
sumber
tambahkan token csrf dan masalah Anda akan terpecahkan. {{csrf_token}} atau @csrf
sumber
Setelah sekian lama saya menyelesaikannya dengan cara ini
Path instalasi laravel saya tidak sama dengan yang ditetapkan di file config session.php
'domain' => env('SESSION_DOMAIN', 'example.com'),
sumber
Ini mungkin berlebihan tetapi Anda dapat mencoba ini:
// Formulir panggilan bernama rute dengan bidang token tersembunyi ditambahkan.
<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>
// Rute Bernama
Route::post('/foo', function () { return 'bar'; })->name('foo');
// Tambahkan ini di dalam
<head></head>
blok:<meta name="_token" content="{!! csrf_token() !!}" />
Saya mengujinya di lokal saya menggunakan Homestead di Laravel 5.7 yang merupakan instalasi baru menggunakan Laravel Installer 2.0.1 dan berhasil. Apa lingkungan Anda?
Teori: Saya ingin tahu apakah itu ada hubungannya dengan tag html rendering blade dengan
{{ }}
vs.{!! !!}
di lingkungan Anda atau bagaimana Anda menyajikannya (mis.php artisan serve
). Apa yang membuat saya berpikir bahwa adalahline 335
dari/vendor/laravel/framework/src/illuminate/Foundation/helpers.php
harus membuat baris yang sama secara manual diketik di atas.sumber
<meta>
tag harus ditempatkan di dalam<head>
, bukan di dalam<body>
. Saya tidak yakin validator HTML akan menyukai ini.Tidak ada masalah dalam kode. Saya telah memeriksa dengan kode yang sama seperti yang Anda tulis dengan instalasi baru.
Kode Formulir:
<form method="POST" action="/foo" > @csrf <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>
web.php
kode file:Route::get('/', function () { return view('welcome'); }); Route::post('/foo', function () { echo 1; return; });
Hasil setelah mengirimkan formulir adalah:
Jika Anda menghapus cache browser atau mencoba dengan browser lain, saya pikir itu akan diperbaiki.
sumber
Pendekatan buruk yang cepat adalah pergi ke app \ http \ middleware \ verifikasicsrftoken.php dan tambahkan rute di $ kecuali daftar. Permintaan posting akan diabaikan untuk verifikasi Token CSRF.
protected $except = [ // 'doLogin.aspx', 'create_coupon', ];
sumber
419 | Halaman kesalahan ini berarti masalah keamanan laravel itu berarti bidang token csrf tidak digunakan dengan benar.
gunakan
{{csrf_field}}
dan masalah Anda akan terpecahkan.sumber
Ini akan berhasil jika Anda mencoba semua langkah ini:
Pastikan sesi Anda dikonfigurasi dengan baik, cara termudah adalah dengan membuatnya menjadi file dan pastikan folder penyimpanan memiliki izin chmod 755 lalu di
.env
Anda mengaturnya seperti di bawah ini, driver sesi file adalah cara termudah untuk mengatur.SESSION_DRIVER=file SESSION_DOMAIN= SESSION_SECURE_COOKIE=false
Pastikan folder Cache dihapus dan dapat ditulis, Anda dapat melakukannya dengan menjalankan di bawah perintah artisan.
Pastikan izin folder diatur dengan baik, mereka harus dikonfigurasi seperti di bawah ini:
sudo chmod -R 755 storage sudo chmod -R 755 vendor sudo chmod -R 644 bootstrap/cache
Pastikan formulir Anda memiliki
@csrf
token disertakan.Semoga ini akan menyelesaikan masalah Anda.
sumber
Buka config / session.php
temukan barisnya
'secure' => env('SESSION_SECURE_COOKIE', true),
ubah menjadi false
'secure' => env('SESSION_SECURE_COOKIE', false),
Jika parameter ini disetel ke TRUE browser akan meminta Anda untuk menggunakan protokol HTTPS, jika tidak maka sesi tidak akan disimpan. Karena tidak valid
sumber
Di Anda
Http/Kernel.php
coba komen baris ini:
\Illuminate\Session\Middleware\AuthenticateSession::class,
di deretan middleware web Anda
itu mungkin akar masalah Anda
sumber
Secara default saya tidak punya masalah ini. Jadi yang saya lakukan adalah
chmod -R 644 sessions
meniru masalah tersebut.Setelah itu saya memberikan izin ke folder sesi oleh
chmod -R 755 sessions
sekarang kode proyek saya berfungsi kembali.
Alasan itu terjadi adalah Anda menyimpan cache pada file dengan kurangnya izin menulis.
Solusi:
1 - Seperti yang telah saya perbaiki di atas, Anda dapat memberikan 755 izin ke folder sesi. 2 - Anda dapat menggunakan konfigurasi driver sesi lain.
Ingatlah; Jika Anda ingin menggunakan memcached / redis, Anda harus menginstalnya di server Anda atau kontainer docker redis Anda harus berjalan.
sumber
Sebenarnya CSRF adalah token berbasis sesi. Tambahkan rute Anda dalam grup rute dan tambahkan middleware yang mengontrol sesi.
web adalah middleware default di laravel dan dapat mengontrol permintaan sesi.
Route::group(array('middleware' => ['web']), function () { Route::post('/foo', function () { echo 1; return; }); });
sumber
Jika Anda sudah memiliki direktif csrf , Anda mungkin telah mengubah cara sesi berjalan.
Masuk
config/session.php
, periksa bidang 'aman' . Ini harus salah jika https tidak tersedia di server Anda.Anda juga dapat meletakkan file
SESSION_SECURE_COOKIE=FALSE
Anda.env
(direktori root).sumber
buka baris perintah cmd di proyek Anda.
1.command
2.com dan
sumber
Apakah Anda juga memiliki csrf di header aplikasi Anda?
<meta name="csrf-token" content="{{ csrf_token() }}">
sumber
Sementara bentuknya sudah
@csrf
, masih terlihat419 pages has expired
Saya menyelesaikannya setelah
SESSION_SECURE_COOKIE
opsi pembaruan menjadi false di config / session.php'secure' => env('SESSION_SECURE_COOKIE', false)
daripada membersihkan cache
sumber
Saya hanya membahas ini dan saya mengarahkan kursor ke sini untuk mendapatkan jawaban .. Dalam kasus saya, solusinya adalah menghapus riwayat browser.
sumber
Dalam kasus saya adalah?> Di akhir routes.php. Menghabiskan banyak waktu di sana ...
sumber
?>
akhirweb.php
<?php
tag, dan bahwa ini apa yang menyebabkan 419 pada setiap formulir di situs! Anehnya, itu tidak terjadi dengan PHP 7.3, dan dimulai setelah meningkatkan ke 7.4!Saya baru saja mengalami masalah yang persis sama dan itu tergantung pada saya karena saya benar-benar bodoh. Saya telah menonaktifkan semua bidang formulir (bukan hanya tombol kirim) melalui javascript sebelum mengirimkan formulir tersebut! Hal ini tentu saja mengakibatkan semua elemen form tidak terkirim (termasuk hidden
_token
field) yang pada akhirnya memunculkan error 419!Saya harap ini membantu seseorang dari beberapa jam menggaruk kepala!
Input formulir yang dinonaktifkan tidak muncul dalam permintaan
sumber
Saya mendapat masalah ini sejak lama. Saya ingat itu menyebabkan izin
storage/framework/sessions
. Anda mungkin ingin mengubahnya denganchmod -R 0777 storage/framework/sessions
perintah. Itu berhasil untuk saya.sumber
Dalam kasus saya, ini sangat konyol. Saya mendapatkan kesalahan 419 ketika saya meletakkan
Auth::routes()
di bagian atas file rute.Auth::routes(); Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); });
Dan saya memperbaiki kesalahan dengan memindahkan
Auth::routes();
ke bagian bawah file rute.Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); }); Auth::routes();
Mungkin itu bisa membantu kasus Anda juga. Semoga berhasil.
sumber
Harap dicatat Anda mendapatkan kesalahan 419 jika Anda mencoba mengunggah file besar yang melebihi batas ukuran file posting. Dalam hal ini Anda dapat meningkatkan upload_max_filesize dan post_max_size ke jumlah yang wajar, (misalnya 10 juta atau 20 juta tergantung pada kasus penggunaan dan sumber daya Anda), periksa di sini: https://stackoverflow.com/a/2184541/2100489
Tetapi ini dapat menyebabkan masalah konsumsi sumber daya, misalnya bandwidth dan penyimpanan. Sebagai solusi, Anda dapat memeriksa ukuran file sebelum mengirimkan formulir dan menampilkan pesan peringatan.
sumber