โพสต์คำขอใน Laravel - ข้อผิดพลาด - 419 ขออภัยเซสชัน / 419 เพจของคุณหมดอายุแล้ว


92

ฉันติดตั้ง Laravel 5.7

เพิ่มแบบฟอร์มลงในไฟล์ \resources\views\welcome.blade.php

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

เพิ่มลงในไฟล์แล้ว \routes\web.php

Route::post('/foo', function () {
    echo 1;
    return;
});

หลังจากส่งคำขอ POST:

419 ขออภัยเซสชั่นของคุณหมดอายุแล้ว โปรดรีเฟรชและลองอีกครั้ง

ในเวอร์ชัน5.6ไม่มีปัญหาดังกล่าว


คุณลองเพิ่มการเปลี่ยนเส้นทางแล้วหรือยัง? แทนคุณreturn;สามารถโทรreturn redirect()->back();. จากสิ่งที่ฉันเห็นแอพไม่มีอะไรทำหลังจากโพสต์ขอ บางทีคุณอาจเปลี่ยนเส้นทางไปยังมุมมองหลังจากดำเนินการตามคำขอ
dcangulo

1
ฉันมีปัญหาเดียวกัน เมื่อฉันเปลี่ยนไปใช้เซสชันฐานข้อมูลสิ่งนี้จะเกิดขึ้นและเมื่อฉันเปลี่ยนกลับเป็นfileสำหรับSESSION_DRIVERใน.envนั้นก็ใช้ได้ เหตุใดเซสชันที่ใช้ฐานข้อมูลจึงไม่ทำงาน
Junaid Qadir Shekhanzai

ฉันคัดลอกรหัสที่แน่นอนของคุณไปยังการติดตั้ง laravel 5.7 ใหม่ มันได้ผล มีปัญหาที่อื่น
Kyle Wardle

ปัญหานี้เนื่องจากปัญหาโทเค็น ฉันพยายามเรียกใช้รหัสเดียวกันแบบนี้ แต่ไม่พบข้อผิดพลาด คุณควรให้ข้อมูลเพิ่มเติมเช่นโปรแกรมควบคุมเซสชันของคุณการแสดงค่า _token ในแบบฟอร์ม นอกจากนี้คุณสามารถแก้จุดบกพร่องด้วยตัวเองในไฟล์vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.phpบรรทัดที่ 67 เพื่อทราบสาเหตุ
bangnokia

1
ฉันตระหนักว่าฉันใช้sessionsโต๊ะเพื่อจุดประสงค์อื่น หลังจากเปลี่ยนชื่อตารางนี้เป็นชื่อที่เหมาะสมกว่าและรันartisan session:tableและรีเฟรชการย้ายข้อมูลทุกอย่างทำงานได้ดี
Junaid Qadir Shekhanzai

คำตอบ:


123

ก่อนอ่านด้านล่างให้แน่ใจว่าคุณมี@csrfหรือ{{ csrf_field() }}ในรูปแบบของคุณ เช่น

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

ข้อความแสดงข้อผิดพลาด Session Expired หรือ 419 Page Expired เกิดขึ้นเนื่องจากมีบางแห่งที่การตรวจสอบโทเค็น csrf ของคุณล้มเหลวซึ่งหมายความว่าApp\Http\Middleware\VerifyCsrfToken::classมิดเดิลแวร์เปิดอยู่แล้ว ในรูปแบบ@csrfมีการเพิ่มคำสั่งใบมีดแล้วซึ่งก็น่าจะใช้ได้เช่นกัน

จากนั้นพื้นที่อื่นที่ต้องตรวจสอบคือเซสชัน csrfตรวจสอบโทเค็นเกี่ยวข้องโดยตรงกับเซสชันของคุณดังนั้นคุณอาจต้องการตรวจสอบว่าโปรแกรมควบคุมเซสชันของคุณใช้งานได้หรือไม่เช่น Redis ที่กำหนดค่าไม่ถูกต้องอาจทำให้เกิดปัญหา

บางทีคุณอาจลองเปลี่ยนไดรเวอร์เซสชัน / ซอฟต์แวร์จาก.envไฟล์ของคุณไดร์เวอร์ที่รองรับจะได้รับด้านล่าง

