Estoy probando posibles inyecciones de SQL en mi base de datos y estoy ejecutando una función simple para obtener resultados que un usuario no debería obtener. El valor de retorno es correcto según la identificación, sin embargo, el resto de la consulta se ignora por completo.
Quiero devolver todos los datos de la tabla de datos.
¿Hay algo mal en mi sintaxis?
Aquí está mi implementación:
function test(id) { db.query("SELECT * FROM users WHERE id = ?", [id], (err, result) => { console.log(result[0]); }); } const id = "122 UNION SELECT * FROM data"; test(id);Esto se parece a nodejs Javascript con el paquete de controladores npm mysql . Y supongo que su columna de id se define como INT o BIGINT, no como una especie de cadena de texto.
La forma en que usa el método .query() es la forma correcta de evitar la inyección de SQL. Está parametrizado. Eso significa que cada parámetro en el SQL está representado por un ? marcador de posición El segundo argumento de .query() es una matriz de valores de parámetros para sustituir los marcadores de posición. Para su caso de uso, el controlador genera una consulta con este aspecto.
SELECT * FROM users WHERE id = '122 UNION SELECT * FROM data' y lo pasa al servidor MySQL. Luego, el servidor toma la cadena que pasó e intenta interpretarla como un número. Debido a una peculiaridad en MySQL, interpreta su cadena '122 UNION SELECT * FROM data' como el número 122, y así busca WHERE id = 122 . (MySQL coacciona las cadenas a números enteros buscando un número inicial. Entonces, 123RedLight da 123 y Hello da 0. Puede ser confuso. Otras marcas y modelos de RDBMS arrojan errores cuando se les dan cadenas donde esperan números enteros).
Ignora correctamente el resto de su cadena.
Si quisiera hacer que su código fuera vulnerable a la inyección de SQL (¡ no quiere hacer eso!), escribiría
function test(id) { /* danger: sql injection in next line */ db.query("SELECT * FROM users WHERE id = " + id, (err, result) => { /* wrong ! */ console.log(result[0]); }); }esto enviaría
SELECT * FROM users WHERE id = 122 UNION SELECT * FROM dataal servidor, y le dará su fuga de datos.
No puedes hacerlo de esta manera. De hecho, no poder hacer esto es TODO EL PUNTO de las consultas parametrizadas. Evita que un atacante le dé una cadena como 122; DROP Table users; como entrada.