2013-08-22 34 views
9

Tôi thực sự chơi đùa với Laravel 4. Ngay bây giờ tôi đang thực hiện an ninh CSRF token vào mẫu đường bưu điện.Tại sao Laravel 4 CSRF thẻ không hoạt động?

Vấn đề là, điều này không thực sự hoạt động theo nghĩa là mã thông báo được tạo trong phiên Session::token() luôn giống nhau khi tôi cố gắng gửi lại biểu mẫu hoặc thậm chí đăng biểu mẫu từ máy chủ khác, bảo mật kiểm tra không được làm việc Session::token() != Input::get('_token') (filters.php)

Bất cứ ai đã phải đối mặt với vấn đề này?

EDIT:
Ok tôi đã tìm thấy giải thích về điều này. Mã thông báo thực sự khác nhau cho mỗi máy/phiên. Nó có ý nghĩa hơn bây giờ :) Nhờ mọi người giúp đỡ của bạn

Trả lời

1

Bên trong mẫu bạn có để tạo ra các dấu hiệu như thế này:

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"> 

Sau đó token sẽ được gửi với đầu vào. Vì vậy, khi bạn nhận được đầu vào, bạn phải kiểm tra các dấu hiệu như thế này:

Route::post('register', array('before' => 'csrf', function() 
{ 
    return 'You gave a valid CSRF token!'; 
})); 

Bằng cách này bạn sẽ đặt một bộ lọc trước khi con đường được truy cập để kiểm tra CSRF token.

Got này từ tài liệu Laravel đúng here

+0

Cảm ơn câu trả lời của bạn. Tôi đã làm tất cả những điều này nhưng vấn đề của tôi là về bản thân mã thông báo mà không được cập nhật. Ngay cả khi tôi làm mới trang, mã thông báo vẫn giống nhau nên bộ lọc sẽ luôn trả về đúng. – lkartono

9

khi mẫu được gửi, sau khi xử lý mẫu bạn nên thay đổi mã thông báo CSRF như Session::put('_token', md5(microtime())); này sẽ bảo vệ từ hình thức tái nộp .. để biết thêm bạn có thể nhìn thấy thisthis

+1

Cảm ơn bạn đã trả lời. Trên thực tế, cho đến nay đây là cách duy nhất người làm việc nhưng tôi nghĩ rằng đây là thực sự câm để cung cấp cho các nhà phát triển kiểm tra an ninh CSRF-thẻ ra khỏi hộp nếu chúng ta vẫn cần phải quan tâm đến những loại chi tiết. Điều này sẽ làm việc ra khỏi hộp :(Cảm ơn một lần nữa – lkartono

+0

Wow. Tôi chỉ thử nghiệm đó và có Tương tự nhiều lần.Bạn phải tự hỏi những gì họ nghĩ rằng điểm của một mã thông báo CSRF là .... Tôi tự hỏi nếu nó cố định trong 5. – DanielM

3

tôi sử dụng được xây dựng trong chức năng regenerateToken cách này trong ứng dụng của tôi/filter.php:

Route::filter('csrf', function() 
{ 
    if (Session::token() != Input::get('_token')) 
    { 
     Session::regenerateToken(); 
     return *Redirect/Exception* 
    } 
    Session::regenerateToken(); 
}); 

Một lưu ý khác khi bạn chuyển hướng với đầu vào!

Trong laravel 4 token được tạo ra khi bạn đang sử dụng {{Mẫu :: mở (...)}} theo cách này:

public function token() 
{ 
    return $this->hidden('_token', $this->csrfToken); 
} 

Vì vậy, nó sử dụng một đầu vào ẩn, mà sẽ thiết lập của nó giá trị từ đầu vào :: chức năng cũ nếu nó tồn tại.

Để tránh điều này, bạn sẽ cần phải sử dụng Input :: trừ ('_ token') nếu bạn không muốn để thực hiện một hình thức với một thẻ đã lỗi thời như thế này:

return Redirect::route('routename')->withInput(Input::except('_token')); 
0

Khi bạn sử dụng Blade để tạo biểu mẫu, _token được tự động hiển thị bên trong biểu mẫu

<?php echo Form::open(array('url' => '/', 'files' => true, 'id' => 'shareForm', 'method' => 'post')) ?> 
... 
HTML 
... 
<?php echo Form::close() ?> 
Các vấn đề liên quan