Cargando



Conexiones modernas y seguras a Bases de Datos con PHP

En este tutorial vamos a explorar las alternativas modernas y seguras con las que contamos desde PHP para evitar el error de usar funciones dañinas para el manejo de nuestras conexiones y así poder sacar mejores aplicaciones utilizando este gran y poderoso lenguaje de programación.


dic 15 2014 18:22
Profesional
Si hay algo que puede dañar una aplicación es cuando no utilizamos los recursos adecuados para hacerla más rápida y segura, hay muchas formas de mejorar la velocidad y seguridad de las aplicaciones, puede ser utilizando mejores patrones de desarrollo, aplicando mayor seguridad en los servidores, etc.

Sin embargo hay un punto en el que muchas veces no nos detenemos a pensar y es si la herramienta que nos da el lenguaje es la mejor para el trabajo que estamos haciendo. Esto pasa mucho en PHP a pesar que ya se tiene muchos años con la alerta de no utilizar la función mysql_connect() para establecer los vínculos a las Bases de Datos, muchos desarrolladores parecen no darse cuenta del gran error que cometen la utilizarla.

El trasfondo


PHP tiene soporte nativo para un gran número de motores de Bases de Datos que existen en el mercado, sin embargo su integración con MySQL es casi que un punto de partida obligatorio para la mayoría de los usuarios.

mysql_connect()
A partir de la versión 5.5 de PHP la función clásica mysql_connect() se encuentra en estado deprecated, es decir, es obsoleta y se recomienda fuertemente no utilizarla ya que en futuras versiones del lenguaje no se va a incluir.


La alternativa para hacer la conexión pasa por dos elementos, el primero es utilizar la misma estructura del lenguaje para hacer conexiones o utilizar la nueva librería para conexión con MySQL. Aquí puede venir el primer cuestionamiento, ¿Por qué solo pensar en MySQL? Bueno la respuesta es simple, es un inicio, es lo más sencillo y útil que podemos explicar inicialmente, si conocemos esta base podemos extrapolar a otros motores y manejadores.

PHP Data Object


La primera alternativa de conexión a Base de Datos es utilizar el propio objeto de datos del lenguaje llamado PHP Data Object o su abreviación PDO. Esto no es más que una gran extensión escrita en el lenguaje C que nos permite establecer conexiones con diferentes tipos de motores de Bases de Datos y que posee métodos estándar que nos dan la posibilidad de escribir aplicaciones multiplataforma, es decir, que no tengamos que cambiar la sintaxis si cambiamos de motor de base de datos.

Al principio dijimos que nos concentraríamos en MySQL, sin embargo si establecemos una conexión a través de PDO lo que hagamos lo podremos aplicar a otros motores. Para ello únicamente debemos activar o incorporar los drivers para dichos motores y activarlos en el archivo php.ini del servidor.

Establecer una conexión desde PDO


Para conectarnos a una Base de Datos solo debemos establecer el vínculo utilizando el método apropiado para ello, en PDO la conexión se logra con tres parámetros básicos, el nombre del servidor de base de datos, el nombre de usuario y su contraseña.

El único parámetro de estos tres que necesita explicación es el del servidor de base de datos, en el pasado teníamos que seleccionar la Base de Datos a través de una función específica luego de establecer la conexión, en este caso en el mismo string lo haremos, por lo que nuestro string de nombre de servidor quedaría así:

mysql:host=nombreHost;dbname=nombreBD

Vemos que especificamos inicialmente el motor, en este caso mysql luego con host le vamos a decir cuál es el servidor, aquí puede ser una IP o localhost si el servidor es local, finalmente con dbname pasamos el nombre de la base de datos a la que nos queremos conectar. Vamos a observar en la siguiente imagen como queda un código para conectarse utilizando PDO:


Ejecutar consultas


Ya que sabemos el paso inicial que es como conectarnos, ahora debemos aprender cómo podemos ejecutar consultas, normalmente en el pasado solíamos ejecutar directamente la consulta con sus parámetros, esta práctica no es nada segura ya que nos hace propensos a ataques del tipo SQL Injection, PDO nos permite utilizar los llamados Prepared Staments que no es más que ejecutar la consulta de forma parametrizada, así la propia librería hace un trabajo de depuración y es menos propensa a ataques. Veamos a continuación como ejecutar una simple consulta y luego su equivalente con Prepared Stament.

