“Trang đã hết hạn do không hoạt động” - Laravel 5.5


111

Trang đăng ký của tôi đang hiển thị biểu mẫu đúng với CsrfToken ( {{ csrf_field() }}) có trong biểu mẫu).

HTML biểu mẫu

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

Tôi đang sử dụng xác thực sẵn có cho người dùng. Không thay đổi bất cứ điều gì ngoại trừ các tuyến đường và chuyển hướng.

Khi tôi gửi biểu mẫu (ngay sau khi tải lại), nó cho biết Trang đã hết hạn do không hoạt động. Vui lòng làm mới và thử lại. lỗi.

Tôi đang thiếu một điều rất nhỏ. Nhưng không chắc nó là gì. Bất kỳ giúp đỡ?

Cập nhật

Đã tìm thấy sự cố. Trình điều khiển phiên đã được đặt thành mảng. Đã thay đổi nó thành tệp và lỗi đã biến mất ngay bây giờ. Nhưng điều gì là sai nếu tôi sử dụng mảng?


Có thể liên quan đến việc lưu trữ_path không thể ghi được. Đây là nơi nó lưu trữ dữ liệu phiên liên quan đến mã thông báo nếu bạn đang sử dụng phiên dựa trên tệp.
Devon

1
Đã tìm thấy sự cố. Trình điều khiển phiên đã được đặt thành array. Đã thay đổi nó thành tệp và lỗi đã biến mất ngay bây giờ. Nhưng điều gì là sai nếu tôi sử dụng mảng?
Sougata Bose


1
Đối với phiên bản mới của laravel, hãy sử dụng @csrf để giải quyết vấn đề.
Vương Trân

Câu trả lời:


164

Nếu bạn đến câu trả lời này trực tiếp từ một tìm kiếm , hãy đảm bảo rằng bạn đã thêm mã thông báo csrf vào biểu mẫu của mình với {{ csrf_field() }}như OP.


Nếu bạn đã đặt trình điều khiển phiên của mình thành tệp:

Có thể liên quan đến việc lưu trữ_path không thể ghi được. Đây là nơi nó lưu trữ dữ liệu phiên liên quan đến mã thông báo nếu bạn đang sử dụng phiên dựa trên tệp. Có thể được xác minh vớiis_writable(config('session.files'))


Đối với OP, trình điều khiển phiên đã được đặt thành mảng. Mảng chỉ dùng để thử nghiệm. Vì dữ liệu không được duy trì, nó sẽ không thể so sánh mã thông báo trong yêu cầu tiếp theo.

Trình điều khiển mảng được sử dụng trong quá trình thử nghiệm và ngăn không cho dữ liệu được lưu trữ trong phiên được duy trì.

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


Kiểm tra config / session.php

Cuối cùng, một vấn đề tôi vừa gặp phải, chúng tôi có một dự án có miền phiên và cài đặt bảo mật trong config / session.php nhưng trang web phát triển không sử dụng HTTPS (SSL / TLS). Điều này gây ra lỗi chung này vì session.secure được đặt thành true theo mặc định.


3
Đồng ý. Nhưng hiện tại nó đang được phát triển. Vì vậy, nếu tôi sử dụng mảng, tại sao nó lại cho tôi lỗi đó?
Sougata Bose

Thử nghiệm @SougataBose không phát triển. Dữ liệu mảng không được duy trì ...
Devon

Đó là lý do ta nên đi qua các tài liệu đúng .. :)
Sougata Bose

Vấn đề của tôi đã không được giải quyết. Tôi đã làm những điều cơ bản thực sự. Nhưng tôi đang sử dụng các nhà cung cấp và dịch vụ tùy chỉnh. Không có vấn đề gì khi tôi gọi một phương thức bộ điều khiển nhưng khi tôi chạy một phương thức dịch vụ trong bộ điều khiển được gọi với yêu cầu đăng, sự cố sẽ xuất hiện!
Behnam Azimi

