"Halaman ini telah kedaluwarsa karena tidak aktif" - Laravel 5.5

111

Halaman pendaftaran saya menunjukkan formulir dengan benar dengan CsrfToken ( {{ csrf_field() }}) hadir dalam formulir).

Formulir HTML

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

Saya menggunakan otentikasi bawaan untuk pengguna. Tidak mengubah apa pun kecuali rute dan pengalihan.

Ketika saya mengirimkan formulir (hanya setelah memuat ulang juga), itu memberi bahwa halaman telah kedaluwarsa karena tidak aktif. Segarkan dan coba lagi. kesalahan.

Menjadi saya, saya kehilangan hal yang sangat kecil. Tapi tidak yakin apa itu. Ada bantuan?

Memperbarui

Menemukan masalahnya. Pengemudi sesi diatur ke array. Mengubahnya menjadi file dan kesalahan hilang sekarang. Tapi apa salahnya jika saya menggunakan array?

Sougata Bose
sumber
Mungkin ada hubungannya dengan storage_path yang tidak dapat ditulis. Di sinilah ia menyimpan data sesi mengenai token jika Anda menggunakan sesi berbasis file.
Devon
1
Menemukan masalahnya. Pengemudi sesi diatur ke array. Mengubahnya menjadi file dan kesalahan hilang sekarang. Tapi apa salahnya jika saya menggunakan array?
Sougata Bose
atau url ini periksa stackoverflow.com/questions/39997180/…
Fatih TÜZEN
1
Untuk versi baru laravel, gunakan @csrf untuk menyelesaikan masalah.
Vuong Tran

Jawaban:

164

Jika Anda datang ke jawaban ini langsung dari pencarian , pastikan Anda telah menambahkan token csrf ke formulir Anda dengan {{ csrf_field() }}seperti OP.


Jika Anda mengatur driver sesi ke file:

Mungkin ada hubungannya dengan storage_path yang tidak dapat ditulis. Di sinilah ia menyimpan data sesi mengenai token jika Anda menggunakan sesi berbasis file. Dapat diverifikasi denganis_writable(config('session.files'))


Untuk OP, pengandar sesi diatur ke array. Larik hanya untuk pengujian. Karena data tidak disimpan, itu tidak akan dapat membandingkan token pada permintaan berikutnya.

Driver array digunakan selama pengujian dan mencegah data yang disimpan dalam sesi dipertahankan.

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


Periksa config / session.php

Terakhir, masalah yang baru saja saya alami, kami memiliki proyek yang memiliki domain sesi dan pengaturan aman di config / session.php tetapi situs pengembangan tidak menggunakan HTTPS (SSL / TLS). Ini menyebabkan kesalahan umum ini karena session.secure disetel ke true secara default.

Devon
sumber
3
Baik. Tapi untuk saat ini sedang dalam pengembangan. Jadi jika saya menggunakan array, mengapa itu memberi saya kesalahan itu?
Sougata Bose
Pengujian @SougataBose bukanlah pengembangan. Data array tidak bertahan ...
Devon
Itulah alasan seseorang harus melalui DOC dengan benar .. :)
Sougata Bose
Masalah saya tidak terpecahkan. Saya benar-benar melakukan dasar-dasarnya. Tapi saya menggunakan penyedia dan layanan khusus. Tidak ada masalah ketika saya memanggil metode pengontrol tetapi ketika saya menjalankan metode layanan di pengontrol yang disebut dengan permintaan pos, masalah muncul!
Behnam Azimi
1
Saya memiliki masalah yang sama dengan sesi tetapi dalam hal pengujian. Ternyata ketika saya menggunakan Carbon::setTestNow($time);dalam tes saya tidak membersihkannya dengan menggunakan Carbon::setTestNow();sesudahnya.
riotCode
77

Saya mengalami masalah yang sama di Laravel 5.5. Dalam kasus saya, itu terjadi setelah mengubah rute dari GET ke POST. Masalahnya adalah karena saya lupa memberikan token CSRF ketika saya beralih ke POST.

Anda dapat memposting token CSRF di formulir Anda dengan menelepon:

 {{ csrf_field() }}

Atau kecualikan rute Anda di app / Http / Middleware / VerifyCsrfToken.php

 protected $except = [
        'your/route'
    ];
Hyder B.
sumber
2
csrf_field()hadir dalam bentuk. Jawaban yang diterima menjelaskan masalahnya. Terima kasih.
Sougata Bose
1
Dalam kasus saya, saya menerima POST dari pihak ketiga, jadi menambahkan csrf_field () bukanlah pilihan. Karena CSRF bukanlah faktor dalam kasus saya, menambahkan pengecualian ke rute ini memecahkan masalah. Terima kasih.
Fábio Duque Silva
Masalah saya tidak terpecahkan. Saya benar-benar melakukan dasar-dasarnya. Tapi saya menggunakan penyedia dan layanan khusus. Tidak ada masalah ketika saya memanggil metode pengontrol tetapi ketika saya menjalankan metode layanan di pengontrol yang disebut dengan permintaan pos, masalah muncul!
Behnam Azimi
1
Mohon jangan nonaktifkan verifikasi CSRF! Sangat penting untuk memiliki perlindungan. Pelajari cara mengirim token dengan benar dan melindungi pengguna yang masuk dari javascript berbahaya yang dapat mengirimkan tindakan atas nama mereka.
Devon
11

Coba semuanya.

composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
Sagar Chamling
sumber
Alih-alih mencoba semua perintah di atas, gunakan paket ini github.com/afrazahmmad/clear-all-cached-data
Afraz Ahmad
6

Kasus saya diselesaikan dengan SESSION_DOMAIN, di mesin lokal saya harus diatur ke xxx.localhost. Itu menyebabkan konflik dengan produksi SESSION_DOMAIN, xxx.comyang ditetapkan langsung di file konfigurasi session.php.

Andrés Ruiz
sumber
Pengemudi sesi mana yang Anda gunakan? fileatau cookie?
KeitelDOG
4

Beberapa informasi disimpan dalam cookie yang terkait dengan versi laravel sebelumnya dalam pengembangan. Jadi ini bertentangan dengan token yang dihasilkan csrf yang dihasilkan oleh versi lain. Hapus saja cookie dan cobalah.

Suresh Velusamy
sumber
apakah Anda dapat melihat <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">jenis kode di html yang dihasilkan?
Suresh Velusamy
Itu di sana. Menemukan masalahnya. Pengemudi sesi diatur ke array. Mengubahnya menjadi file dan kesalahan hilang sekarang.
Sougata Bose
4

Bagi mereka yang masih bermasalah dan tidak ada yang membantu. Perhatikan parameter php.ini mbstring.func_overload. Ini harus diatur ke 0. Dan mbstring.internal_encoding diatur ke UTF-8. Dalam kasus saya, itu adalah masalah.

andrew_jackson
sumber
Terima kasih banyak! Jawaban Anda menyelamatkan otak saya dari crash)
Rustembek Kaliyev
3

Saya mengubah izin ke penyimpanan dan kesalahan telah hilang. Tampaknya kurangnya izin adalah masalahnya.

sudo chmod -R 775 storage/
Buddhi Kasun
sumber
2
Hati-hati menggunakan izin terbuka seperti itu secara rekursif. Saya sangat merekomendasikan 775 untuk file. 755 untuk direktori dan 644 untuk file adalah norma.
Devon
3

tambahkan @csrfformulir dan juga buka VerifyCsrfToken.php

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

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

Dalam kasus saya, situs itu baik-baik saja di server tetapi tidak di lokal. Kemudian saya ingat saya sedang mengerjakan situs web yang aman.
Jadi di file config.session.php, setel variabel aman ke false

'secure' => env('SESSION_SECURE_COOKIE', false),
Irfandi D. Vendy
sumber
0

Saya memiliki aplikasi dengan beberapa subdomain dan cookie sesi adalah masalah di antara keduanya. Menghapus cookie menyelesaikan masalah saya.

Selain itu, coba setel file SESSION_DOMAINdalam .env . Gunakan subdomain persis seperti yang Anda jelajahi.

Mladen Janjetovic
sumber
0

Pastikan untuk memiliki waktu sistem yang benar di server web Anda. Dalam kasus saya, mesin gelandangan itu di masa depan (26 Jan 14:08:26 UTC 2226) jadi tentu saja waktu di cookie sesi browser saya telah kedaluwarsa sekitar 200+ tahun yang lalu.

mim.ms
sumber
0

set mbstring.func_overload = 2

itu membantu saya

Toxi Gen
sumber
0

Saya telah menemukan dua solusi untuk menghindari kesalahan ini 1) dengan menambahkan dilindungi $ kecuali = ['/ yourroute'] kemungkinan menonaktifkan pemeriksaan token csrf dari root yang ditentukan. 2) cukup beri komentar \ App \ Http \ Middleware \ VerifyCsrfToken :: baris kelas di grup middleware yang dilindungi di kernel

Damitha Dayananda
sumber
0

Saya memiliki masalah yang sama tetapi masalahnya bukan pada kerangka kerja tetapi pada browser. Saya tidak tahu mengapa tetapi google chrome memblokir cookie secara otomatis, dalam kasus saya. Setelah cookie diizinkan, masalahnya teratasi.

Anwar Pervez
sumber
0

Jawaban singkat

Menambahkan entri rute untuk registerdiapp/Http/Middleware/VerifyCsrfToken.php

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

dan hapus cache dan rute cache dengan perintah:

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

Detail

Setiap kali Anda mengakses situs Laravel, token dibuat, bahkan jika sesi belum dimulai. Kemudian, dalam setiap permintaan, token ini (disimpan dalam cookie) akan divalidasi terhadap waktu kedaluwarsanya, yang ditetapkan di SESSION_LIFETIMEbidang pada config/session.phpfile.

Jika Anda membiarkan situs tetap terbuka selama lebih dari waktu kedaluwarsa dan mencoba membuat permintaan, token ini akan dievaluasi dan kesalahan kedaluwarsa akan kembali. Jadi, untuk melewati validasi ini pada formulir yang berada di luar fungsi pengguna yang diautentikasi (seperti register atau login), Anda dapat menambahkan rute kecuali di app/Http/Middleware/VerifyCsrfToken.php.

JC Gras
sumber
1
Jika halaman tersebut memproses input pengguna, maka halaman tersebut harus melalui pemeriksaan CSRF .
Sougata Bose
@SougataBose Memang, dalam hal ini saya pikir yang terbaik adalah menggunakan validator captcha sebagai Google reCAPTCHA
JC Gras
0

Sering kali ini terjadi karena Anda menguji proyek di tanggal sebelumnya

oparam
sumber
0

Larutan:

gunakan tab baru penyamaran lalu uji lagi.

alasan:

dalam kasus saya, pengguna lain masuk dengan panel admin saya

saber tabatabaee yazdi
sumber