Posting permintaan di Laravel - Error - 419 Maaf, sesi Anda / 419 halaman Anda telah kedaluwarsa


90

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.6tidak ada masalah seperti itu.


Sudahkah Anda mencoba menambahkan pengalihan? Daripada return;Anda bisa menelepon return redirect()->back();. Dari apa yang saya lihat, aplikasi tidak ada hubungannya setelah permintaan posting. Mungkin Anda bisa mengarahkannya ke tampilan setelah memproses permintaan.
dcangulo

1
Saya mengalami masalah yang sama. Ketika saya beralih ke sesi database, ini terjadi dan ketika saya mengubah kembali ke fileuntuk SESSION_DRIVERdi .envdalamnya berfungsi dengan baik. Mengapa sesi berbasis database tidak berfungsi.
Junaid Qadir Shekhanzai

Saya menyalin kode persis Anda ke dalam instalasi laravel 5.7 baru. Berhasil. Ada masalah di tempat lain.
Kyle Wardle

masalah ini karena masalah token. Saya telah mencoba menjalankan kode yang sama seperti ini, tetapi tidak ada kesalahan. Anda harus memberikan lebih banyak informasi seperti driver sesi Anda, tampilan nilai _token di formulir. Selain itu, Anda dapat men-debug diri Anda sendiri di vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.phpbaris file 67 ini untuk mengetahui alasannya
bangnokia

1
Saya menyadari bahwa saya telah menggunakan sessionsmeja untuk tujuan yang berbeda. Setelah Mengubah nama tabel ini menjadi yang lebih cocok dan menjalankan artisan session:tabledan menyegarkan migrasi semuanya berfungsi dengan baik
Junaid Qadir Shekhanzai

Jawaban:


123

Sebelum membaca di bawah ini pastikan Anda memiliki @csrfatau {{ 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::classmiddleware sudah dihidupkan. Dalam bentuk @csrfpetunjuk bilah sudah ditambahkan, yang seharusnya juga bagus.

Kemudian area lain yang harus diperiksa adalah sesi. The csrftoken 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 .envfile Anda , driver yang didukung diberikan di bawah ini

Driver 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 /storagedirektori (googling cepat akan memberi Anda solusi), ingat juga meletakkan 777 untuk direktori bukanlah solusi.

  • Dalam kasus pengandar database, koneksi DB Anda mungkin salah, atau sessionstabel 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:generatedan 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


1
Terkadang hanya saja browser, terutama Chrome tidak akan menempatkan nilai sesi Set-Cookie karena formatnya salah atau tidak standar. Jadi Laravel tidak akan menemukan nilai sesi yang ada dari permintaan HTTP untuk dibandingkan dengan nilai yang diterima _tokendari FORM. Hindari penggunaan SESSION_DOMAIN=...dengan IP yang oleh Chrome dan Spesifikasi Cookie HTTP dianggap tidak aman.
KeitelDOG

Saya memiliki masalah yang sama, tetapi saya tidak selalu menerima kesalahan tersebut. Itu hanya terjadi dari waktu ke waktu. Saya rasa itu berarti tidak ada masalah dengan driver sesi, karena ini bekerja 99% dari waktu. Tapi saya menjalankan aplikasi langsung dan saya mendapat keluhan dari klien dari waktu ke waktu. Ini sangat jarang. Saya menggunakan driver sesi file. Apakah ada yang tahu mengapa ini terjadi dalam kasus saya? Terima kasih
TheAngelM97

@ TheAngelM97 Anda dapat dengan mudah mereproduksi kesalahan ini dengan masuk ke halaman login atau register. Jangan lakukan apa pun selama, mungkin, lebih dari 30 menit. Kemudian ketika Anda mengklik kirim, 419 Page Expiredmuncul. Demi kegunaan, bagaimana Anda memberi tahu pengguna sederhana apa yang baru saja terjadi dan bagaimana mengatasinya?
Pathros

38

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


6
Wujudnya termasuk token csrf. Tidak yakin apakah dia mengeditnya nanti atau tidak.
eResourcesInc

ya, bentuk aslinya memiliki csrfbidang, saya baru saja melihat ke dalam riwayat edit
Dexter Bengil

Ini tidak menyelesaikan masalah dalam kasus saya juga, karena saya selalu memilikinya dalam formulir saya, tetapi mulai menghadapi kesalahan karena beberapa perubahan lain
Sami

14

kasus 1: jika Anda menjalankan proyek di sistem lokal Anda seperti 127.0.01: 8000,

kemudian

tambahkan SESSION_DOMAIN=file .env Anda

atau di config / session.php Anda 'domain' => env('SESSION_DOMAIN', ''),

lalu lari php artisan cache:clear

kasus 2: jika proyek berjalan di server dan Anda memiliki domain seperti "mydomain.com"

tambahkan SESSION_DOMAIN=mydomain.comfile .env Anda

atau di config / session.php Anda 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

lalu lari php artisan cache:clear


9

Bagaimana kalau menggunakan

{{ csrf_field() }} dari pada @csrf

Kesalahan 419 sebagian besar karena masalah token csrf.


Maksudmu {{ csrf_field() }}?
Travis Britz

Ini menghasilkan html yang sama seperti @csrf melakukannya dengan hasil yang sama
Sami

9

Saya menggunakan Laravel 5.7 Saya memiliki masalah yang sama dan itu karena token csrf tidak ada di formulir, jadi menambahkan

@csrf

memperbaiki masalah


8

Cobalah untuk berkomentar \App\Http\Middleware\EncryptCookies::classdi \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:

  • Kosongkan cache
  • Buat kunci aplikasi baru
  • Jalankan aplikasi saya di berbagai Browser (Chrome 70, Mozilla Firefox 57, dan IE 11)
  • Jalankan aplikasi saya di komputer lain
  • Berkomentar \App\Http\Middleware\VerifyCsrfToken::classdalam\app\Http\Kernel.php
  • Berkomentar \Illuminate\Session\Middleware\AuthenticateSession::classdalam\app\Http\Kernel.php
  • Tingkatkan dan turunkan Laravel (antara 5.6 dan 5.7)

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.


1
Di antara cara-cara yang Anda sebutkan, hanya mengomentari \ App \ Http \ Middleware \ VerifyCsrfToken :: class di \ app \ Http \ Kernel.php yang berhasil untuk saya.
Lex Soft

1
Hapus cache, Buat kunci aplikasi baru + Hapus cookie
dobs

Anda tidak boleh melakukan c0mmenting \ App \ Http \ Middleware \ VerifyCsrfToken :: class. Kenapa kamu ingin melakukan itu? Untuk membuat titik lemah diri Anda dalam aplikasi?
Vladd

@dobs Terima kasih telah menambahkan '+ Hapus Kuki' karena saya mendapatkan kesalahan 419 bahkan setelah melakukan semua yang saya bisa lakukan dan itu hanya berfungsi ketika saya membersihkan kuki peramban / mencoba dalam penyamaran.
Niraj Pandey

6

ubah @csrfwelcome.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>

6

Mungkin ada masalah dengan sesi Anda. Setelah bermain-main dengan pengaturan ini, saya menyelesaikan masalah saya. Bagi saya, itu adalah pilihan terakhir.

  • Jika Anda menggunakan "file" sebagai driver sesi, lihat penyimpanan / framework / sesi jika sesi disimpan setelah refresh. Jika tidak, kemungkinan besar karena izin folder yang salah. Periksa apakah penyimpanan / folder Anda memiliki hak yang benar
  • Cobalah untuk menonaktifkan semua Javascript di halaman Anda (baik dengan menonaktifkannya melalui navigator atau di dalam kode) dan pastikan bahwa 'http_only' => true,
  • Coba gunakan dengan dan tanpa https
  • Pastikan variabel SESSION_DRIVER TIDAK null
  • Cobalah untuk beralih antara 'encrypt' => false, dan 'encrypt' => true,
  • Cobalah untuk mengubah nama cookie 'cookie' => 'laravelsession',
  • Cobalah untuk menyetel SESSION_DOMAIN Anda ke domain Anda yang sebenarnya ATAU null
  • Cobalah untuk beralih antara 'secure' => env ('SESSION_SECURE_COOKIE', false), dan 'secure' => env ('SESSION_SECURE_COOKIE', true),

Sumber: Laravel Session selalu mengubah setiap refresh / request di Laravel 5.4


Ya, setelah mencoba banyak hal lainnya, SESSION_SECURE_COOKIEsaklar (mengubahnya menjadi false) melakukannya untuk saya. (aktif localhost:8000)
Marten Koetsier

SESSION_SECURE_COOKIE juga menjadi masalah bagi saya, saya mengubahnya ketika mengikuti panduan untuk pengoptimalan situs web.
Bram Janssen

bagi saya ini bekerja dengan https tetapi tidak dengan http ... tahu mengapa? terima kasih atas jawaban yang bagus, butuh waktu berjam-jam untuk menemukannya.
sharkyenergy

5

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 @csrfATAU{{ 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


4

tambahkan token csrf dan masalah Anda akan terpecahkan. {{csrf_token}} atau @csrf


3

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'),

2

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 adalah line 335dari /vendor/laravel/framework/src/illuminate/Foundation/helpers.phpharus membuat baris yang sama secara manual diketik di atas.


Ya keren, tetapi <meta>tag harus ditempatkan di dalam <head>, bukan di dalam <body>. Saya tidak yakin validator HTML akan menyukai ini.
emix

Saya akan mengatakan Anda benar dan itu harus dipindahkan ke kepala.
jeremykenedy

2

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: Output setelah mengirimkan formulir

Jika Anda menghapus cache browser atau mencoba dengan browser lain, saya pikir itu akan diperbaiki.


2

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',
];

2

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.


2

Ini akan berhasil jika Anda mencoba semua langkah ini:

  1. Pastikan sesi Anda dikonfigurasi dengan baik, cara termudah adalah dengan membuatnya menjadi file dan pastikan folder penyimpanan memiliki izin chmod 755 lalu di .envAnda mengaturnya seperti di bawah ini, driver sesi file adalah cara termudah untuk mengatur.

    SESSION_DRIVER=file
    SESSION_DOMAIN=
    SESSION_SECURE_COOKIE=false
    
  2. Pastikan folder Cache dihapus dan dapat ditulis, Anda dapat melakukannya dengan menjalankan di bawah perintah artisan.

    php artisan cache:clear
    
  3. 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
    
  4. Pastikan formulir Anda memiliki @csrftoken disertakan.

Semoga ini akan menyelesaikan masalah Anda.


pengaturan sudo pada hak akses merusak laravel saya sepenuhnya.
Vladimir Despotovic

2

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


1

Di Anda Http/Kernel.php

coba komen baris ini:

\Illuminate\Session\Middleware\AuthenticateSession::class,

di deretan middleware web Anda

itu mungkin akar masalah Anda


1

Secara default saya tidak punya masalah ini. Jadi yang saya lakukan adalah chmod -R 644 sessions meniru masalah tersebut.

masukkan deskripsi gambar di sini

Setelah itu saya memberikan izin ke folder sesi oleh chmod -R 755 sessions

sekarang kode proyek saya berfungsi kembali.

masukkan deskripsi gambar di sini

Alasan itu terjadi adalah Anda menyimpan cache pada file dengan kurangnya izin menulis.

File konfigurasi sesi disimpan di config / session.php. Pastikan untuk meninjau opsi yang tersedia untuk Anda dalam file ini. Secara default, Laravel dikonfigurasi untuk menggunakan driver sesi file, yang akan bekerja dengan baik untuk banyak aplikasi. Dalam aplikasi produksi, Anda dapat mempertimbangkan untuk menggunakan driver memcache atau redis untuk kinerja sesi yang lebih cepat.

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.

file - sesi disimpan dalam penyimpanan / kerangka / sesi. cookie - sesi disimpan dalam cookie yang aman dan terenkripsi. 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.

Ingatlah; Jika Anda ingin menggunakan memcached / redis, Anda harus menginstalnya di server Anda atau kontainer docker redis Anda harus berjalan.


1

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;
  });
});

