2012-08-08 27 views
5

Đối phó với thành phần secuity trên ajax của tôi cuộc gọi sẽ không khi họ cần.phần CakePHP 2 An ninh và ajax gọi

Làm thế nào để bạn đối phó với nó trong cakephp 2.x?

Appcontroller.php

public function beforeFilter() { 
     $this->Security->blackHoleCallback = 'blackhole'; 
     if ($this->request->is('ajax')) { 
      $this->Security->validatePost = false; 
     } 

Không có vẻ để làm việc ...

Trả lời

3

Bạn vẫn có thể thực hiện cuộc gọi ajax an toàn sử dụng cơ chế an ninh mẫu quy định của bánh. Để làm điều này, làm cho một hình thức và địa điểm đầu vào không nhìn thấy được để lưu trữ các thông số cuộc gọi ajax. Sau đó, với Javascript thiết lập các tham số này trong biểu mẫu của bạn và thực hiện cuộc gọi ajax bằng cách tuần tự hóa nó. Hãy nhớ rằng nếu bạn có CSRF kiểm tra kích hoạt (và một token-per-session bị vô hiệu hóa), bạn sẽ phải cập nhật các mẫu với một CSRF token hợp lệ mới (bạn có thể đọc nó trong bộ điều khiển với $this->request->params['_Token']['key']).

Ví dụ:

<?php 
    echo $this->Form->create('AjaxForm'); 
     echo $this->Form->hidden('value'); 
    echo $this->Form->end(); 
?> 

<script>  
    function makeAjaxCall() { 
     $.post(
      ajaxUrl, 
      $('#AjaxForm').serialize(), 
      function(data) { 
       $('#AjaxForm [name="data[_Token][key]"]').val(data.newCsrfToken) 
      } 
     ); 
    }; 
</script> 

Để tham khảo thêm, chúng tôi đã tạo ra một thành phần cho phép để duy trì an ninh được kích hoạt trên các hình thức phía khách hàng được dinamically sửa đổi, và loại bỏ sự cần thiết phải mở khóa các lĩnh vực hoặc các hành động khi thực hiện ajax cuộc gọi. Bạn có thể tìm thấy nó tại https://github.com/QTSdev/DynamicSecurity.

+0

Thành phần (và trang Github) đã biến mất. Bạn có một liên kết mới? – schnauss

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