¿Cuál es el riesgo de la inyección de SQL al usar variables de enlace con una cláusula 'me gusta'?

3

Estaba haciendo una revisión de código y encontré una consulta que se parecía a esto:

String sql = "SELECT * FROM users WHERE username LIKE '%' || :userName || '%'";

Ver la concatenación de cadenas me hizo detenerme y pensar un poco sobre esto. A primera vista, esto parece un poco arriesgado, aunque no he encontrado mucha discusión aparte de asegurarme de que la variable de enlace se haya escapado correctamente.

Los comentarios en esta pregunta en stackoverflow hablan de poder obtener más información de la prevista o provocar un DoS si es no escapó pero no necesariamente haciendo ningún otro daño.

En el caso anterior, ¿cuándo se concatenan y evalúan los comodines y la variable de enlace? Dado que los comodines son parte de la concatenación de cadenas, ¿la variable de vinculación debería evaluarse antes o después de que se haya creado el plan de ejecución?

Alternativamente, los comodines se agregan como parte de la variable de enlace:

String sql = "SELECT * FROM users WHERE username LIKE :userName";
params.addValue("userName", "%" + userName + "%");

Creo que en este caso, el plan de ejecución se crea antes de que se aplique la variable de vinculación, lo que deja la variable incapaz de cambiar lo que se ejecuta (aunque aún debe escaparse). Sin embargo, el primer ejemplo de arriba no parece tan claro. Aparte de asegurarse de que la variable se escape correctamente, ¿hay algo más de qué preocuparse?

Otros enlaces que he visto esta mañana:

pregunta Dave Rager 23.08.2017 - 17:54
fuente

1 respuesta

1
  

No he encontrado mucha discusión que no sea asegurarse de que la variable de enlace se escape correctamente

Dada la sintaxis que ha presentado aquí, parece que ": userName" es una variable de enlace, por lo que no debe intentar escapar de ella. Si este es el caso, entonces el enlace del cliente lo manejará. Nada inusual aquí.

  

Creo que en este caso, el plan de ejecución se crea antes de que se aplique la variable de vinculación

El plan de ejecución se creará para las dos consultas que nos ha mostrado en el mismo punto. Esto ocurrirá antes de que la variable de vinculación se aplique para las declaraciones preparadas en el servidor y después de las declaraciones preparadas en el lado del cliente: diferentes DBMS / diferentes enlaces funcionan de manera diferente.

  

Además de asegurarse de que la variable se haya escapado correctamente

Si ha establecido que esta es una variable de enlace, deje de intentar escapar de ella.

    
respondido por el symcbean 23.08.2017 - 22:46
fuente

Lea otras preguntas en las etiquetas