Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

191
Vistas
¿Cómo puedo extender una consulta SQL en una variable?

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);
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

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 data

al servidor, y le dará su fuga de datos.

about 4 years ago · Juan Pablo Isaza Denunciar

0

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.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda