“ เพจหมดอายุเนื่องจากไม่มีการใช้งาน” - Laravel 5.5


111

หน้าลงทะเบียนของฉันแสดงแบบฟอร์มอย่างถูกต้องโดยมี CsrfToken ( {{ csrf_field() }}) อยู่ในแบบฟอร์ม)

แบบฟอร์ม HTML

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

ฉันใช้การรับรองความถูกต้องแบบ inbuilt สำหรับผู้ใช้ ไม่ได้เปลี่ยนแปลงอะไรเลยนอกจากเส้นทางและการเปลี่ยนเส้นทาง

เมื่อฉันส่งแบบฟอร์ม (หลังจากโหลดซ้ำแล้วด้วย) แสดงว่าหน้านี้หมดอายุเนื่องจากไม่มีการใช้งาน โปรดรีเฟรชและลองอีกครั้ง ข้อผิดพลาด

เป็นของฉันฉันคิดถึงสิ่งเล็ก ๆ น้อย ๆ แต่ไม่แน่ใจว่าคืออะไร. ความช่วยเหลือใด ๆ

อัปเดต

พบปัญหา โปรแกรมควบคุมเซสชันถูกตั้งค่าเป็นอาร์เรย์ เปลี่ยนเป็นไฟล์แล้วข้อผิดพลาดหายไปแล้ว แต่จะเกิดอะไรขึ้นถ้าฉันใช้อาร์เรย์?


อาจมีบางอย่างเกี่ยวกับ storage_path ที่เขียนไม่ได้ นี่คือที่เก็บข้อมูลเซสชันเกี่ยวกับโทเค็นหากคุณใช้เซสชันตามไฟล์
Devon

1
พบปัญหา arrayคนขับเซสชั่นที่ได้รับการตั้งค่าให้ เปลี่ยนเป็นไฟล์แล้วข้อผิดพลาดหายไปแล้ว แต่จะเกิดอะไรขึ้นถ้าฉันใช้อาร์เรย์?
Sougata Bose

หรือตรวจสอบ url นี้stackoverflow.com/questions/39997180/…
Fatih TÜZEN

1
สำหรับ laravel เวอร์ชันใหม่ให้ใช้ @csrf เพื่อแก้ปัญหา
Vuong Tran

คำตอบ:


164

หากคุณได้รับคำตอบนี้โดยตรงจากการค้นหาตรวจสอบให้แน่ใจว่าคุณได้เพิ่มโทเค็น csrf ลงในแบบฟอร์มของคุณแล้ว{{ csrf_field() }}เช่น OP


หากคุณตั้งค่าโปรแกรมควบคุมเซสชันเป็นไฟล์:

อาจมีบางอย่างเกี่ยวกับ storage_path ที่เขียนไม่ได้ นี่คือที่เก็บข้อมูลเซสชันเกี่ยวกับโทเค็นหากคุณใช้เซสชันตามไฟล์ สามารถตรวจสอบได้ด้วยis_writable(config('session.files'))


สำหรับ OP ไดรเวอร์เซสชันถูกตั้งค่าเป็นอาร์เรย์ Array ใช้สำหรับการทดสอบเท่านั้น เนื่องจากข้อมูลไม่คงอยู่จึงไม่สามารถเปรียบเทียบโทเค็นในคำขอถัดไปได้

โปรแกรมควบคุมอาร์เรย์ถูกใช้ในระหว่างการทดสอบและป้องกันไม่ให้ข้อมูลที่จัดเก็บในเซสชันคงอยู่

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


ตรวจสอบ config / session.php

สุดท้ายนี้ปัญหาที่ฉันเพิ่งพบเรามีโครงการที่มีโดเมนเซสชันและการตั้งค่าที่ปลอดภัยใน config / session.php แต่ไซต์การพัฒนาไม่ได้ใช้ HTTPS (SSL / TLS) สิ่งนี้ทำให้เกิดข้อผิดพลาดทั่วไปเนื่องจาก sessions.secure ถูกตั้งค่าเป็น true โดยค่าเริ่มต้น


3
ตกลง. แต่ตอนนี้อยู่ระหว่างการพัฒนา ดังนั้นถ้าฉันใช้อาร์เรย์ทำไมมันถึงทำให้ฉันมีข้อผิดพลาด
Sougata Bose

การทดสอบ @SougataBose ไม่ใช่การพัฒนา ข้อมูลอาร์เรย์ไม่คงอยู่ ...
Devon

นั่นเป็นเหตุผลที่เราควรผ่าน
DOC

ปัญหาของฉันไม่ได้รับการแก้ไข ฉันทำพื้นฐานอย่างแท้จริง แต่ฉันใช้ผู้ให้บริการและบริการที่กำหนดเอง ไม่มีปัญหาเมื่อฉันเรียกใช้วิธีการควบคุม แต่เมื่อฉันเรียกใช้วิธีการบริการในตัวควบคุมที่เรียกด้วยคำขอโพสต์ปัญหาจะปรากฏขึ้น!
Behnam Azimi

