Cargando



Mejorar la seguridad de nuestras aplicaciones con PHP

Veremos cómo mejorar la seguridad de nuestras aplicaciones escritas en PHP, de esta manera podremos seguir sacando beneficios de uno de los lenguajes más relevantes del mundo web.


ene 26 2015 22:28
Profesional
ene 27 2015 10:57
PHP surgió como un lenguaje versátil que nos permite manipular los datos que se ingresan a través de un formulario HTML, por supuesto dentro de su constitución existen más herramientas y capacidades que solo esto.

La versatilidad y facilidad de uso hacen que sea uno de los lenguajes más utilizados a nivel mundial para proyectos web que van desde simples formularios de contacto, a ser base de grandes aplicaciones en sus inicios como Facebook.

El problema de la versatilidad y la facilidad de uso es que no se fuerza al desarrollador a escribir código seguro, si no que con características muy inseguras el código va a correr perfectamente, y es ahí donde llegan los problemas.

Seguridad de aplicaciones web


La seguridad de aplicaciones web es algo que no se tiene desde el inicio en PHP, sin embargo esto no lo hace un lenguaje inseguro, ya que la seguridad corresponde a un conjunto de técnicas y estilos de trabajo que debe conocer un programador para poder aplicarlas a sus scripts.

Frameworks
Es cierto que con la aparición de los frameworks muchas funciones de seguridad son incluidas por defecto, sin embargo no todo desarrollador utilizó un framework en aplicaciones antiguas y es posible que para algunas funciones utilizar un framework sea un exceso.

Las claves para lograr seguridad en nuestras aplicaciones con PHP son: controlar y depurar los datos que ingresa el usuario al formulario, verificar el origen de las peticiones HTTP que recibe nuestra aplicación, y por último evitar la ejecución directa de instrucciones a través de formularios.

Filtrado de datos


Existe una regla en programación y es universal, es decir, no solo aplica para PHP, se trata de que todos los datos que no son generados por la aplicación son potencialmente malignos, esto quiere decir que si no es algo que es un resultado que hemos programado no podemos confiar.

Este principio aplica para valores de formulario, archivos, Bases de Datos, por lo que un primer paso para mejorar nuestra seguridad es hacer un filtrado de datos si tenemos que interactuar con dichos elementos.

Vamos a listar algunas de las mejores prácticas que podemos aplicar cuando estamos filtrando los datos que se ingresan a nuestro formulario:

Utilizar listas de valores permitidos
Con esta práctica sabemos que si los datos que vienen por formulario no pasan por nuestra lista de valores permitidos y seguros no deben pasar al procesamiento, en este punto se le debe enviar un mensaje al usuario para que corrija sus datos.

Nunca corregir datos no válidos
Puede sonar tentador hacer un sistema muy inteligente que corrija los datos con inconsistencias, pero esto a la larga nos puede traer problemas y vulnerabilidades, es por ello que si detectamos algo irregular no debemos procesarlo.

Utilizar convención de nombres
Con esta práctica podemos distinguir los datos y valores seguros de aquellos datos y valores introducidos por el usuario, con ello vamos a reforzar dentro de la programación el uso de los primeros para procesamiento.


Tipos de filtrado


Hay dos tipos de filtrado que podemos hacer, el primero es de valores que conocemos y el segundo de valores que no conocemos.

El primero es muy fácil de realizar, únicamente debemos realizar rutinas con listados de elementos conocidos y comparar contra ella, sin embargo esto es engorroso y difícil de llevar a cabo en aplicaciones más grandes. El segundo implica crear rutinas que evalúen la estructura del valor y si corresponde con la que consideramos segura lo dejamos pasar al procesamiento, en caso contrario arrojamos un error, al ser de una naturaleza dinámica este es el formato recomendado.

Veamos a continuación un código ejemplo del primer tipo de filtrado:

En el siguiente código veremos cómo creamos un formulario que tiene un elemento select para que el usuario seleccione un color, como el usuario no tiene que escribir directamente el dato a ingresar podemos caer en el error de no validar la información, pero esto solo hace que tengamos un hueco de seguridad ya que con un formulario que aplique los mismos nombres podemos recibir información potencialmente peligrosa.

Es por ello que una vez que se envía el valor del formulario a través de POST, nuestro script evalúa los valores posibles, y en caso de ser alguno de los esperados lo pasamos a nuestro arreglo de valores seguros como vemos a continuación.