ไดรเวอร์เซสชันที่รองรับใน Laravel 5, Laravel 6 และ Laravel 7 (Doc Link)

  • file - เซสชันจะถูกเก็บไว้ในที่จัดเก็บ / กรอบงาน / เซสชัน
  • cookie - เซสชันจะถูกเก็บไว้ในคุกกี้เข้ารหัสที่ปลอดภัย
  • database - เซสชันจะถูกเก็บไว้ในฐานข้อมูลเชิงสัมพันธ์
  • memcached/ redis- เซสชันจะถูกเก็บไว้ในร้านค้าที่ใช้แคชที่รวดเร็วเหล่านี้
  • array - เซสชันจะถูกเก็บไว้ในอาร์เรย์ PHP และจะไม่คงอยู่

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

สถานการณ์ที่อาจเกิดข้อผิดพลาดได้

  • อาจเป็นไปได้ว่าเซสชันที่ใช้ไฟล์อาจไม่ทำงานเนื่องจากปัญหาการอนุญาตกับ/storageไดเร็กทอรี (googling ด่วนจะดึงโซลูชันมาให้คุณ) นอกจากนี้อย่าลืมใส่ 777 สำหรับไดเร็กทอรีไม่ใช่วิธีแก้ปัญหา

  • ในกรณีของไดรเวอร์ฐานข้อมูลการเชื่อมต่อฐานข้อมูลของคุณอาจผิดพลาดหรือsessionsตารางอาจไม่มีอยู่หรือกำหนดค่าไม่ถูกต้อง (ส่วนการกำหนดค่าที่ไม่ถูกต้องได้รับการยืนยันว่าเป็นปัญหาตามความคิดเห็นของ @Junaid Qadir)

  • redis/memcached การกำหนดค่าไม่ถูกต้องหรือถูกจัดการโดยโค้ดอื่น ๆ ในระบบในเวลาเดียวกัน

อาจเป็นความคิดที่ดีที่จะดำเนินการ php artisan key:generateและสร้างรหัสแอปใหม่ซึ่งจะช่วยล้างข้อมูลเซสชันได้

ล้างแคชเบราว์เซอร์ยากฉันพบว่า Chrome และ Firefox เป็นผู้ร้ายมากกว่าที่ฉันจำได้

อ่านเพิ่มเติมว่าเหตุใดคีย์แอปพลิเคชันจึงมีความสำคัญ


1
บางครั้งเบราว์เซอร์ส่วนใหญ่ Chrome จะไม่ใส่ค่าเซสชัน Set-Cookie เพราะผิดรูปแบบหรือไม่เป็นไปตามมาตรฐาน ดังนั้น Laravel จะไม่พบค่าเซสชันใด ๆ ที่มีอยู่จากคำขอ HTTP เพื่อเปรียบเทียบกับ_tokenค่าที่ได้รับจาก FORM หลีกเลี่ยงการใช้SESSION_DOMAIN=...กับ IP ซึ่งข้อกำหนดเกี่ยวกับคุกกี้ของ Chrome และHTTPถือว่าไม่ปลอดภัย
KeitelDOG

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

@ TheAngelM97 คุณสามารถทำซ้ำข้อผิดพลาดนี้ได้อย่างง่ายดายโดยไปที่หน้าเข้าสู่ระบบหรือลงทะเบียน อย่าทำอะไรเลยอาจจะมากกว่า 30 นาที จากนั้นเมื่อคุณคลิกที่ส่ง419 Page Expiredจะปรากฏขึ้น เพื่อประโยชน์ในการใช้งานคุณจะบอกผู้ใช้ง่ายๆได้อย่างไรว่าเกิดอะไรขึ้นและจะแก้ไขอย่างไร
Pathros

38

เนื่องจากแบบฟอร์มต้องใช้ csrf ในเวอร์ชัน 5.7 พวกเขาเปลี่ยนเป็น @csrf

<form action="" method="post">
    @csrf
    ...

ผู้อ้างอิง: https://laravel.com/docs/5.7/csrf


6
แบบฟอร์มของเขามีโทเค็น csrf ไม่แน่ใจว่าเขาแก้ไขในภายหลังหรือไม่
eResourcesInc