1
Tôi đã gặp sự cố tương tự với các phiên nhưng liên quan đến thử nghiệm. Hóa ra khi tôi đang sử dụng Carbon::setTestNow($time);trong các bài kiểm tra, tôi đã không xóa nó bằng cách sử dụng Carbon::setTestNow();sau đó.
bạo độngCode

77

Tôi gặp phải vấn đề tương tự trong Laravel 5.5. Trong trường hợp của tôi, nó đã xảy ra sau khi thay đổi một tuyến đường từ GET thành POST. Vấn đề là do tôi quên chuyển mã thông báo CSRF khi chuyển sang POST.

Bạn có thể đăng mã thông báo CSRF trong biểu mẫu của mình bằng cách gọi:

 {{ csrf_field() }}

Hoặc loại trừ tuyến đường của bạn trong ứng dụng / Http / Middleware / VerifyCsrfToken.php

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

2
csrf_field()trình bày dưới dạng. Câu trả lời được chấp nhận mô tả vấn đề. Cảm ơn.
Sougata Bose

1
Trong trường hợp của tôi, tôi đã nhận được ĐĂNG từ bên thứ ba, vì vậy việc thêm csrf_field () không phải là một tùy chọn. Vì CSRF không phải là một yếu tố trong trường hợp của tôi, nên việc thêm một ngoại lệ vào tuyến đường này đã giải quyết được vấn đề. Cảm ơn.
Fábio Duque Silva,

Vấn đề của tôi đã không được giải quyết. Tôi đã làm những điều cơ bản thực sự. Nhưng tôi đang sử dụng các nhà cung cấp và dịch vụ tùy chỉnh. Không có vấn đề gì khi tôi gọi một phương thức bộ điều khiển nhưng khi tôi chạy một phương thức dịch vụ trong bộ điều khiển được gọi với yêu cầu đăng, sự cố sẽ xuất hiện!
Behnam Azimi

1
Vui lòng không tắt xác minh CSRF! Nó rất quan trọng để bảo vệ phải có. Tìm hiểu cách gửi mã thông báo đúng cách và bảo vệ người dùng đã đăng nhập của bạn khỏi javascript độc hại có thể gửi hành động thay mặt họ.
Devon



6

Trường hợp của tôi đã được giải quyết với SESSION_DOMAIN, trong máy cục bộ của tôi phải được đặt thành xxx.localhost. Nó đã gây ra xung đột với quá trình sản xuất SESSION_DOMAIN, xxx.comđược đặt trực tiếp trong tệp cấu hình session.php.


Bạn đang sử dụng trình điều khiển phiên nào? filehoặc cookie?
KeitelDOG

4

Một số thông tin được lưu trữ trong cookie có liên quan đến các phiên bản trước của laravel đang được phát triển. Vì vậy, nó xung đột với các mã thông báo được tạo bằng csrf được tạo bởi các phiên bản của người khác. Chỉ cần Xóa cookie và thử.


bạn có thể thấy <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">loại mã trong html được tạo không?
Suresh Velusamy

Nó ở đó. Đã tìm thấy sự cố. Trình điều khiển phiên đã được đặt thành mảng. Đã thay đổi nó thành tệp và lỗi đã biến mất ngay bây giờ.
Sougata Bose

4

Đối với những người vẫn còn vấn đề và không có gì giúp đỡ. Chú ý đến tham số php.ini mbstring.func_overload. Nó phải được đặt thành 0. Và mbstring.internal_encoding được đặt thành UTF-8. Trong trường hợp của tôi, đó là một vấn đề.


Cảm ơn rât nhiều! Câu trả lời của bạn đã cứu bộ não của tôi khỏi sự cố)
Rustembek Kaliyev

3

Tôi thay đổi quyền lưu trữ và lỗi đã biến mất. Có vẻ như thiếu sự cho phép là vấn đề.

sudo chmod -R 775 storage/

