Como parte de un proyecto relacionado con la seguridad escrito en Node.js, estoy viendo parte del trabajo realizado por el equipo detrás de PHPIDS , específicamente su lista de filtros , que se compone de una gran cantidad de expresiones regulares que coinciden con una variedad de diferentes cargas útiles de ataque.
Quiero dejar en claro que, por supuesto, soy plenamente consciente de que este proyecto no se ha mantenido durante casi ocho años, pero definitivamente veo cómo estos filtros podrían desempeñar un papel valioso en un sistema de detección más grande.
Con eso fuera del camino, he estado luchando para encontrar una buena manera de "convertir" algunas de estas expresiones específicas de PCRE a un formato que sea compatible con la implementación estándar de JavaScript.
Hasta ahora, he intentado usar diferentes herramientas, como regex 101 , pcre-to-regexp y babel-plugin-transform-modern-regexp , pero todas se ahogan con las mismas características: "mirada atrás negativa" y "condicionales grupales".
Por lo que entiendo, muchas características que han faltado en la implementación de JS están en camino, lo cual es genial, pero básicamente no hay noticias sobre estas dos específicamente (hasta donde puedo encontrar).
Mi esperanza es que para alguien que realmente entienda el funcionamiento interno de estas funciones, reescribirlas podría ser bastante sencillo, tal vez usando una combinación de expresiones significativamente menos complejas y/o algún procesamiento adicional antes/después de que se ejecuten, para actuar. como un "polyfill" más o menos.
Adjunto un enlace a uno de estos patrones en RegExr, debido a su increíblemente útil explicación generada automáticamente del patrón y todas las diferentes partes, así como la expresión completa aquí también.
RegExr: patrón con funciones PCRE
([^*:\\s\\w,.\\\/?+-]\\s*)?(?<![az]\\s)(?<![az\\\/_@\\-\\|])(\\s*return\\s*)?(?:create(?:element|attribute|textnode)|[az]+events?|setattribute|getelement\\w+|appendchild|createrange|createcontextualfragment|removenode|parentnode|decodeuricomponent|\\wettimeout|(?:ms)?setimmediate|option|useragent)(?(1)[^\\w%\"]|(?:\\s*[^@\\s\\w%\",.+\\-]))No puede ser imposible lograr lo mismo que esta expresión de casi una década en JavaScript, ¿verdad?
La mayoría de los motores de JavaScript modernos admiten búsquedas negativas, por lo que la única característica en su expresión regular que no es compatible es el grupo condicional (?(1)subpattern1|subpattern2) , que elige un subpatrón para tratar de hacer coincidir en función de si algo coincidió con el primero grupo de captura.
Esto se puede emular aplicando la expresión regular con el grupo condicional eliminado, y luego, si hay una coincidencia, buscando si algo coincidió con el primer grupo de captura.
let rex = new RegExp(patternWithoutConditionalGroup, 'i'); let match = text.match(rex); if (match !== null) { if (match[1] !== undefined) { y luego concatenar subpattern1 o subpattern2 a la expresión regular en consecuencia y volver a aplicarlo.
rex = new RegExp(patternWithoutConditionalGroup + subpattern1, 'i'); match = text.match(rex);Déjame saber cómo te va.