ใช่รูปแบบของเขาเดิมมีcsrfฟิลด์ฉันเพิ่งดูประวัติการแก้ไข
Dexter Bengil

สิ่งนี้ไม่สามารถแก้ปัญหาในกรณีของฉันได้เช่นกันเนื่องจากฉันมักจะมีมันอยู่ในรูปแบบของฉัน แต่เริ่มพบข้อผิดพลาดเนื่องจากการเปลี่ยนแปลงอื่น ๆ
Sami

14

กรณีที่ 1: หากคุณกำลังเรียกใช้โปรเจ็กต์ในระบบโลคัลของคุณเช่น 127.0.01: 8000

แล้ว

เพิ่ม SESSION_DOMAIN=ในไฟล์. env ของคุณ

หรือใน config / session.php ของคุณ 'domain' => env('SESSION_DOMAIN', ''),

แล้วเรียกใช้ php artisan cache:clear

กรณีที่ 2: หากโปรเจ็กต์กำลังทำงานบนเซิร์ฟเวอร์และคุณมีโดเมนเช่น "mydomain.com"

เพิ่ม SESSION_DOMAIN=mydomain.comในไฟล์. env ของคุณ

หรือใน config / session.php ของคุณ 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

แล้วเรียกใช้ php artisan cache:clear


9

วิธีการใช้

{{ csrf_field() }} แทน @csrf

ข้อผิดพลาด 419 ส่วนใหญ่เกิดจากปัญหาโทเค็น csrf


คุณหมายถึง{{ csrf_field() }}?
Travis Britz

มันสร้าง html เดียวกันกับที่ @csrf ได้ผลลัพธ์เช่นเดียวกัน
Sami


8

ลองแสดงความคิดเห็น\App\Http\Middleware\EncryptCookies::classใน\app\Http\Kernel.php ฉันมีปัญหาที่คล้ายกันและแก้ไขได้โดยทำเช่นนั้น อาจไม่ใช่ทางออกที่ดีที่สุดเพราะการรักษาความปลอดภัย แต่อย่างน้อยก็ใช้งานได้

ก่อนหน้านี้ฉันลอง:

  • ล้างแคช
  • สร้างรหัสแอปใหม่
  • เรียกใช้แอปของฉันในเบราว์เซอร์ต่างๆ (Chrome 70, Mozilla Firefox 57 และ IE 11)
  • เรียกใช้แอปของฉันในคอมพิวเตอร์เครื่องอื่น
  • แสดงความคิดเห็น\App\Http\Middleware\VerifyCsrfToken::classใน\app\Http\Kernel.php
  • แสดงความคิดเห็น\Illuminate\Session\Middleware\AuthenticateSession::classใน\app\Http\Kernel.php
  • อัพเกรดและดาวน์เกรด Laravel (ระหว่าง 5.6 ถึง 5.7)

แต่สิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน

แก้ไข

กรณีของฉันที่นี่คือทุกครั้งที่ฉันเข้าสู่ระบบไฟล์เซสชันใหม่จะถูกสร้างขึ้น (ไฟล์เก่ายังคงมีอยู่ แต่ถูกลืมทันทีตรวจสอบstorage/framework/sessions) และโทเค็น CSRF ใหม่จะถูกสร้างขึ้น ดังนั้นปัญหาไม่ได้อยู่ที่ VerifyCsrfToken

ในฐานะที่เป็น @Vladd กล่าวถึงในส่วนความคิดเห็นที่คุณควรจะไม่เคย\App\Http\Middleware\VerifyCsrfToken::classแสดงความคิดเห็นออก คุณต้องตรวจสอบว่าคุณได้ส่ง CSRF TOKEN ที่ถูกต้องไปยังเซิร์ฟเวอร์


1
ในบรรดาวิธีที่คุณกล่าวถึงการแสดงความคิดเห็นเฉพาะ \ App \ Http \ Middleware \ VerifyCsrfToken :: class ใน \ app \ Http \ Kernel.php ใช้ได้กับฉัน
Lex Soft

1
ล้างแคชสร้างรหัสแอปใหม่ + ลบคุกกี้
dobs

