Archivos de Categoría: CodeIgniter

Ajax en Codeigniter

Lo que hago normalmente es centralizar todas las llamadas de Ajax sobre el mismo controlador y así evitar posibles coladeros de seguridad. Lo primero es, si tenemos activada la seguridad de los formularios mediante CSRF, es modificar el fichero application/config/config.php para dos posibles opciones:
Deshabilitar la validación de CSRF para las llamadas a la ruta Ajax:

$config['csrf_protection'] = (strpos($_SERVER["REQUEST_URI"], 'ajax/') !== FALSE)?FALSE:TRUE;

O hacer que no se renueve la cookie de validación en cada llamada ya que si se hacen varias llamadas de Ajax, si se renueva la cookie en cada llamada, solo daría como válida la primera llamada:

$config['csrf_regenerate'] = FALSE;

El siguiente paso es solo necesario si hemos decidido la no renovación de la cookie, y consiste en hacer que en todas las llamadas que hagamos de Ajax, se añada el campo de validación de CSRF:

$(function(){
  $.ajaxSetup({
    data: {'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>'}
  });
});

Y ya podemos pasar al controlador:

if ( ! defined('BASEPATH')) exit('No esta permitido el acceso');

class Ajax extends CI_Controller {

	public function __construct(){
        parent::__construct();
		// si no es una petición ajax, descartamos directamente la solicitud
        if(!$this->input->is_ajax_request()) exit;
		
		// recuperamos todos los parametros que lleguen por POST
        $this->datos = $this->input->post(NULL, TRUE);
    }

    public function login(){
        $errores = array();
	// campos que serán obligatorios en la petición
        $required = array('email', 'password');
        if(count(array_intersect_key(array_flip($required), $this->datos)) === count($required)) {
		
	    //validaciones que tengamos que hacer de los campos
            if(strlen(trim($this->datos['email'])) == 0) $errores['email'] = 'Debe indicar el email';
            elseif (!filter_var($this->datos['email'], FILTER_VALIDATE_EMAIL))  $errores['email'] = 'Formato de email no válido';
            if(strlen(trim($this->datos['password'])) == 0) $errores['password'] = 'Debe indicar la contraseña';
			
			................
			
	    // devolvemos el resultado
            if(count($errores) == 0){
                echo json_encode(array('resultado'=>true));
            }else{
                echo json_encode(array('resultado'=>false, 'campos'=>$errores));
            }
        }
    }
	
}