sql >> Base de Datos >  >> RDS >> Mysql

Un ataque de inyección que tiene éxito con mysql_query, pero falla con mysqli_query

Me han hecho creer que:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");

se puede comprometer fácilmente con valores para $idValue que cierran el ' y luego agregue comandos adicionales, como

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

Si bien me doy cuenta de que afirma que varias declaraciones están deshabilitadas, algo que no es tan horrible sería devolver datos no autorizados en lugar de editar datos en la tabla directamente, como:

  $idValue = "z' OR name IS NOT NULL OR name = 'x";

Mientras que con MySQLi existe la posibilidad que el enfoque se puede utilizar con prepared statements , lo que evitaría que la variable actuara fuera de su estado como una simple variable. Tales como:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

Mi comprensión de bind_param es que la variable tendría todas las palabras clave y caracteres clave de MySQL escapados, evitando así la brecha de seguridad y el retorno de filas no autorizadas.

Esta es una opción que MySQL no tiene . Las declaraciones preparadas ayudan a mejorar inyección de seguridad pero no prevendrán ataques de inyección solos, pero el programador debe usar más como parte de una estrategia más amplia.

Al igual que llevar chalecos antibalas no te hará invencible, pero mejorará enormemente tus posibilidades de supervivencia. MySQLi no es una bala mágica, ni tampoco lo es PDO, pero mejorarán los niveles de seguridad en general.

MySQL también está en desuso y, como dijo Christopher, ya no se mantiene significa que la cantidad de agujeros y problemas solo aumentará a medida que otras tecnologías continúen desarrollándose.

Resumen

Si escribe MySQLi declaraciones de la misma manera que escribió las declaraciones de MySQL, entonces no tendrá protección adicional contra las inyecciones. Sin embargo, MySQLi ofrece las Declaraciones preparadas enfoque que aumenta significativamente la defensa contra la inyección SQL, pero el cambio de la interfaz de la base de datos subyacente en sí mismo no le brinda ningún beneficio o protección inherente a menos que elija codificarlos usted mismo usando declaraciones preparadas .