คุณจะไม่ต้องแก้ไข \ App \ Http \ Middleware \ VerifyCsrfToken :: class ทำไมคุณจะทำเช่นนั้น? เพื่อสร้างจุดอ่อนในตัวคุณเองในแอพ?
Vladd

@dobs ขอบคุณสำหรับการเพิ่ม '+ ลบคุกกี้' เพราะฉันได้รับข้อผิดพลาด 419 แม้ว่าจะทำทุกอย่างเท่าที่ทำได้แล้วและจะใช้ได้ผลก็ต่อเมื่อฉันล้างคุกกี้ของเบราว์เซอร์ / พยายามในโหมดไม่ระบุตัวตน
Niraj Pandey

6

เปลี่ยนของคุณ@csrfใน welcome.blade.php เป็น<input type="hidden" name="_token" value="{{ csrf_token() }}">

ดังนั้นรหัสของคุณจึงเป็นดังนี้:

<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

อาจเป็นปัญหากับเซสชันของคุณ หลังจากเล่นกับการตั้งค่าเหล่านี้ฉันแก้ไขปัญหาของฉันได้ สำหรับฉันมันกลายเป็นตัวเลือกสุดท้าย

  • หากคุณกำลังใช้ "ไฟล์" เป็นโปรแกรมควบคุมเซสชันให้มองเข้าไปในพื้นที่จัดเก็บ / กรอบงาน / เซสชันหากเซสชันได้รับการบันทึกหลังจากรีเฟรช ถ้าไม่เป็นไปได้มากว่าเกิดจากการอนุญาตโฟลเดอร์ไม่ถูกต้อง ตรวจสอบว่าที่เก็บข้อมูล / โฟลเดอร์ของคุณถูกต้อง
  • พยายามปิดการใช้งาน Javascript ทั้งหมดในเพจของคุณ (ไม่ว่าจะโดยปิดใช้งานผ่านเนวิเกเตอร์หรือภายในโค้ด) และตรวจสอบให้แน่ใจว่า 'http_only' => จริง
  • พยายามใช้โดยมีและไม่มี https
  • ตรวจสอบให้แน่ใจว่าตัวแปร SESSION_DRIVER ไม่เป็นโมฆะ
  • พยายามสลับระหว่าง 'เข้ารหัส' => เท็จและ 'เข้ารหัส' => จริง
  • ลองเปลี่ยนชื่อคุกกี้ 'cookie' => 'laravelsession',
  • ลองตั้งค่า SESSION_DOMAIN ของคุณเป็นโดเมนจริงหรือค่าว่าง
  • พยายามสลับระหว่าง 'secure' => env ('SESSION_SECURE_COOKIE', false) และ 'secure' => env ('SESSION_SECURE_COOKIE', true),

ที่มา: Laravel Session จะเปลี่ยนแปลงทุกครั้งที่รีเฟรช / คำขอใน Laravel 5.4


ใช่หลังจากลองทำสิ่งอื่น ๆSESSION_SECURE_COOKIEสวิตช์ (เปลี่ยนเป็นfalse) ก็ทำเพื่อฉัน (บนlocalhost:8000)
Marten Koetsier

SESSION_SECURE_COOKIE ก็เป็นปัญหาสำหรับฉันเช่นกันฉันเปลี่ยนมันเมื่อทำตามคำแนะนำสำหรับการเพิ่มประสิทธิภาพเว็บไซต์
Bram Janssen

สำหรับฉันมันใช้งานได้กับ https แต่ไม่ใช่กับ http ... มีความคิดอย่างไร ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมฉันใช้เวลาหลายชั่วโมงในการค้นหา
sharkyenergy

5

ในการแก้ไขข้อผิดพลาดนี้ก่อนอื่นคุณต้องแทรกหนึ่งในคำสั่งต่อไปนี้ลงในแท็กฟอร์ม

@csrf หรือ {{ csrf_field }}

หากปัญหาของคุณไม่ได้รับการแก้ไขให้ดำเนินการดังต่อไปนี้: (โปรดทราบว่าคำสั่งใดคำสั่งหนึ่งข้างต้นต้องอยู่ในแท็กฟอร์ม)

1. ใส่หนึ่งในคำสั่งต่อไปนี้ลงในแท็กแบบฟอร์ม @csrfหรือ{{ csrf_field }}

