Consejos para aumentar la Seguridad en aplicaciones Web PHP

Algunos consejos para aumentar la seguridad en aplicaciones Web PHP: cosas básicas como encriptamiento de claves, saneamiento y validación de datos, configuración de archivos, configuración de modos de desarrollo y producción pueden ayudar a blindar tu aplicación de posibles accesos indebidos.

La seguridad en Aplicaciones Web

Un sitio web al estar expuesto al internet puede ser blanco de cualquier ataque por personas mal intencionadas, es verdad que no podemos controlar esto del todo y asegurar al 100% la seguridad de una aplicación, puesto que hay miles de formas, técnicas, muchas herramientas disponibles con las cuales un hacker malintencionado puede romper las seguridades de un sitio web.

Por consiguiente, de la misma manera que existen formas y herramientas con las cuales nos pueden atacar también existen acciones que podemos implementar de manera que se pueda mitigar y de alguna manera bajar el porcentaje de riesgo que un sitio sea atacado y desde mi punto de vista creo que lo más importante es tener un plan B, un plan de contingencia, backups, etc., puesto que como mencioné, el riesgo siempre existe.

Pero en fin, esto de la seguridad informática es un tema extenso, y lo que quiero enseñarte en este artículo, son algunos tips de cómo proteger o aumentar la seguridad en aplicaciones Web en PHP, que en conjunto con algunas otras buenas prácticas, ayudarán a blindar casi al 100% una aplicación o sitio web.

 

1. Encriptar las contraseñas

La parte de encriptar las contraseñas es lo más básico y elemental con lo que debes empezar para tener una buena seguridad en tu aplicación.

Para esto se debe utilizar las funciones hash, de manera que no se guarde la contraseña tal cual la escribiste si no, su equivalente de acuerdo a la función hash utilizada.

Si no estás muy seguro que son las funciones hash, pues de manera general, son algoritmos que permiten representar una cadena de texto o un archivo, en una secuencia de datos alfanumérica, lo que se conoce comúnmente como encriptar, eso quiere decir que por ejemplo, si tengo el texto ‘Juan’, la salida usando una función hash sería DF3ZQW, esto es un mero ejemplo ya que las funciones hash utilizan algoritmos complejos y en una sola dirección, lo que quiere decir que una vez encriptado el texto, no se podría saber cuál fue el texto original.

Pues bien yendo al grano, en PHP una manera de poder encriptar un texto, es utilizando la función password_hash() usando el algoritmo Bcrypt. Y se la usa de la siguiente manera:

La función password_hash lleva dos parámetros: el primero el texto a encriptar y segundo el algoritmo, existen varios, cada uno de mayor complejidad, pero para empezar es suficiente utilizar PASSWORD_DEFAULT.

La variable $passwordHash contiene la clave encriptada, lo que se debería guardar en la base de datos, de esta manera en el peor de los casos que ocurra un robo de información las claves estaría cifradas.

Hay que tener en cuenta que el texto cifrado contiene un longitud de 60 caracteres, y se debe tener en cuenta esto al dimensionar la columna que almacena en la base de datos, lo recomendable es utilizar un tamaño de 255 caracteres.

Ahora el problema se da en el escenario que un usuario quiera loguearse, cómo comparar la clave?.

Si te diste cuenta, el texto encriptado inicia siempre con los caracteres $2y$10$ esto se debe al algoritmo, pero lo más interesante es que si refrescas la página obtendrás un valor diferente para el mismo texto, esto se debe a que los algoritmos utilizan saltos o salt, un salt es un dato adicional que se le agrega al texto original para añadirle más seguridad y que en teoría nadie pueda saber el texto original, este salt es aleatorio cada vez que ejecutas la función password_hash y por esa razón hay diferentes salidas para el mismo texto.

Finalmente para comprobar si el texto que ingresa el usuario como clave es igual al texto encriptado y guardado en la base es igual se usa la función:

password_verify(‘texto_original’, $passwordHash)

Donde ‘texto_original’ es el texto que ingresa el usuario y $passwordHash es lo que se obtiene desde la base de datos, para el caso de validar una clave sería de la siguiente manera:

 

2. Filtrado de datos

La inserción de datos extraños es otro método que un atacante puede dañar nuestra aplicación, por esto es recomendable sanitar y validar todas las entradas de datos que podemos recibir.

La validación se refiere a la comprobación y control, es decir que los datos estén de forma correcta, por ejemplo validar que el campo email sea un correo electrónico válido, validar que se recibe números donde se esperaba números, letras ,valores booleanos etc..

Mientras que la sanitación se refiere a limpiar todos aquellos caracteres ilegales que pueda introducir un usuario, la sanitación de datos evita que un atacante inyecte código JavaScript a una página Web, a este tipo de vulnerabilidad se le conoce como Cross-site scripting.

Mediante los filtros en PHP aseguramos que los datos para nuestra aplicación sean los correctos.

Ya en la práctica, podemos utilizar por ejemplo la función: filter_var($str, FILTER_SANITIZE_STRING);

Esta función recibe 2 parámetros el primero la cadena a sanitar y segundo una constante que le indica que filtro debe usar, lo que hace es básicamente eliminar cualquier carácter ilegal o especial y que no sea considerado como parte de una cadena.

Validamos que la cadena no contenga código HTML.

En el siguiente ejemplo validamos que en efecto la entrada sea un número:

Desinfectar y validar un correo electrónico.

En cuanto a los filtros puedes encontrar más información visitando el sitio oficial de PHP: Filtros en PHP.

Existen más cosas que podemos tener en cuenta al momento de validar de forma correcta, bases de datos, sistemas de archivos etc, en el sitio oficial de PHP Sección seguridades en la sección de seguridades puedes encontrar más detalles de lo que deberías tener en cuenta para aumentar las seguridades de tu aplicación.

 

3. Configuración de Archivos

Por general se recomienda no tener archivos de configuración sueltos dentro de una aplicación, sino más bien cargarlos dentro de la base de datos, pero bueno, en muchas de las veces es justo y necesario usar algún archivo que ayuda a la configuración de la aplicación, en estos casos se puede hacer lo siguiente:

1. Asignar a esos archivos un usuario con permisos especiales.

2. Que la  extensión con la que se guardan estos archivos sea .php, esto asegura que así sea leído desde el navegador, no se podrá visualizar, cosa que usando la extensión .txt si se podría.

 

4. Configuración de entornos de Desarrollo y Producción

En lo personal creo que esta parte es importantísimo, puesto que cuando una aplicación lanza errores por lo general te muestra toda la ruta donde se cayó la aplicación, por esto es importante que al desarrollar aplicaciones tengas en cuenta cambiar la configuración de archivos en el servidor, cuando ésta ya se encuentra en producción, por lo general para el caso de ambientes de desarrollo se mantiene la siguiente configuración con la finalidad de que te permita depurar errores y saber donde se cayó la aplicación, esta configuración se la realiza en el archivo ini.php:

En cambio cuando ya estás en producción deberías cambiar esto, puesto que como te decía anteriormente dejar visible las rutas y los archivos donde se cae la aplicación es bastante riesgoso, dicho esto, la configuración debería quedar como sigue.

Con esto se seguirán registrando los errores a nivel del servidor, pero no serán visibles al usuario.

 

Fuente: www.ecodeup.com