Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Asegure sus Formularios con Formularios Claves

by
Read Time:11 minsLanguages:

Spanish (Español) translation by Rodney Martinez (you can also view the original English article)

La seguridad es un tema muy polémico. Garantizar que sus sitios están seguros es extremadamente importante para cualquier aplicación web. De hecho, he pasado el 70% de mi tiempo asegurando aplicaciones. Una de las cosas más importantes que tenemos que asegurar son los formularios. Hoy vamos revisar un método para prevenir esto, se llama XSS (Cross-site scripting) y Cross-site instancias de falsificación en formularios.

¿Por qué?

Los datos POST pueden ser enviados desde un sitio web a otro. ¿Qué tiene ésto de malo? Veamos un escenario sencillo….

Un usuario se registro en su sitio web, éste visita otro sitio web durante su sesión. Este sitio web podrá enviar datos POST a su sitio web - por ejemplo, con AJAX. Debido a que el usuario está registrado en su sitio web, el otro sitio web podrá enviar datos post hacia formularios asegurados que solamente están accesibles después de iniciar sesión.

Además, debemos proteger nuestras páginas contra ataques usando cURL.

¿Cómo hacemos esto?

¡Con formularios claves! Añadiremos un símbolo # especial (un formulario clave) a cada formulario para garantizar que los datos solamente serán procesados cuando hayan sido enviados desde su sitio web. Después un formulario de envío, nuestro código PHP validará el formulario clave que fue enviado contra el formulario clave que habíamos configurado en la sesión.

Lo Qué Debemos Hacer:

  1. Añadir un formulario clave a cada formulario.
  2. Almacenar el formulario clave en una sesión.
  3. Validar un formulario clave después de enviar un formulario.

Paso 1: Un formulario sencillo.

Login Form

Primero, necesitamos un formulario sencillo para propósitos solamente de demostración. Uno de los formularios más importantes que tenemos que asegurar es el formulario para iniciar sesión. El formulario de acceso es vulnerable a fuertes ataques brutales. Así que vamos a crear un archivo nuevo, y guardarlo como index.php en su web-root. Agregue el siguiente código dentro del cuerpo:

Ahora tenemos una página XHTML sencilla con un formulario de registro. Si quiere usar formularios clave en su sitio web, usted puede reemplazar el código de arriba con el de su página de acceso. Ahora, vamos a continuar con la acción real.

Paso 2: Crear una Clase

Vamos a crear una clase PHP para nuestro formulario clave. Porque cada página web puede contener solamente un formulario clave, podríamos hacer un semifallo de nuestra clase para asegurar que nuestra clase está usada de forma correcta. Debido al semifalllo que creamos es un tema de Programación Orientada a Objetos más avanzado, omitiremos esa parte. Ahora va a crear un archivo llamado formkey.class.php y lo colocará en su web-root. Ahora tenemos que pensar en las funciones que necesitamos. Primero, necesitamos una función para generar un formulario clave para que podamos colocarlo en nuestro formulario. En su archivo PHP coloque el siguiente código.

Arriba, usted vio una clase con tres partes: dos variables y una función. Hacemos la función privada porque esta función solamente será usada por nuestras funciones output, las cuales crearemos después. En las dos variables, almacenaremos los formularios claves. Estos, también son privados porque sólo pueden ser utilizados por funciones dentro de nuestra clase.

Ahora, tenemos que pensar en una manera para generar nuestro formulario clave. Puesto que nuestro formulario clave debe ser único (de lo contrario no tenemos algo de seguridad), usamos una combinación de la dirección IP de los usuarios para unir la clave al usuario, mt_rand() para hacerlo único, y la función uniquid() para hacerlo aún más único. Además, encriptamos esta información con el método md5() para crear un hash único que luego, podemos insertarlo en nuestras páginas. Ya que usamos md5(), un usuario no puede ver lo que usamos para generar una clave. Toda la función sería:

Inserte el código arriba en su archivo formkey.class.php. Reemplace la función con la función nueva.

Paso 3: Inserte un Formulario Clave en Nuestro Formulario

Para este paso, creamos una función nueva que produce un campo HTML oculto con nuestro formulario clave. La función consiste de tres pasos:

Generate, Save, OutputGenerate, Save, OutputGenerate, Save, Output

  1. Generar un formulario clave con nuestra función generateKey().
  2. Almacenar el formulario clave en nuestra variable $formKey y en una sesión.
  3. Producir el campo HTML.

Llamamos a nuestra función outputKey() y la hicimos publica, porque tenemos que usarla fuera de nuestra clase. Nuestra función invocará a la función generateKey() para generar un formulario clave nuevo y lo guardará en una sesión local. Por último, creamos el código XHTML. Ahora añadimos el siguiente código dentro de nuestra clase PHP:

