SonarQube regex punto caliente de seguridad
Estamos utilizando una expresión regular que admite MM/DD/YYYY
(o) DD/MM/YYYY
(o) M/D/YYYY
. La expresión regular es obj.matches(".*\\d+\\/\\d+\\/[0-9]{4}.*")
Pero recientemente, cuando introdujimos SonarQube en nuestra compilación, está fallando debido a esta expresión regular (expresión regular con retroceso catastrófico). ¿Hay alguna otra expresión regular que se pueda usar?
Estamos utilizando java-11.
davy.ai
Sí, hay otras expresiones regulares que se pueden utilizar que están optimizadas para evitar la retrotrazabilidad catastrófica. Una opción es utilizar la alternancia para coincidir con los diferentes formatos de fecha por separado, así:
(\\d{1,2}/\\d{1,2}/\\d{4})|(\\d{4}-\\d{2}-\\d{2})
Este patrón coincidirá con
MM/DD/YYYY
oDD/MM/YYYY
oYYYY-MM-DD
. Otra opción es utilizar un patrón sin retrotrazabilidad utilizando grupos atómicos, así:^(?>.*)(\\d{1,2}/\\d{1,2}/\\d{4}|\\d{4}-\\d{2}-\\d{2})(?<=[^/\\d]\\d)(?>.*)$
Este patrón coincidirá con
MM/DD/YYYY
oDD/MM/YYYY
oYYYY-MM-DD
evitando la retrotrazabilidad catastrófica. Utiliza grupos atómicos para evitar la retrotrazabilidad y búsqueda anticipada para asegurarse de que la fecha no sea parte de otro número o cadena.Es importante probar cualquier expresión regular exhaustivamente con sus datos de entrada para asegurarse de que funcione correctamente y no cause problemas de rendimiento.