127 votos

¿Hay alguna forma de poner el código malicioso en una expresión regular?

Quiero añadir regular la expresión de la capacidad de búsqueda a mis pública de la página web. Aparte de HTML codificación de la salida, necesito hacer nada para protegerse contra maliciosos la entrada de usuario?

Las búsquedas de Google son inundados por la gente de la resolución de la converse problema-el uso de expresiones regulares para detectar maliciosos de entrada-que no me interesa. En mi caso, el usuario de entrada es una expresión regular.

Voy a utilizar la Expresión regular de la biblioteca en .NET (C#).

201voto

tchrist Puntos 47116

La negación-de-Servicio Preocupaciones

La preocupación más común con expresiones regulares es un ataque de denegación de servicio ataque a través de los patrones patológicos que van exponencial o incluso super-exponencial! - y así aparecen a tardar una eternidad para resolver. Éstos sólo pueden aparecer en particular los datos de entrada, pero, en general, crear una en donde esto no importa.

Cuáles son estos dependerá en cierta medida de qué tan inteligente es el regex compilador que se está usando pasa a ser, debido a que algunos de estos pueden ser detectados durante el tiempo de compilación. Regex compiladores que aplicar la recursividad generalmente tiene un built-in de recursividad-contador de profundidad para la comprobación de la no progresión.

Russ Cox 2007 excelente papel en expresiones Regulares Puede Ser Simple Y Rápido (pero es lento en Java, Perl, PHP, Python, Ruby, ...) habla sobre las maneras en que la mayoría de los modernos NFAs, que parecen derivar de Henry Spencer código, sufren una grave degradación del rendimiento, pero donde una Thompson de estilo de la NFA no tiene ningún tipo de problemas.

Si sólo admiten a los patrones que pueden ser resueltos por DFAs, puede compilar como tales, y que se ejecutará más rápido, posiblemente mucho más rápido. Sin embargo, se necesita tiempo para ello. El papel de la Cox menciona este enfoque y sus problemas de operador. Todo se reduce a un clásico del espacio-tiempo trade-off.

Con un DFA, dedicar más tiempo a la construcción de la misma (y la asignación de más estados), mientras que con un NFA dedicar más tiempo a la ejecución de la misma, ya que puede ser de varios estados al mismo tiempo, y dando marcha atrás puede comer su almuerzo y su CPU.

La negación-de-Servicio de Soluciones

Probablemente la vía más racional para abordar estos patrones que se están perdiendo de una carrera con el calor de la muerte del universo es envolverlos con temporizador en la que se pone efectivamente en un periodo de tiempo máximo permitido para su ejecución. Generalmente esto es mucho, mucho menor que el valor predeterminado de tiempo de espera que la mayoría de los servidores HTTP proporcionar.

Hay varias formas de implementar estos, que van desde un simple alarm(N) en el nivel C, a algún tipo de try {} bloque de las capturas de alarma-tipo de excepciones, todo el camino a la puesta fuera de un nuevo hilo especialmente creado con un tiempo de restricción construido a la derecha en él.

El Código De Llamadas

En regex idiomas que admitir código de llamadas, algún mecanismo para permitir o denegar estos de la cadena que se va a compilar debe ser proporcionada. Incluso si el código de llamadas son sólo para el código en el idioma que está utilizando, debe restringir ellos; no tienen que ser capaces de llamar a código externo, aunque si se puede, tienes grandes problemas.

Por ejemplo, en Perl no se puede tener el código de llamadas en expresiones regulares creado a partir de la interpolación de cadenas (como estos sería, como son compilados durante el tiempo de ejecución), salvo que las especiales léxicamente ámbito de pragma use re "eval"; de activos en el ámbito actual.

De esa manera nadie puede colarse en un código de llamada para ejecutar los programas del sistema como rm -rf *, por ejemplo. Debido a que el código llamadas son tan sensibles a la seguridad, Perl, se deshabilita de forma predeterminada en todos los interpolados cadenas, y usted tiene que salir de su camino para volver a habilitarlas.

Definido por el usuario \P{roperties}

Sigue siendo uno de los más sensibles a la seguridad el problema relacionado con el Unicode-propiedades de estilo - como \pM, \p{Pd}, \p{Pattern_Syntax}o \p{Script=Greek} - que puede existir en algunos regex compiladores que el apoyo que la notación.

El problema es que en algunos de estos, el conjunto de posibles propiedades es el usuario extensible. Eso significa que usted puede tener propiedades personalizadas que son reales código de llamadas a funciones con nombre en un determinado espacio de nombres, como \p{GoodChars} o \p{Class::Good_Characters}. Cómo su idioma maneja esos podría ser que vale la pena mirar.

Sandboxing

En Perl, un espacio aislado del compartimiento a través de la Safe módulo daría el control sobre el espacio de nombres de la visibilidad. Otros lenguajes similares de la oferta de sandboxing tecnologías. Si tales dispositivos están disponibles, usted puede desear mirar en ellos, debido a que están diseñados específicamente para la limitada ejecución de código sospechoso.

17voto

Brian Bloniarz Puntos 271

Agregando a la excelente respuesta de tchrist: el mismo Russ Cox quien escribió la página "Expresión Regular" también ha liberado código! RE2 es una librería en C++ que garantiza la ejecución O(length_of_regex) y límite de uso de la memoria configurable. Se utiliza dentro de Google que puede escribir una expresión regular en búsqueda de códigos por google--lo que significa que ha sido probado de batalla.

12voto

SLaks Puntos 391154

Sí.

Regexes puede utilizarse para realizar ataques DOS.
No hay una solución sencilla.

5voto

Bruce Ediger Puntos 294

Usted querrá leer este documento:

Cambio de contexto inseguro: expresiones regulares para la supervivencia de inoculación El papel es más de lo que puede salir mal con los motores de la expresión regular (e.g. PCRE), pero puede ayudarle a entender lo que te enfrentas.

4voto

Bryan Oakley Puntos 63365

Usted no sólo preocuparse por la coincidencia de sí mismo, pero ¿cómo se hace el cotejo. Por ejemplo, si su entrada pasa a través de algún tipo de evaluación de la fase de sustitución de comandos en su camino hacia el motor de expresiones regulares no podía ser de código que se ejecuta dentro del patrón. O, si su sintaxis de expresión regular permite comandos incrustados que tienen que tener cuidado con eso, también. Ya que no ha especificado el idioma de su pregunta es difícil decir con certeza lo que todas las implicaciones de seguridad.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X