2. เปิดไฟล์. env และเปลี่ยนค่าเป็น "ไฟล์" ในส่วน SESSION_DRIVER

3. จากนั้นคุณควรรีเซ็ตแคช laravel พิมพ์คำสั่งด้านล่างในเทอร์มินัล

php artisan view:clear php artisan route:clear php artisan cache:clear

php artisan config:cache

4. ในขั้นตอนสุดท้ายให้ถอดปลั๊กโปรเจ็กต์ออกจากการให้บริการแล้วคลิกอีกครั้งบน php artisan serve

ฉันหวังว่าปัญหาของคุณจะได้รับการแก้ไข


4

เพิ่มโทเค็น csrf และปัญหาของคุณจะได้รับการแก้ไข {{csrf_token}} หรือ @csrf


3

หลังจากเวลาผ่านไปฉันได้แก้ไขด้วยวิธีนี้

พา ธ การติดตั้ง laravel ของฉันไม่เหมือนกับที่ตั้งไว้ในไฟล์ config session.php

'domain' => env('SESSION_DOMAIN', 'example.com'),

2

อาจจะมากเกินไป แต่คุณสามารถลองสิ่งนี้:

// แบบฟอร์มการเรียกชื่อเส้นทางที่มีเขตโทเค็นเพิ่มซ่อน

<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>

// ชื่อเส้นทาง

Route::post('/foo', function () {
    return 'bar';
})->name('foo');

// เพิ่มสิ่งนี้ภายใน<head></head>บล็อก:

<meta name="_token" content="{!! csrf_token() !!}" />

ฉันได้ทดสอบในพื้นที่ของฉันโดยใช้ Homestead บน Laravel 5.7 ซึ่งเป็นการติดตั้งใหม่โดยใช้ Laravel Installer 2.0.1 และใช้งานได้ สภาพแวดล้อมของคุณเป็นอย่างไร?

ทฤษฎี: ฉันสงสัยว่ามันเกี่ยวข้องกับเบลดเรนเดอร์แท็ก html {{ }}กับ{!! !!}สภาพแวดล้อมของคุณหรือว่าคุณให้บริการอย่างไร (เช่นphp artisan serve) สิ่งที่ทำให้ผมคิดว่าเป็นline 335ของ/vendor/laravel/framework/src/illuminate/Foundation/helpers.phpควรทำให้บรรทัดเดียวกันพิมพ์ด้วยตนเองออกไป


เยี่ยมไปเลย แต่<meta>ควรวางแท็กไว้ภายใน<head>ไม่ใช่ภายในไฟล์<body>. ฉันไม่แน่ใจว่าโปรแกรมตรวจสอบ HTML ต้องการสิ่งนี้
emix

ฉันจะบอกว่าคุณถูกต้องและควรย้ายไปที่ศีรษะ
jeremykenedy

2

ไม่มีปัญหาในรหัส ฉันได้ตรวจสอบด้วยรหัสเดียวกับที่คุณเขียนด้วยการติดตั้งใหม่

รหัสแบบฟอร์ม:

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

web.php รหัสไฟล์:

Route::get('/', function () {
    return view('welcome');
});

Route::post('/foo', function () {
    echo 1;
    return;
});

ผลลัพธ์หลังจากส่งแบบฟอร์มคือ: ผลลัพธ์หลังจากส่งแบบฟอร์ม

หากคุณล้างแคชของเบราว์เซอร์หรือลองใช้กับเบราว์เซอร์อื่นฉันคิดว่ามันจะได้รับการแก้ไข


2

วิธีการที่ไม่ดีอย่างรวดเร็วคือไปที่ app \ http \ middleware \ Verifycsrftoken.php และเพิ่มเส้นทางใน $ ยกเว้นรายการ คำขอโพสต์จะถูกเพิกเฉยสำหรับการตรวจสอบโทเค็น CSRF

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];

2

419 | หน้าข้อผิดพลาดนี้หมายถึงปัญหาด้านความปลอดภัยlaravelหมายถึงฟิลด์โทเค็น csrfไม่ถูกต้อง

ใช้{{csrf_field}} และปัญหาของคุณจะได้รับการแก้ไข


2

