es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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:

    def strQuery = """
        select date_trunc(:type, range) as range, is_internal, direction, sum(total_count) as total_count,
               sum(total_message_size) as total_message_size 
        from connector_message_statistic  
        where range >= :startDate and range < :endDate
        group by date_trunc(:type, range), is_internal, direction
        order by 1 asc
    """
    
    sql.eachRow(strQuery, [type: type, startDate: startDate, endDate: endDate])
    

    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”.

Comments are closed.