groovy.sql.Sql.asSql En Groovy SQL, por favor no utilice comillas alrededor de las expresiones dinámicas.
Tengo una consulta en Grails así:
def strQuery = """select date_trunc('${type}', range) as range, sum(total_count) as total_count from connector_message_statistic
where range >= '${startDate}' and range < '${endDate}'
group by date_trunc('${type}', range)
order by 1 asc;"""
Tengo esta advertencia en el registro de catalina:
groovy.sql.Sql.asSql En Groovy SQL, evite usar comillas alrededor de expresiones dinámicas (que comienzan con $) ya que esto significa que no podemos usar un PreparedStatement de JDBC y, por lo tanto, es una vulnerabilidad de seguridad. Groovy ha solucionado su error, pero la vulnerabilidad de seguridad sigue presente. La expresión hasta ahora es: select date_trunc('?','range') as range, is_internal,direction, sum(total_count) as total_count, sum(total_message_size) as total_message_size
¿Cómo puedo deshacerme de esto? El problema es el parámetro dinámico date_trunc.
Cuando intento algo como esto:
select date_trunc(:type, range) ....... group by date_trunc(:type, range)
sql.eachRow(strQuery, type: type)
Entonces obtengo esta excepción:
ERROR: la columna "connector_message_statistic.range" debe aparecer en la cláusula GROUP BY o debe usarse en una función de agregado Posición: 23
¿Cómo puedo reescribir esa consulta para evitar estas advertencias?
davy.ai
La advertencia en el registro de catalina indica que el uso de comillas alrededor de las expresiones dinámicas (expresiones que comienzan con $) en las consultas SQL de Grails es un agujero de seguridad porque puede hacer que sea imposible utilizar un PreparedStatement de JDBC. Para evitar esta advertencia y el problema de seguridad, puedes usar parámetros con nombre en lugar de expresiones dinámicas.
Para reescribir la consulta sin el problema de la columna “connector_message_statistic.range”, prueba lo siguiente:
En este ejemplo, utilizamos parámetros con nombre para los valores dinámicos (type, startDate y endDate). También incluimos las columnas is_internal y direction en la cláusula group by para evitar el problema de la columna “connector_message_statistic.range”.