ควรใช้งานได้หากคุณลองทำตามขั้นตอนเหล่านี้ทั้งหมด:

  1. ตรวจสอบให้แน่ใจว่าเซสชันของคุณได้รับการกำหนดค่าไว้เป็นอย่างดีวิธีที่ง่ายที่สุดคือการสร้างไฟล์และตรวจสอบให้แน่ใจว่าโฟลเดอร์ที่เก็บข้อมูลมีสิทธิ์ chmod 755 จากนั้น.envคุณตั้งค่าไว้ดังต่อไปนี้โปรแกรมควบคุมเซสชันไฟล์เป็นวิธีที่ง่ายที่สุดในการตั้งค่า

    SESSION_DRIVER=file
    SESSION_DOMAIN=
    SESSION_SECURE_COOKIE=false
    
  2. ตรวจสอบให้แน่ใจว่าโฟลเดอร์ Cache ถูกล้างและเขียนได้คุณสามารถทำได้โดยเรียกใช้คำสั่ง artisan ด้านล่าง

    php artisan cache:clear
    
  3. ตรวจสอบให้แน่ใจว่ามีการตั้งค่าสิทธิ์ของโฟลเดอร์ไว้อย่างดีควรกำหนดค่าดังต่อไปนี้:

    sudo chmod -R 755 storage
    sudo chmod -R 755 vendor
    sudo chmod -R 644 bootstrap/cache
    
  4. ตรวจสอบว่าแบบฟอร์มของคุณมี@csrfโทเค็นรวมอยู่ด้วย

หวังว่านี่จะช่วยแก้ปัญหาของคุณได้


การตั้งค่าสิทธิ์ sudo ทำให้ laravel ของฉันล้มเหลวอย่างสมบูรณ์
Vladimir Despotovic

2

ไปที่ config / sessions.php

ค้นหาแถว

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

เปลี่ยนเป็นเท็จ

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

หากตั้งค่าพารามิเตอร์นี้เป็นเบราว์เซอร์ TRUE คุณจะต้องใช้โปรโตคอล HTTPS มิฉะนั้นจะไม่เก็บเซสชัน เนื่องจากไม่ถูกต้อง


1

ในไฟล์ Http/Kernel.php

ลองแสดงความคิดเห็นบรรทัดนี้:

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

ในอาร์เรย์มิดเดิลแวร์ของเว็บของคุณ

อาจเป็นต้นตอของปัญหาของคุณ


1

โดยค่าเริ่มต้นฉันไม่มีปัญหานี้ สิ่งที่ฉันทำคือchmod -R 644 sessions การจำลองปัญหา

ใส่คำอธิบายภาพที่นี่

หลังจากนั้นฉันให้สิทธิ์แก่โฟลเดอร์เซสชันโดย chmod -R 755 sessions

ตอนนี้รหัสโครงการของฉันใช้งานได้อีกครั้ง

ใส่คำอธิบายภาพที่นี่

สาเหตุที่เกิดขึ้นคือคุณเก็บแคชไว้ในไฟล์โดยไม่มีสิทธิ์ในการเขียน

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

แนวทางแก้ไข:

1 - ตามที่ฉันได้แก้ไขไว้ข้างต้นคุณสามารถให้สิทธิ์ 755 ในโฟลเดอร์เซสชันได้ 2 - คุณสามารถใช้การกำหนดค่าโปรแกรมควบคุมเซสชันอื่นได้

ไฟล์ - เซสชันจะถูกเก็บไว้ในที่จัดเก็บ / กรอบงาน / เซสชัน คุกกี้ - เซสชันจะถูกเก็บไว้ในคุกกี้เข้ารหัสที่ปลอดภัย ฐานข้อมูล - เซสชันจะถูกเก็บไว้ในฐานข้อมูลเชิงสัมพันธ์ memcached / redis - เซสชันจะถูกเก็บไว้ในร้านค้าที่ใช้แคชที่รวดเร็วเหล่านี้ อาร์เรย์ - เซสชันจะถูกเก็บไว้ในอาร์เรย์ PHP และจะไม่คงอยู่

จำไว้; หากคุณต้องการใช้ memcached / redis คุณจำเป็นต้องติดตั้งบนเซิร์ฟเวอร์ของคุณหรือคอนเทนเนอร์ docker redis ของคุณต้องทำงานอยู่