En esta simple consulta asumiremos que tenemos una tabla en nuestra Base de Datos llamada autor que recibe un código de autor y luego el nombre de este, por supuesto al ser demostrativa no es un ejemplo de una buena tabla, solo nos interesa saber cómo funciona la conexión desde PDO.

En la imagen vemos que llamamos un método llamado query() desde el objeto creado con la cadena de conexión de PDO, luego escribimos nuestra consulta sin mayor problema:


El problema está en que recibimos directamente los valores, por lo que no hay una manera de mejorar y reutilizar esto, en cambio si hacemos un Prepared Stament, veremos que primero indicamos cual es la consulta a ejecutar, luego con otro método la hacemos efectiva y le pasamos los valores necesarios. Esto hace que entre en juego el motor de depuración de parámetros de PDO dando así un nivel adicional de protección. Veamos en la siguiente imagen como nos quedaría el ejemplo anterior utilizando Prepared Staments ahora.


A simple vista puede parecer algo complejo y no optimo sin embargo si analizamos, vemos que primero establecemos la consulta a ejecutar, luego creamos un array con los parámetros que va a recibir nuestra consulta, en el caso del ejemplo recibimos el código de autor y su nombre, por último ejecutamos la consulta y le pasamos el array de los parámetros.

Recibir los resultados de una consulta


Si queremos consultar una vez que ya hemos insertado algunos valores en nuestra Base de Datos es muy simple, solo debemos hacerlo con una consulta SELECT, esta nos permitirá traernos los registros, en el pasado dependíamos de funciones como mysql_fetch_array() o mysql_fetch_assoc() que una vez consumidas nos dejaban imposibilitados de volver a manejar sus resultados.

Con PDO vamos a obtener los datos directamente del objeto, por lo que siempre los tendremos disponibles durante la ejecución, veamos en el siguiente ejemplo como se haría:

conexiones-seguras-bd-php4.jpg


Vemos como inicialmente hacemos un Prepared Stament, hacemos una consulta sencilla en este caso y luego con un ciclo while() vamos a obtener cada uno de los registros y hacemos su impresión, si notamos no hacemos referencia a MySQL en ninguna parte de nuestro código, por lo que si cambiamos la cadena de conexión y utilizamos otro motor que tenga una tabla y una Base de Datos del mismo nombre y estructura podremos obtener sus datos sin necesidad de cambiar nuestro código.

MySQLi, la alternativa


Como MySQL es la el motor de Base de Datos más popular para integrar con PHP, existe también una alternativa y es MySQLi que no es más que una interfaz orientada a objetos. Su forma de funcionamiento es muy similar a la de PDO, sin embargo lo que cambia es que solo es para este popular motor de Base de Datos, por lo que una conversión multiplataforma no sería posible.

Su cadena de conexión es un poco menos compleja ya que divide el nombre del servidor en el host y la Base de Datos a utilizar en dos parámetros diferentes, adicionales al nombre y contraseña del usuario, veamos como luce:

$objConex = new mysqli(NombreHost, usuario, password, NombreBaseDatos);

Veamos en el siguiente ejemplo como establecemos una conexión utilizando MySQLi y cómo podemos realizar una inserción de datos sencilla:


Notamos que hay una similitud con PDO al tener un método query() también, sin embargo esto solo funcionará para MySQL.

Recibir datos de una consulta


Ahora vamos a recibir e iterar sobre los datos que podemos obtener de una consulta, para ello vamos a utilizar el mismo método query() y luego el método fetch_assoc() para obtener los resultados:

conexiones-seguras-bd-php6.jpg


Lo más interesante que notamos es que utilizamos el método close(), este lo que hace es cerrar la conexión actual y limpiar el buffer de forma que se optimice el uso de los recursos del servidor.

Importante
Debemos tener en cuenta que si tenemos un sistema hecho en una versión vieja de PHP y no vamos a migrar a nuevas versiones, tal vez cambiar las cadenas de conexión a Base de Datos y los métodos de consulta no sea una buena idea por el trabajo que representa. Sin embargo si queremos hacer nuevas aplicaciones y sistemas, lo mejor es empezar con bases sólidas utilizando estas nuevas librerías con soporte en las futuras versiones de PHP.


Con esto finalizamos este tutorial, hemos visto que las nuevas alternativas son mucho más limpias y seguras, además su facilidad de uso las hacen adecuadas para los tiempos actuales.

¿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