2013-06-21 33 views
5

kịch bản Vấn đề:Laravel 4: Ngăn chặn nhiều hình thức đệ trình - CSRF Mã

tôi là tạo ra một blog với Laravel 4. Các hình thức đó là chịu trách nhiệm về việc tạo ra các bài đăng trên blog mới được bảo đảm bằng việc xây dựng trong CSRF bảo vệ (Laravel Docs: CSRF Protection).

Mọi thứ hoạt động tốt cho đến nay, nhưng có vẻ như ấu trùng không làm mới mã thông báo csrf trên mọi yêu cầu.

Sự cố xảy ra là nếu người dùng nhấn vào nút quay lại của trình duyệt để quay lại biểu mẫu đã gửi, dữ liệu đã nhập sẽ tiếp tục và người dùng có thể "gửi lại" biểu mẫu. Điều này có thể tạo ra một cánh cửa mở cho kẻ gửi thư rác.

Thông thường điều này bị ngăn chặn bởi mã thông báo CSRF, vì nó được làm mới theo mọi yêu cầu, nhưng Laravel dường như không làm như vậy.

Tôi sử dụng phương pháp "Bộ điều khiển tài nguyên" của Laravel (Laravel Docs: Resource Controllers) để xử lý dạng xem bài đăng và dạng blog. Hơn nữa, tôi sử dụng trình xác nhận đầu vào của Laravels trước khi lưu trữ đầu vào được gửi trong cơ sở dữ liệu (MySQL).


Vì vậy, các ý tưởng sau đây đã đưa ra:

  1. bằng cách nào đó buộc Laravel 4 để tạo lại CSRF tự động trên mọi yêu cầu

  2. tạo một token và bao gồm nó thành dạng bằng tay

  3. lưu dấu thời gian của hình thức đệ trình trong phiên người dùng (php hoặc cơ sở dữ liệu) và ga ne hình thức đệ trình w trên cơ sở thời gian

Cá nhân tôi thích những ý tưởng đầu tiên, nhưng tiếc là tôi không thể tìm thấy một cách để buộc laravel cư xử thế nào tôi muốn nó được, mà không cần hack "Illuminate" riêng của mình (mà tôi muốn giữ nguyên trạng thái "để có thể cập nhật laravel mà không cần" rắc rối hoff "^^).

Bạn sẽ đề xuất điều gì?

Bạn tự xử lý vấn đề như thế nào?

+1

Tôi chỉ cần kiểm tra như thế nào stackoverflow xử lý các hình thức trên "history.back()": Trên tái nộp của cùng một dữ liệu, nó nói "Một câu hỏi với tiêu đề đó đã tồn tại; hãy cụ thể hơn." và "Bạn chỉ có thể đăng 20 phút một lần". Là một lựa chọn nhưng không thực sự những gì tôi muốn ... –

Trả lời

18

Tôi cũng thực sự gặp sự cố này đối với nhiều lần gửi bài đăng. Bạn có hai lựa chọn ở đây:

1) Tạo một thẻ mới SAU bài nộp:

Session::put('_token', sha1(microtime()))

2) Chuyển SAU đường bưu điện đến một trang xác nhận:

Redirect::route('form/success')->with("data", $myData)

tôi đã kết thúc lên làm thứ hai.

EDIT: Trong một bình luận qua Jason, nó có thể là tốt nhất để sử dụng sự kết hợp của cả hai phương pháp nêu trên

+0

Tôi cũng đang sử dụng một chuyển hướng :: tuyến đường đã được chuyển hướng đến bài viết blog được tạo ra sau khi xác nhận vượt qua. Trong trường hợp lỗi xác nhận tôi sử dụng Redirect :: back() -> withInput() -> withErrors(). BTW: Bạn là người đầu tiên trả lời câu hỏi đầu tiên của tôi :-) Cảm ơn. Tôi sẽ bầu bạn, nhưng cần 15 Đại diện trước ... –

+0

Bạn luôn có thể chấp nhận câu trả lời :) Rất vui được giúp đỡ. –

+0

Có bạn đi ... Tôi chỉ chờ đợi, bởi vì một số câu trả lời nhiều hơn có thể đã sôi sục lên. –

Các vấn đề liên quan