1

จริงๆแล้ว CSRF เป็นโทเค็นตามเซสชัน เพิ่มเส้นทางของคุณในกลุ่มเส้นทางและเพิ่มมิดเดิลแวร์ที่ควบคุมเซสชัน

เว็บเป็นมิดเดิลแวร์เริ่มต้นใน laravel และสามารถควบคุมคำขอเซสชันได้

Route::group(array('middleware' => ['web']), function () {
  Route::post('/foo', function () {
     echo 1;
     return;
  });
});

1

หากคุณมีcsrfคำสั่งคุณอาจเปลี่ยนวิธีการทำงานของเซสชัน

ในconfig/session.phpตรวจสอบ'ปลอดภัย'ฟิลด์ ควรเป็นเท็จหากไม่มี https บนเซิร์ฟเวอร์ของคุณ

คุณยังสามารถใส่ไฟล์SESSION_SECURE_COOKIE=FALSEของคุณ.env(ไดเรกทอรีราก)


1

เปิดบรรทัดคำสั่ง cmd ในโครงการของคุณ

1. คำสั่ง

php artisan config:cache

2. comand

php artisan route:clear

1

คุณมี csrf ในส่วนหัวของแอปพลิเคชันของคุณด้วยหรือไม่?

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

1

ในขณะที่ฟอร์ม@csrfยังคงแสดงให้เห็น419 pages has expired

ฉันแก้ไขมันหลังจากอัปเดตSESSION_SECURE_COOKIEตัวเลือกเป็นเท็จใน config / session.php

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

กว่าล้างแคช


1

ฉันเพิ่งไปมาตลอดและฉันก็วนเวียนอยู่ที่นี่เพื่อหาคำตอบ .. ในกรณีของฉันวิธีแก้ปัญหาคือการล้างประวัติเบราว์เซอร์


1

ในกรณีของฉันคือ?> ที่ส่วนท้ายของ route.php ใช้เวลาอยู่ที่นั่นนานมาก ...


1
เหมือนกันฉันลืมใส่?>ท้ายweb.php
msalihbindak

1
ว้าว. ไม่ว่าปัญหาเดียวกันในกรณีของฉัน แต่วิธีการแก้ปัญหาของคุณทำให้ผมตรวจสอบเรื่องนี้และเมื่อผมทำผมสังเกตเห็นช่องว่างก่อนเปิด <?phpแท็กและนั่นคือสิ่งที่ก่อให้เกิด 419 ในแบบฟอร์มในเว็บไซต์ทุก! แปลกที่มันไม่ได้เกิดขึ้นกับ PHP 7.3 และเริ่มต้นหลังจากอัปเกรดเป็น 7.4!
Ben Johnson

1

เพิ่มในแบบฟอร์มของคุณใน.blade.phpไฟล์{{ csrf_field() }}หรือ@csrfแบบนี้

<form method='POST' action='route("exampleRoute")'>
   {{ csrf_field() }} or @csrf
   ....
   ....
</form>

1
คำตอบของคุณแตกต่างจากคำตอบที่มีอยู่อย่างไร
Shobi

0

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

ฉันหวังว่านี่จะช่วยใครบางคนจากการเกาหัวไม่กี่ชั่วโมง!

อินพุตแบบฟอร์มที่ปิดใช้งานจะไม่ปรากฏในคำขอ


0

ฉันได้รับปัญหานี้เมื่อนานมาแล้ว ฉันจำได้ว่ามันทำให้ได้รับอนุญาตจากstorage/framework/sessions . คุณอาจต้องการเปลี่ยนตามchmod -R 0777 storage/framework/sessionsคำสั่ง มันได้ผลสำหรับฉัน


0

ในกรณีของฉันมันไร้สาระมาก ฉันได้รับข้อผิดพลาด 419 เมื่อฉันใส่Auth::routes()ที่ด้านบนของไฟล์เส้นทาง

Auth::routes();

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

และฉันแก้ไขข้อผิดพลาดโดยการย้าย Auth::routes();ไปที่ด้านล่างของไฟล์เส้นทาง

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

Auth::routes();

บางทีมันอาจช่วยกรณีของคุณได้เช่นกัน โชคดี.

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