Me temo que este informe probablemente carezca de detalles para proporcionar un diagnóstico. No puedo diagnosticar este problema por ti sin ver el código.
Definitivamente, no debe ignorar una advertencia de análisis estático como "riesgo mitigado" cuando no ha hecho nada para mitigarla y no comprende si la advertencia representa una vulnerabilidad explotable o no.
Le sugiero que comience por informándose sobre la inyección de SQL , sobre la seguridad de Hibernate y sobre esta advertencia en particular. Lo más probable es que Fortify tenga ayuda en línea que proporcione una explicación detallada sobre esta advertencia; Deberías empezar por leer eso. Lea el siguiente análisis de fondo de Fortify en inyección de SQL en Hibernate .
También recomiendo los siguientes artículos: Cómo se detiene normalmente la inyección de SQL en una configuración de Spring / Hibernate ,
inyección de ORM , y Cómo evitar la inyección de SQL en Hibernate (A Hibernate Urban Legend) .
Actualización (4/20): veo que ha actualizado la pregunta para incluir el código. Gracias. El código que proporcionó es ciertamente dudoso, y creo que es razonable que Fortify se queje de ese código. Mirando este código, no es posible verificar que la consulta pasada a createQuery()
es una constante de compilación, por lo que Fortify emite un mensaje de advertencia.
Básicamente, el código que muestra parece estar construyendo una consulta SQL utilizando concatenación de cadenas. Eso es peligroso. Si el atacante puede influir en propName
, entonces tiene una posible vulnerabilidad de inyección SQL. Es mejor evitar la construcción de la consulta SQL de esta manera.
En particular, hay un mito por ahí que el uso de declaraciones preparadas (o consultas parametrizadas) es inherentemente inmune a la inyección de SQL. Esto es cierto, pero solo si la consulta en sí es una constante de compilación que no puede ser influenciada por el atacante. Si inserta datos que no son de confianza en la consulta, el uso de los mismos en una declaración preparada no lo hace mágicamente seguro.
Por lo tanto, la mejor práctica es que, cuando use una declaración preparada, asegúrese de que se pueda verificar fácilmente que la consulta sea una constante de compilación (y no puede ser influenciada por el atacante).
Para resumir las reglas generales: (1) No utilice la concatenación de cadenas para crear una consulta SQL. (2) Cuando desee cierta dependencia de los valores de tiempo de ejecución, use las declaraciones preparadas para vincular los valores de tiempo de ejecución. (3) Asegúrese de que la consulta que utiliza para crear la declaración preparada pueda verificarse fácilmente como una constante de tiempo de compilación. Seguir estas prácticas debería ayudar a prevenir ataques de inyección de SQL.