Ahora, vamos a agregar el formulario clave para nuestro formulario de acceso para asegurarlo. Tenemos que incluir la clase en nuestro archivo index.php. Además, necesitamos iniciar sesión debido a que nuestra clase usa sesiones para almacenar la clave generada. Por esto, agregamos el siguiente código arriba del doctype y la etiqueta head:

El código anterior es muy sencillo. Iniciamos sesión (porque almacenamos el formulario clave) y cargamos el archivo de la clase PHP. Después de eso, iniciamos la clase con new formKey(), esto creará nuestra clase y lo almacenará en $formKey. Ahora solamente tenemos que editar nuestro formulario para que contenga el formulario clave:

¡Y eso es todo! Debido a que creamos la función outputKey(), solamente tenemos que incluirlo en nuestro formulario. Podemos usar formularios clave en cada formulario con sólo añadir <?php $formKey> outputKey(); ?> Ahora revise la fuente de su página web y puede ver que hay un formulario clave adjuntado al formulario. El único paso que queda por hacer es validar las solicitudes.

Paso 4: Validación

No validaremos el formulario completo, solamente el formulario clave. Validar el formulario es algo muy sencillo en PHP y, además, puede encontrar tutoriales por toda la web. Vamos a validar el formulario clave. Ya que nuestra función "generateKey" sobrescribe el valor de la sesión, entonces vamos a agregar un constructor a nuestra clase PHP. Un constructor será invocado cuando nuestra clase sea creada (o construida). El constructor almacenará la clave anterior dentro de la clase antes de que podamos crear una nueva, por lo que siempre tendremos el formulario clave anterior para validar nuestro formulario. Si no hacemos esto, no podremos validar el formulario clave. Agregue la siguiente función PHP a su clase:

Un constructor siempre deberá llamarse __construct(). Cuando el constructor es invocado nosotros revisamos si una sesión está ajustad, y si es así, lo almacenamos de forma local en nuestra variable old_formKey.

Ahora podemos validar nuestro formulario clave. Creamos una función sencilla dentro de nuestra clase que valida el formulario clave. Esta función deberá ser publica porque vamos a usarla afuera de la clase. La función validará el valor POST del formulario clave contra el valor almacenado del formulario clave. Agregue esta función a la clase PHP:

Dentro del index.php, validamos el formulario clave usando la función que acabamos de crear en nuestra clase. Por supuesto, solamente validamos después de la solicitud POST. Agregue el siguiente código después: $formKey = new formKey();

Creamos una variable $error que almacena nuestro mensaje de error. Si un solicitud POST ha sido enviada, entonces nosotros validamos el formKey con $formKey->validate(). Si esto devuelve el valor false, entonces el formulario clave no es valido y mostrará un mensaje de error. Note que solamente validamos el formulario clave -- se espera que usted valide el resto del formulario.

En su HTML, usted puede colocar el siguiente código para mostrar un mensaje de error:

Esto hará que se imprima o echo la variable $error, claro, si fue configurada.

FormFormForm

Si usted enciende su servidor y se dirige hacia el archivo index.php, verá que nuestro formulario y el mensaje "No error". Cuando usted envía un formulario, usted verá el mensaje "No form key error" ya que es una solicitud POST validad. Ahora, vuelva a cargar la página y acepte cuando su navegador solicite que el dato POST sea enviado otra vez. Verá que nuestro código activo un mensaje de error: "Form key error! Ahora su formulario clave está protegido contra entradas de otros sitios web ¡y de errores con actualización de páginas! El error también se muestra después de una actualización porque un formulario nuevo fue generado después de que enviamos el formulario. Esto es bueno porque, ahora, el usuario ya no puede publicar accidentalmente un formulario dos veces.

Código completo

Aquí está el código completo tanto de PHP como de HTML:

index.php

fomrkey.class.php

Conclusión

Agregue este código para cada formulario que sea importante en su sitio web e incrementará la seguridad de su formulario de forma dramática. Incluso detiene los problemas de actualización, como vimos en el paso 4. Ya que el formulario clave solamente es válido para una solicitud, ya no es posible una segunda publicación.

Este fue mi primer tutorial, espero que le guste ¡y qué lo use para mejorar su seguridad! Por favor, déjeme conocer sus opiniones a través de los comentarios. ¿Tienes usted un método mejor? ¡Déjenos saberlo!

Lecturas Adicionales

  • Nos puede seguir a través de Twitter o, también, puede suscribir a NETTUTS RSS Feed para artículos y tutoriales diarios sobre desarrollo web.


Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.