mejorar-seguridad-aplicaciones-php.jpg


Con ello hemos resuelto el problema de forma sencilla, sin embargo si la lista en vez de poseer tres colores hubiese tenido cien, la historia de la sencillez hubiese sido otra.

En el siguiente ejemplo validaremos de forma dinámica un campo ingresado por el usuario de forma adecuada, para ello debemos utilizar expresiones regulares y de esta forma evitar el ingreso de caracteres que ponga en riesgo nuestro procesamiento, también evaluar el tamaño de lo ingresado y así evitar un overflow o sobrecarga de nuestro tipo de dato en el procesamiento del programa. Veamos el código en la imagen:


Aquí la clave para lograr la validación es saber correctamente que deseamos procesar, por ejemplo en el caso de un nombre de usuario normalmente lo que pedimos es caracteres alfanuméricos y guiones, es por ello que en la expresión regular validamos esto, también necesitamos que sea mayor que 0 caracteres y un máximo de 32, si lo ingresado por el usuario cumple todo ello pasa la validación, lo mejor de todo es que esto funciona con un valor como con cien, ya que es totalmente dinámico.

Protección contra scripts de otros sitios


Otra de las amenazas contra las que nos tenemos que proteger, son las ejecuciones de scripts de otros sitios, gracias a AJAX podemos enviar formularios desde el cliente a una ruta, incluyendo el tipo de petición y los valores que deseemos.

Debilidad
Este tipo de debilidad hace muy fácil que alguien inspeccione nuestro formulario y revise nuestros campos, donde al poseer estos nombres y el método HTTP intente enviar valores inseguros, para evitar esto hay que aplicar técnicas que nos permitan validar desde donde viene la petición y si es seguro permitir su ejecución, en caso contrario evitar que continúe el camino dentro de nuestro programa.

Para evitar este problema hay que establecer un sistema de tokens y sesiones, de manera que cuando el formulario se envíe evaluemos si la sesión es la misma que se estableció de forma segura, y así el usuario malicioso no puede continuar.

SQL Injection


Un objetivo clave de un atacante es poder insertar su código en nuestro ambiente, para ello se valen de las inyecciones de código SQL, este ataque es conocido como SQL Injection, donde con formularios no seguros y procesamiento no adecuado, podemos recibir instrucciones SQL directamente sin límites. Por ejemplo si nuestra evaluación SQL es la siguiente en nuestro script PHP:

mejorar-seguridad-aplicaciones-php-3.jpg


Podremos utilizar como nombre de usuario a cualquier usuario del sistema y para el password utilizamos dos guiones “--” con esto podremos pasar la seguridad sin problemas, ya que dos guiones son un comentario SQL y por ende el password no será evaluado.

La forma correcta de evaluar un SQL que tenga origen en el usuario, es sacando los caracteres especiales y peligrosos, solo evaluando expresiones seguras. Veamos un ejemplo a continuación de cómo evitar el caso anterior:

Lo primero que debemos hacer es una sanitización de la data, es decir, evitar que llegue pura desde el formulario a nuestro SQL; lo segundo es que debemos evaluar es que si corresponden los dos valores dar el acceso, pero esto último corresponde a la lógica de cada quien, veamos en la imagen como logramos el objetivo:


Aquí lo que hemos hecho es utilizar la herramienta de prepared statements que nos permite la librería PDO para conexión a Base de Datos, con ello logramos que lo que se ingresa nunca sea tomado en otro contexto que no sea datos, también vemos que en vez de utilizar el método POST hemos utilizado nuestro array seguro, esto quiere decir que ya nuestros datos vienen comprobados, por lo que el riesgo es menor.

Con esto hemos finalizado este tutorial, como vemos las acciones que podemos tomar para que nuestra aplicación sea más segura son simples, no requieren de un esfuerzo sobre humano, sin embargo nos ayudan a evitar los ataques más comunes y tal vez los que con más frecuencia se dan. Hay una mala percepción sobre PHP de quienes dicen que es un lenguaje inseguro, pero la realidad es que la inseguridad la produce el programador, ya que el lenguaje solo tiene herramientas que podemos utilizar para mejorar y evitar ataques a nuestras aplicaciones a través de datos que introduzca el usuario.

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X