regular - regex replace online
¿Es seguro leer expresiones regulares de un archivo? (5)
Suponiendo una secuencia de comandos de Perl que permita a los usuarios especificar varias expresiones de filtro de texto en un archivo de configuración, ¿existe una forma segura de permitirles también ingresar expresiones regulares, sin la posibilidad de efectos secundarios no deseados o ejecución de código? Sin analizar realmente las expresiones regulares y revisarlas por constructos problemáticos, eso es. No habrá ninguna sustitución, solo coincidencia.
Como comentario adicional, ¿hay alguna manera de probar si la expresión regular especificada es válida antes de usarla realmente? Me gustaría emitir advertencias si se ingresó algo como /foo (bar/
.
Gracias, Z.
EDITAR:Gracias por las respuestas muy interesantes. Desde entonces, descubrí que las siguientes construcciones peligrosas solo se evaluarán en expresiones regulares si se
use re ''eval''
el use re ''eval''
pragma use re ''eval''
: (?{code})
(??{code})
${code}
@{code}
El valor predeterminado es no re ''eval''
; así que, a menos que me falta algo, debería ser seguro leer expresiones regulares de un archivo, con el único control que es el eval / catch publicado por Axeman. Al menos no he podido ocultar nada malo en ellos en mis pruebas.
Gracias de nuevo. Z.
¿Sería útil el módulo Safe con respecto a la compilación / ejecución de expresiones regulares no confiables?
Dependiendo de con qué se está emparejando, y la versión de Perl que está ejecutando, puede haber algunos regex que actúen como un ataque de denegación de servicio efectivo mediante el uso excesivo de lookaheads, lookbehinds y otras afirmaciones.
Lo mejor es que solo permita un subconjunto pequeño y bien conocido de patrones de expresiones regulares y lo expanda con precaución a medida que usted y sus usuarios aprenden a usar el sistema. De la misma manera que muchos sistemas de comentarios de blog permiten solo un pequeño subconjunto de etiquetas HTML.
Eventualmente, Parse :: RecDescent podría ser útil, si necesita hacer análisis complejos de expresiones regulares.
Esta
eval {
qr/$re/;
};
if ( $@ ) {
# do something
}
compila una expresión y le permite recuperarse de un error.
Puedes buscar expresiones maliciosas, ya que solo vas a hacer coincidencias, buscando estos patrones, que permitirían ejecutar código arbitrario:
(?: /( /?{1,2} /{ # ''('' followed by ''?'' or ''??'', and then ''{''
| /@ /{ /s* /[ # a dereference of a literal array, which may be arbitrary code.
)
Asegúrese de compilar esto con la bandera x
.
Probablemente tendrá que hacer un cierto nivel de desinfección. Por ejemplo, la página man de perlre describe la siguiente construcción:
(?{ code })
que permite código ejecutable dentro de una coincidencia de patrón.
Sugeriría no confiar en las expresiones regulares de los usuarios. Si realmente está decidido a hacerlo, ejecute Perl en modo de contaminación (-T). En ese caso, necesitará alguna forma de validación. En lugar de utilizar Parse :: RecDescent para escribir su propio analizador de expresiones regulares como sugiere otra respuesta, debe usar el analizador de expresiones regulares YAPE :: Regex existente, que probablemente sea más rápido, fue escrito por un experto y funciona como un amuleto.
Finalmente, desde perl 5.10.0, puede conectar diferentes motores de expresiones regulares en perl (¡léxicamente!). Puede verificar si hay disponible un motor de expresiones regulares menos potente cuya sintaxis sea más fácilmente verificable. Si desea ir por esa ruta, lea la descripción de la API , Re :: engine :: Plugin de Avar o, en general, revise cualquiera de los motores de complementos de Avar .