2015-04-08 19 views
5

Tôi có một chỉnh sửa được thực hiện với lưỡi để chỉnh sửa một tài nguyên, như thế này:Laravel bảo vệ các trường ẩn hình thức và url

{{Form::model($post ,['action'=> ['[email protected]', 'id' => $post->id], 'method' => 'post'])}} 

nào tạo ra một hình thức với hành động

http://example.com/posts/edit/123 

Và lĩnh vực của tôi, có văn bản và đầu vào bị ẩn

Thấy url này, rất dễ dàng cho một người dùng có ý định xấu cập nhật các bài đăng khác.

Làm cách nào để bảo vệ tuyến đường không thực hiện được nếu id được thao tác với thanh tra viên? Có bất kỳ wat tích hợp nào để mã hóa id để đảm bảo rằng nó khớp không? Điều này cũng có thể được áp dụng cho tất cả các đầu vào bị ẩn không?

Cảm ơn

EDIT:

Một ví dụ về cách sử dụng các trường ẩn của tôi: bài viết của tôi nói chung là câu hỏi và câu trả lời, khi một người dùng cố gắng thêm một câu trả lời cho một câu hỏi, tôi đặt question_id như một ẩn lĩnh vực, và tôi muốn kiểm tra nó không phải là thao tác.

+0

Ý của bạn là: http://laravel.com/docs/4.2/html#csrf-protection? –

+0

Thay vì cố gắng bảo vệ URL của bạn, bạn nên bảo vệ dữ liệu của mình bằng cách xác thực và ủy quyền. Thay vì dựa vào người dùng không biết đúng URL, bạn nên kiểm tra thông tin đăng nhập và (nếu cần) quyền người dùng – lukasgeiter

+0

Tôi đã làm điều này $ this-> abortIfLoggedUserCantEdit ($ post-> user-> id); Tôi chỉ muốn có một tính năng chung chung hơn. – SkarXa

Trả lời

8

câu trả lời Limonte là đúng để đảm bảo khả năng chỉnh sửa các dân tộc khác viết - và bạn nên luôn luôn làm điều đó. Để trả lời phần thứ hai của câu hỏi của bạn:

Tôi đặt question_id là trường ẩn và tôi muốn kiểm tra câu hỏi đó không bị thao túng.

Vấn đề là bạn có thể không bao giờ tin tưởng dữ liệu do khách hàng cung cấp vào hệ thống của bạn. Bạn phải luôn luôn giả sử nó đã bị giả mạo.

Một lựa chọn để giúp giảm thiểu nguy cơ là bạn có thể sử dụng encryption service by Laravel để làm điều này:

{{ Form::hidden('question_id', Crypt::encrypt($question_id)) }} 

Sau đó, trong điều khiển của bạn

$question_id = Crypt::decrypt(Input::get('question_id')); 

Chỉ cần chắc chắn rằng bạn đã thiết lập một ngẫu nhiên khóa mã hóa ứng dụng trong tệp cấu hình app.php

+0

Tôi sẽ thêm route_id được mã hóa vào tất cả các biểu mẫu của mình và đặt bộ lọc để kiểm tra nó theo mọi yêu cầu. – SkarXa

2

Để bảo vệ tuyến đường, bạn nên kiểm tra giấy phép theo số [email protected].

Trong phương pháp kiểm tra bắt đầu nếu người dùng có thể chỉnh sửa cho bài:

public function update($postId) 
{ 
    $post = Post::findOrFail($postId); 

    if ($post->user_id !== Auth::id()) { 
     abort(403, 'Unauthorized action.'); 
    } 

    // validate, update record, etc. 
} 
+0

Tôi đang làm điều này, nhưng tôi muốn một cách chung để làm điều này cho tất cả các tuyến đường chỉnh sửa của tôi, tôi cũng không thể bảo vệ các trường ẩn theo cách này – SkarXa

+0

Tôi không biết liệu có cách nào để thực hiện việc này cho tất cả chỉnh sửa của bạn hay không tuyến đường. Bạn có thể sử dụng bộ lọc nhưng bạn sẽ có các tuyến đường khác nơi các thông số được đặt tên khác và bạn sẽ làm việc với các mối quan hệ khác nhau. Bạn sẽ có 1 bộ lọc cho mỗi bộ điều khiển. – user3158900

+0

Có phải đó là 'Auth :: id()' hoặc 'Auth :: user() -> id'? – Laurence

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