2
Hãy cẩn thận khi sử dụng các quyền mở như vậy một cách đệ quy. Tôi thực sự khuyên bạn nên chống lại 775 cho các tệp. 755 cho thư mục và 644 cho tệp là tiêu chuẩn.
Devon

3

thêm @csrfvào biểu mẫu và cũng đi đến VerifyCsrfToken.php

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

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

1

Trong trường hợp của tôi, trang web ổn trong máy chủ nhưng không ổn ở cục bộ. Sau đó, tôi nhớ tôi đã làm việc trên trang web an toàn.
Vì vậy, trong tệp config.session.php, hãy đặt biến an toàn thành false

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

0

Tôi có ứng dụng với nhiều tên miền phụ và cookie phiên là vấn đề giữa chúng. Xóa cookie đã giải quyết được vấn đề của tôi.

Ngoài ra, hãy thử đặt tệp .envSESSION_DOMAIN trong . Sử dụng miền phụ chính xác mà bạn đang duyệt.


0

Đảm bảo có thời gian hệ thống chính xác trên máy chủ web của bạn. Trong trường hợp của tôi, máy lang thang ở trong tương lai (ngày 26 tháng 1 14:08:26 UTC 2226) vì vậy tất nhiên thời gian trong cookie phiên của trình duyệt của tôi đã hết hạn cách đây hơn 200 năm.



0

Tôi đã tìm ra hai giải pháp để tránh những lỗi này 1) bằng cách thêm bảo vệ $ ngoại trừ = ['/ yourroute'] có thể tắt kiểm tra mã thông báo csrf từ gốc đã xác định. 2) chỉ cần nhận xét \ App \ Http \ Middleware \ VerifyCsrfToken :: dòng lớp trong nhóm phần mềm trung gian được bảo vệ trong hạt nhân


0

Tôi đã gặp vấn đề tương tự nhưng vấn đề không nằm trong khuôn khổ mà ở trình duyệt. Tôi không biết tại sao nhưng google chrome tự động chặn cookie, trong trường hợp của tôi. Sau khi cookie được phép, vấn đề đã được giải quyết.


0

Câu trả lời ngắn

Thêm mục nhập tuyến đường cho registertrongapp/Http/Middleware/VerifyCsrfToken.php

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

và xóa bộ nhớ cache và định tuyến bộ nhớ cache bằng các lệnh:

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

Chi tiết

Mỗi khi bạn truy cập một trang Laravel, một mã thông báo sẽ được tạo, ngay cả khi phiên chưa được bắt đầu. Sau đó, trong mỗi yêu cầu, mã thông báo này (được lưu trữ trong cookie) sẽ được xác thực theo thời gian hết hạn, được đặt trong SESSION_LIFETIMEtrường trênconfig/session.php hồ sơ.

Nếu bạn giữ trang web mở trong hơn thời gian hết hạn và cố gắng thực hiện yêu cầu, mã thông báo này sẽ được đánh giá và lỗi hết hạn sẽ trở lại. Vì vậy, để bỏ qua xác thực này trên các biểu mẫu nằm ngoài chức năng của người dùng đã xác thực (chẳng hạn như đăng ký hoặc đăng nhập), bạn có thể thêm tuyến đường ngoại trừ vào app/Http/Middleware/VerifyCsrfToken.php.


1
Nếu trang đó xử lý thông tin đầu vào của người dùng thì trang đó sẽ trải qua kiểm tra CSRF .
Sougata Bose

@SougataBose Thật vậy, trong trường hợp đó, tôi nghĩ tốt nhất nên sử dụng trình xác thực hình ảnh xác thực là Google reCAPTCHA
JC Gras

0

Nhiều khi nó xảy ra bởi vì bạn đang thử nghiệm dự án trong ngày


0

Giải pháp:

sử dụng tab mới ẩn danh rồi kiểm tra lại.

lý do:

trong trường hợp của tôi, một người dùng khác đã đăng nhập bằng bảng quản trị của tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.