1
ฉันมีปัญหาคล้ายกันกับเซสชัน แต่เกี่ยวกับการทดสอบ ปรากฎว่าเมื่อฉันใช้Carbon::setTestNow($time);ในการทดสอบฉันไม่ได้ล้างมันโดยใช้ในCarbon::setTestNow();ภายหลัง
riotCode

77

ฉันพบปัญหาเดียวกันใน Laravel 5.5 ในกรณีของฉันมันเกิดขึ้นหลังจากเปลี่ยนเส้นทางจาก GET เป็น POST ปัญหาเกิดจากฉันลืมส่งโทเค็น CSRF เมื่อเปลี่ยนเป็น POST

คุณสามารถโพสต์โทเค็น CSRF ในแบบฟอร์มของคุณได้โดยโทร:

 {{ csrf_field() }}

หรือยกเว้นเส้นทางของคุณใน app / Http / Middleware / VerifyCsrfToken.php

 protected $except = [
        'your/route'
    ];

2
csrf_field()นำเสนอในรูปแบบ คำตอบที่ยอมรับอธิบายปัญหา ขอบคุณ.
Sougata Bose

1
ในกรณีของฉันฉันได้รับ POST จากบุคคลที่สามดังนั้นการเพิ่ม csrf_field () จึงไม่ใช่ตัวเลือก เนื่องจาก CSRF ไม่ใช่ปัจจัยในกรณีของฉันการเพิ่มข้อยกเว้นในเส้นทางนี้จึงช่วยแก้ปัญหาได้ ขอบคุณ.
Fábio Duque Silva

ปัญหาของฉันไม่ได้รับการแก้ไข ฉันทำพื้นฐานอย่างแท้จริง แต่ฉันใช้ผู้ให้บริการและบริการที่กำหนดเอง ไม่มีปัญหาเมื่อฉันเรียกใช้วิธีการควบคุม แต่เมื่อฉันเรียกใช้วิธีการบริการในตัวควบคุมที่เรียกด้วยคำขอโพสต์ปัญหาจะปรากฏขึ้น!
Behnam Azimi

1
โปรดอย่าปิดการตรวจสอบ CSRF! สิ่งสำคัญมากที่จะต้องมีการป้องกัน เรียนรู้วิธีการส่งโทเค็นอย่างถูกต้องและปกป้องผู้ใช้ที่ล็อกอินของคุณจากจาวาสคริปต์ที่เป็นอันตรายซึ่งสามารถส่งการดำเนินการในนามของพวกเขาได้
Devon



6

กรณีของฉันได้รับการแก้ไขด้วยSESSION_DOMAINเครื่องในพื้นที่ของฉันต้องตั้งค่าเป็นxxx.localhost. มันก่อให้เกิดความขัดแย้งกับการผลิตSESSION_DOMAIN, xxx.comที่ถูกกำหนดโดยตรงในไฟล์ config session.php


คุณใช้โปรแกรมควบคุมเซสชันใด fileหรือcookie?
KeitelDOG

4

ข้อมูลบางอย่างจะถูกเก็บไว้ในคุกกี้ซึ่งเกี่ยวข้องกับเวอร์ชันก่อนหน้าของ laravel ในการพัฒนา ดังนั้นจึงขัดแย้งกับโทเค็นที่สร้างโดย csrf ซึ่งสร้างโดยเวอร์ชันของผู้อื่น เพียงแค่ล้างคุกกี้และทดลองใช้


คุณสามารถดู<input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">ประเภทของรหัสใน html ที่สร้างขึ้นได้หรือไม่
Suresh Velusamy

มันอยู่ที่นั่น. พบปัญหา โปรแกรมควบคุมเซสชันถูกตั้งค่าเป็นอาร์เรย์ เปลี่ยนเป็นไฟล์แล้วข้อผิดพลาดหายไปแล้ว
Sougata Bose

4

สำหรับผู้ที่ยังมีปัญหาและไม่มีอะไรช่วย ให้ความสนใจกับพารามิเตอร์ php.ini mbstring.func_overload จะต้องตั้งค่าเป็น 0 และ mbstring.internal_encoding ตั้งค่าเป็น UTF-8 ในกรณีของฉันที่เป็นปัญหา


ขอบคุณมาก! คำตอบของคุณช่วยให้สมองของฉันหยุดทำงาน)
Rustembek Kaliyev

3

ฉันเปลี่ยนสิทธิ์ในการจัดเก็บและข้อผิดพลาดหายไป ดูเหมือนว่าการไม่ได้รับอนุญาตเป็นปัญหา

sudo chmod -R 775 storage/

