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: