2012-07-27 40 views
22

Tôi đang ở trong một tập lệnh PHP và tôi muốn kiểm tra xem yêu cầu đó có phải là một yêu cầu Ajax hay không. (Về cơ bản như vậy là không cho phép truy cập trực tiếp kịch bản, khác với Ajax gọi đó là ...)Kiểm tra yêu cầu Ajax trong Mã Igniter

Vì vậy, tôi đang định IS_AJAX đâu đó trong chính index.php file:

define('IS_AJAX', 
     isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
     strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 

Và sau đó kiểm tra nó ở phía trên cùng của kịch bản của tôi:

if (!IS_AJAX) exit('No direct script access allowed'); 

Kể từ khi tôi mới vào CodeIgniter, tôi không thực sự chắc chắn ...

  • Có chức năng tích hợp nào không?
  • Có cách nào khác ... thanh lịch để làm điều đó không?

Trả lời

97

Bạn có thể sử dụng $this->input->is_ajax_request() từ lớp input:

if (!$this->input->is_ajax_request()) { 
    exit('No direct script access allowed'); 
} 
+1

Tuyệt vời! Tôi biết tôi có thể thiếu một cái gì đó ... Cảm ơn rất nhiều, bạn đời! –

+2

is_ajax_request() không phải là biện pháp bảo mật. Có một câu trả lời tương tự, trong đó 404 được trả về thay vào đó, điều này sẽ tránh được một ấn tượng gây hiểu lầm. (HTTP/1.1 "Mã trạng thái này thường được sử dụng khi máy chủ không muốn tiết lộ chính xác lý do yêu cầu bị từ chối hoặc khi không có phản hồi nào khác được áp dụng") http://stackoverflow.com/questions/6555652/controller- các phương thức được gọi là-by-ajax-make-private/8072539 # 8072539 – sourcejedi

+0

tôi thường sử dụng phương thức tải để tải tệp, làm cách nào để ngăn các tệp đó tải trực tiếp? –

0

nếu bạn muốn tùy chỉnh theo yêu cầu từ ứng dụng CodeIgniter của bạn, hãy thử này: Bạn phải tạo một cái móc tên Ajax_only.php trong application/móc thư mục

class Ajax_only { 
    private $_controllers = []; 

    private $CI; 

    public function __construct() { 
     $this->CI =& get_instance(); 
    } 

    public function eval_request() { 
     $controller = $this->CI->router->fetch_class(); 
     $method = $this->CI->router->fetch_method(); 
     if (array_key_exists($controller, $this->_controllers) && $this->CI->input->is_ajax_request() === FALSE ) { 
      if (($this->_controllers[ $controller ] === TRUE || (is_array($this->_controllers[ $controller ]) && array_key_exists($method, $this->_controllers[ $controller ]) && $this->_controllers[ $controller ][ $method ] === TRUE))) { 
       show_404(); 
      } 
     } 
    } 
} 


/*Examples 
* $_controllers = [ 
*  'my_controller_name' => TRUE //all methods must be ajax 
*  'my_controller_name => [ 
*   'method_name' => TRUE //only the selected methods must be ajax 
*  ] 
* ] 
*/ 

Và cấu hình ứng dụng của bạn/config/hooks.php tập tin

$hook['post_controller_constructor'] = array(
    'class' => 'Ajax_only', 
    'function' => 'eval_request', 
    'filename' => 'Ajax_only.php', 
    'filepath' => 'hooks' 
); 
Các vấn đề liên quan