2
โปรดใช้ความระมัดระวังในการใช้การอนุญาตแบบเปิดซ้ำ ๆ ฉันขอแนะนำเป็นอย่างยิ่งกับ 775 สำหรับไฟล์ 755 สำหรับไดเร็กทอรีและ 644 สำหรับไฟล์เป็นบรรทัดฐาน
Devon

3

เพิ่ม@csrfในแบบฟอร์มและไปที่ VerifyCsrfToken.php

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

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

1

ในกรณีของฉันไซต์นั้นใช้ได้ดีในเซิร์ฟเวอร์ แต่ไม่ได้อยู่ในท้องถิ่น จากนั้นฉันจำได้ว่าฉันกำลังทำงานกับเว็บไซต์ที่ปลอดภัย
ดังนั้นในไฟล์ config.session.php ให้ตั้งค่าตัวแปรปลอดภัยเป็นเท็จ

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

0

ฉันมีแอปที่มีโดเมนย่อยหลายโดเมนและคุกกี้เซสชันเป็นปัญหาระหว่างสิ่งเหล่านี้ การล้างคุกกี้ช่วยแก้ปัญหาของฉันได้

นอกจากนี้ลองตั้งค่าSESSION_DOMAINใน.envไฟล์ ใช้โดเมนย่อยที่คุณกำลังเรียกดู


0

ตรวจสอบให้แน่ใจว่ามีเวลาของระบบที่ถูกต้องบนเว็บเซิร์ฟเวอร์ของคุณ ในกรณีของฉันเครื่องพเนจรอยู่ในอนาคต (26 มกราคม 14:08:26 UTC 2226) ดังนั้นเวลาในคุกกี้เซสชันของเบราว์เซอร์ของฉันจึงหมดลงเมื่อ 200 ปีก่อน



0

ฉันได้หาวิธีแก้ปัญหาสองวิธีเพื่อหลีกเลี่ยงข้อผิดพลาดเหล่านี้ 1) โดยการเพิ่ม $ ที่ได้รับการป้องกันยกเว้น = ['/ yourroute'] ปิดการใช้งานการตรวจสอบโทเค็น csrf จากรูทที่กำหนด 2) แสดงความคิดเห็น \ App \ Http \ Middleware \ VerifyCsrfToken :: class line ในกลุ่มมิดเดิลแวร์ที่มีการป้องกันในเคอร์เนล


0

ฉันมีปัญหาเดียวกัน แต่ปัญหาไม่ได้อยู่ในกรอบ แต่อยู่ในเบราว์เซอร์ ฉันไม่รู้ว่าทำไม แต่ Google Chrome บล็อกคุกกี้โดยอัตโนมัติในกรณีของฉัน หลังจากคุกกี้ที่อนุญาตปัญหาได้รับการแก้ไข


0

คำตอบสั้น ๆ

เพิ่มรายการเส้นทางสำหรับregisterในapp/Http/Middleware/VerifyCsrfToken.php

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

และล้างแคชและเส้นทางแคชด้วยคำสั่ง:

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

รายละเอียด

ทุกครั้งที่คุณเข้าถึงไซต์ Laravel โทเค็นจะถูกสร้างขึ้นแม้ว่าเซสชันจะยังไม่เริ่มต้นก็ตาม จากนั้นในแต่ละคำขอโทเค็นนี้ (เก็บไว้ในคุกกี้) จะได้รับการตรวจสอบความถูกต้องโดยเทียบกับเวลาหมดอายุซึ่งกำหนดไว้ในSESSION_LIFETIMEฟิลด์ในconfig/session.phpไฟล์

หากคุณเปิดไซต์ไว้นานกว่าเวลาหมดอายุและพยายามร้องขอโทเค็นนี้จะได้รับการประเมินและข้อผิดพลาดการหมดอายุจะส่งคืน ดังนั้นเพื่อข้ามการตรวจสอบนี้ในรูปแบบที่อยู่นอกการทำงานของผู้ใช้สิทธิ์ (เช่นการลงทะเบียนหรือเข้าสู่ระบบ) app/Http/Middleware/VerifyCsrfToken.phpคุณสามารถเพิ่มยกเว้นเส้นทางใน


1
หากหน้าดังกล่าวประมวลผลข้อมูลที่ผู้ใช้ป้อนควรผ่านการตรวจสอบCSRF
Sougata Bose

@SougataBose อันที่จริงในกรณีนั้นฉันคิดว่าควรใช้โปรแกรมตรวจสอบ captcha เป็น Google reCAPTCHA
JC Gras


0

สารละลาย:

ใช้แท็บใหม่ที่ไม่ระบุตัวตนแล้วทดสอบอีกครั้ง

เหตุผล:

ในกรณีของฉันมีผู้ใช้รายอื่นเข้าสู่ระบบด้วยแผงการดูแลระบบของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.