Prevenir la inyección de SQL en PHP

Usa sentencias preparadas y consultas parametrizadas. Estas son sentencias de SQL que el servidor de la base de datos envía y analiza por separado de cualquier parámetro. De esta manera es imposible inyectar SQL malicioso.

Básicamente, tenemos dos opciones para conseguir esto:

  • Usar PDO (extensión de PHP compatible con practicamente cualquier sistemas de bases de datos):

 

  • Usar Mysqli:

 

Si te estas conectando a una base de datos que no sea MySQL, hay más opciones (por ejemplo, pg_prepare () y pg_execute() para PostgreSQL). PDO es la opción universal.

Configuración correcta de la conexión

Hay que tener en cuenta que cuando se usa PDO para acceder a una base de datos MySQL, las sentencis preparadas no se utilizan de la forma habitual. Para solucionar esto tienes que deshabilitar la emulación de declaraciones preparadas. Un ejemplo de crear una conexión usando PDO es:

En el ejemplo anterior, desactivar el modo de error no es estrictamente necesario, pero es recomendable. De esta manera, el script no se detendrá si hay algún error leve. Y nos dará la oportunidad de detectar cualquier error que se lance como PDOExceptions.

Sin embargo, lo que es obligatorio es la primera línea de setAttribute(), que le dice a PDO que deshabilite las sentencias preparadas emuladas y use declaraciones preparadas reales. Esto asegura que la sentencia y los valores no seran analizados por PHP antes de enviarlos al servidor MySQL (lo que no le da al atacante ninguna posibilidad de inyectar SQL malicioso).

Aunque puedes configurar el conjunto de caracteres desde el constructor, es importante tener en cuenta que las versiones “antiguas” de PHP (<5.3.6) ignoraran este el parámetro.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Ir arriba