2012-07-27 19 views
22

Estoy en un script PHP y quiero verificar si la solicitud es una solicitud de Ajax. (Básicamente, a fin de no permitir el acceso directo al script, aparte de Ajax llamada que es ...)Verificar la solicitud de Ajax en Code Igniter

Por lo tanto, estoy definiendo IS_AJAX en alguna parte del principal index.php archivo:

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

Y a continuación, comprobar que en la parte superior de mi guión:

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

Ya que soy nuevo en CodeIgniter, no estoy muy seguro ...

  • ¿Hay alguna funcionalidad incorporada?
  • ¿Hay una forma más ... elegante de hacerlo?

Respuesta

97

Puede utilizar $this->input->is_ajax_request() de la clase input:

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

¡Estupendo! Sabía que me podría estar perdiendo algo ... ¡Muchas gracias, amigo! –

+2

is_ajax_request() no es una medida de seguridad. Hay una respuesta similar en la que se devuelve 404, lo que habría evitado dar una impresión engañosa. (HTTP/1.1 "Este código de estado se usa comúnmente cuando el servidor no desea revelar exactamente por qué se rechazó la solicitud o cuando no se aplica ninguna otra respuesta") http://stackoverflow.com/questions/6555652/controller- methods-that-are-only-called-by-ajax-make-private/8072539 # 8072539 – sourcejedi

+0

Normalmente utilizo el método de carga para cargar archivos, ¿cómo evito que esos archivos se carguen directamente? –

0

si desea personalizar las peticiones de su aplicación CodeIgniter, intente esto: Debe crear un gancho llamado Ajax_only.php en application/ganchos carpeta

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 
*  ] 
* ] 
*/ 

y configurar el archivo application/config/hooks.php

$hook['post_controller_constructor'] = array(
    'class' => 'Ajax_only', 
    'function' => 'eval_request', 
    'filename' => 'Ajax_only.php', 
    'filepath' => 'hooks' 
); 
Cuestiones relacionadas