Este wikiHow le enseña cómo prevenir la inyección de SQL usando declaraciones preparadas en PHP. La inyección SQL es una de las vulnerabilidades más comunes en las aplicaciones web actuales. Los Estados preparados utilizan parámetros vinculados y no combinan variables con cadenas SQL, lo que hace que un atacante no pueda modificar la declaración SQL.
Las declaraciones preparadas combinan la variable con la declaración SQL compilada, de modo que el SQL y las variables se envían por separado. Las variables se interpretan entonces como meras cadenas y no como parte de la declaración de SQL. Usando los métodos en los pasos a continuación, no necesitarás usar ninguna otra técnica de filtrado de inyección SQL como mysql_real_escape_string ().[1]

Parte uno de dos:
Comprender la inyección de SQL

  1. 1 La inyección SQL es un tipo de vulnerabilidad en aplicaciones que usan una base de datos SQL. La vulnerabilidad surge cuando se utiliza una entrada de usuario en una instrucción SQL:
     $ nombre = $ _GET['nombre de usuario']; $ consulta = "SELECCIONAR contraseña FROM tbl_user WHERE name = '$ nombre' "; 
  2. 2 El valor que un usuario ingresa en la variable URL usuario será asignado a la variable $ nombre. Luego se coloca directamente en la declaración SQL, lo que permite al usuario editar la declaración SQL.
     $ nombre = "admin" O 1 = 1 - "; $ consulta = "SELECCIONAR contraseña FROM tbl_user WHERE name = '$ nombre' "; 
  3. 3 La base de datos SQL recibirá la declaración SQL de la siguiente manera:
     SELECCIONAR contraseña DE tbl_users DÓNDE nombre = 'administración' O 1=1 -- ' 
    • Este es un SQL válido, pero en lugar de devolver una contraseña para el usuario, la declaración devolverá todas las contraseñas en la tabla tbl_user. Esto no es algo que desee en sus aplicaciones web.

Parte dos de dos:
Usar mySQLi para crear declaraciones preparadas

  1. 1 Crea la consulta mySQLi SELECT.
    Use el código a continuación para SELECCIONAR datos de una tabla utilizando Declaraciones preparadas de mySQLi.
     $ nombre = $ _GET['nombre de usuario']; Si ($ stmt = $ mysqli->preparar("SELECCIONAR contraseña FROM tbl_users WHERE name =?"))  // Vincula una variable al parámetro como una cadena.  $ stmt->bind_param("s", $ nombre); // Ejecuta la declaración. $ stmt->ejecutar(); // Obtenga las variables de la consulta. $ stmt->bind_result($ pase); // Obtener los datos. $ stmt->ha podido recuperar(); // Mostrar los datos. printf("Contraseña para el usuario % s es % s\norte", $ nombre, $ pase); // Cerrar la declaración preparada. $ stmt->cerca();  

    • Nota: la variable $ mysqli es el objeto de conexión mySQLi.
  2. 2 Crea la consulta mySQLi INSERT. Use el código a continuación para INSERTAR datos en una tabla utilizando Declaraciones preparadas de mySQLi.
     $ nombre = $ _GET['nombre de usuario']; $ contraseña = $ _GET['contraseña']; Si ($ stmt = $ mysqli->preparar("INSERT INTO tbl_users (name, password) VALUES (?,?)"))  // Vincula las variables al parámetro como cadenas.  $ stmt->bind_param("ss", $ nombre, $ contraseña); // Ejecuta la declaración. $ stmt->ejecutar(); // Cerrar la declaración preparada. $ stmt->cerca();  

    • Nota: la variable $ mysqli es el objeto de conexión mySQLi.
  3. 3 Cree la consulta de ACTUALIZACIÓN mySQLi. Use el código a continuación para ACTUALIZAR los datos en una tabla usando Declaraciones preparadas mySQLi.
     $ nombre = $ _GET['nombre de usuario']; $ contraseña = $ _GET['contraseña']; Si ($ stmt = $ mysqli->preparar("ACTUALIZAR tbl_users SET password =? WHERE name =?"))  // Vincula las variables al parámetro como cadenas.  $ stmt->bind_param("ss", $ contraseña, $ nombre); // Ejecuta la declaración. $ stmt->ejecutar(); // Cerrar la declaración preparada. $ stmt->cerca();  

    • Nota: la variable $ mysqli es el objeto de conexión mySQLi.
  4. 4 Crea la consulta mySQLi DELETE. La siguiente secuencia de comandos es cómo ELIMINAR datos de una tabla utilizando Declaraciones preparadas mySQLi.
     $ nombre = $ _GET['nombre de usuario']; $ contraseña = $ _GET['contraseña']; Si ($ stmt = $ mysqli->preparar("ELIMINAR FROM tbl_users WHERE name =?"))  // Vincula la variable al parámetro como una cadena.  $ stmt->bind_param("s", $ nombre); // Ejecuta la declaración. $ stmt->ejecutar(); // Cerrar la declaración preparada. $ stmt->cerca();  

    • Nota: la variable $ mysqli es el objeto de conexión mySQLi.