1

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=FALSEAnda .env(direktori root).


1

buka baris perintah cmd di proyek Anda.

1.command

php artisan config:cache

2.com dan

php artisan route:clear

1

Apakah Anda juga memiliki csrf di header aplikasi Anda?

<meta name="csrf-token" content="{{ csrf_token() }}">

1

Sementara bentuknya sudah @csrf, masih terlihat419 pages has expired

Saya menyelesaikannya setelah SESSION_SECURE_COOKIEopsi pembaruan menjadi false di config / session.php

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

daripada membersihkan cache


1

Saya hanya membahas ini dan saya mengarahkan kursor ke sini untuk mendapatkan jawaban .. Dalam kasus saya, solusinya adalah menghapus riwayat browser.


1

Dalam kasus saya adalah?> Di akhir routes.php. Menghabiskan banyak waktu di sana ...


1
sama, saya lupa menambah di ?>akhirweb.php
msalihbindak

1
WOW. Tidak persis masalah yang sama dalam kasus saya, tetapi solusi Anda membuat saya memeriksa ini, dan ketika saya lakukan, saya melihat spasi sebelum itu membuka <?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!
Ben Johnson

0

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 _tokenfield) yang pada akhirnya memunculkan error 419!

Saya harap ini membantu seseorang dari beberapa jam menggaruk kepala!

Input formulir yang dinonaktifkan tidak muncul dalam permintaan


0

Saya mendapat masalah ini sejak lama. Saya ingat itu menyebabkan izin storage/framework/sessions. Anda mungkin ingin mengubahnya dengan chmod -R 0777 storage/framework/sessionsperintah. Itu berhasil untuk saya.


0

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.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.