lunes, 17 de junio de 2013

Validación de formularios con CodeIgniter

Una cuestión de suma importancia en toda aplicación web es la seguridad, tanto del propio sistema (que no produzca errores por sí mismo) como contra ataques de usuarios. Los usuarios pueden ser malintencionados o no y a veces los peores atacantes son los que no saben lo que están haciendo. Quizás para muchos internautas sea costumbre que si te piden una edad escribes un número, pero, ¿y si alguien pone letras?

La seguridad con los tipos de datos se logra a varios niveles. Primeramente, en el diseño de la base de datos, donde debes ajustar cada tipo de dato a lo que realmente necesitas. Una vez establecido esto, se deben validar los datos de entrada de usuarios para que coincidan con los de la base de datos, evitando así dos cosas, primero, el mensaje de error de base de datos, que como no supimos capturar nos sale de momento y rompe con todo nuestro diseño; y segundo, mantenemos la integridad de nuestra base de datos.

También debes hacer un diseño correcto de las vistas. Es muy recomendable utilizar cajas de selección (combobox) donde se despliegan las opciones posibles, y así evitamos que el usuario inserte valores ajenos. Si tiene que entrar Sí o No, pues es mejor utilizar un combobox con los dos valores, o una caja de chequeo (checkbox) donde marcado es Sí y no marcado es No. Hay maneras de evitar que el usuario escriba “sí”, “si”, “Sí”, “SI”, “s”, “yes”, “y”, etc. Debes indicar qué datos del formulario son obligatorios (suele usarse un asterisco), y de qué tipo son.

Queda entonces validar que no entren campos vacíos, y que los entrados sean válidos (números, fechas, direcciones web, direcciones http, etc.). Es pertinente validar los datos del lado del cliente (PC donde está el usuario), es decir, usando java script (una opción de moda es el jquery validate). Esta validación en el cliente permite que el usuario conozca sus errores antes de hacer el envío o submit de la página, lo que permite además conservar sin mucho trabajo los datos entrados en los componentes visuales.

Pero como hay diversos navegadores en los que las cosas se comportan a veces de formas diferentes, y porque el usuario puede tener deshabilitado el java script, es necesario validar los datos también en el lado del servidor: el php no depende de qué navegador se esté usando en los clientes, por lo que estamos trabajando en un entorno más controlado.

Cuando recibas el formulario puedes usar el tradicional $var = $_POST['component_name'] (recuerda que en el servidor se obtiene el valor del componente a través de su nombre, en el cliente se trabaja también con el ID del componente), y revisar los valores de tu variable. Aquí estoy asumiendo el envío de datos por POST, en vez de por GET.

Sin embargo, CodeIgniter brinda una excelente aproximación a la validación de datos, con la clase de validación de formularios. Esta clase permite especificar las reglas que le vas a aplicar a los datos enviados desde el cliente, así como los mensajes de error para cada una. Además permite especificar los delimitadores que le darán formato a tu mensaje, y da la posibilidad de mostrar los errores nuevamente en el cliente.

function X() //en el controlador

{

$this->load->library('form_validation');

$this->form_validation->set_rules('username', 'Username', 'required');

$this->form_validation->set_error_delimiters('<div class="error">', '</div>');

if ($this->form_validation->run() == FALSE) {

$this->load->view('myform');

}
else {

$this->load->view('formsuccess');

}

}
<?php echo validation_errors(); ?> //en la vista

 


En este ejemplo he cargado la clase form_validation; he especificado que el componente llamado username, que tiene adelante una etiqueta con el texto Username[1], es obligatorio (required); he configurado que el mensaje de error salga dentro de un <div> en vez de dentro de un <p> como está por defecto, y de paso he indicado una clase propia para el div, que responde a un estilo de css para mis mensajes de error. Finalmente verifico, si la validación da FALSE es que hubo error y cargo nuevamente la vista donde estaba mi componente username, sino cargo otra vista cualquiera.

En la vista “myform”, donde está el componente que se está validando, tendrías que poner echo validation_errors() para que muestre los mensajes de error. Lo usual es ponerlo antes de abrir tu formulario. Lógicamente si no hay errores no se muestra nada. También se puede mostrar los errores de forma independiente para cada componente, usando echo form_error('username'), en este caso puedes mostrar el mensaje al lado del componente.

El tipo required viene predefinido con CodeIgniter como otros tantos. CodeIgniter usa el segundo parámetro de la regla para completar el mensaje, en este caso se muestra algo así como “El campo Username es obligatorio”.

CodeIgniter permite también concatenar reglas usando “|” y preparar o formatear los datos. En el siguiente ejemplo se eliminan los espacios en blancos de los tres campos con trim, se marcan como obligatorios, se especifica que el campo username debe tener entre 5 y 12 caracteres y que el password y el passconf confirmado deben ser iguales. Finalmente se encripta la contraseña con md5.

$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]');

$this->form_validation->set_rules('password', 'Password', 'trim|required|matches[passconf]|md5') ;

$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required');


Además se pueden crear reglas propias con sus respectivos mensajes, sobre lo cual comentaré mis experiencias en un próximo artículo.

Recuerda siempre que cuando hagas un submit debes validar tus datos, sanearlos de datos maliciosos, preformatearlos (trim, html encoded) y finalmente prepararlos para la inserción en la base de datos de forma que se mantenga su integridad, garantizando así esta parte de la seguridad de tu sistema.




[1] No tiene que ser necesariamente el nombre de la etiqueta, aquí usas un texto que le sea más entendible al usuario, de forma que cuando llegue el mensaje de error sepa de cual componente se le está hablando. Así que lo usual es que tenga el mismo texto de la etiqueta del componente.


¿Te ha gustado este Post? Compártelo con tus amigos.

No hay comentarios:

Publicar un comentario

IconIconIcon