
👮 👊 Escáner de Denegación de Servicio por RegEx (ReDos)

Por favor, lee las guías de contribución antes de contribuir.
Una captura de pantalla del escaneo de ReDoS en acción.

Wikipedia y OSWAP tienen explicaciones decentes. Básicamente, ciertas expresiones regulares pueden tardar mucho tiempo para ciertas entradas. Aquí tienes un ejemplo real.
> console.time('benchmark');
/^(([a-z])+.)+[A-Z](https://github.com/jagracey/regex-dos/blob/HEAD/%5Ba-z%5D)+$/.test('aaaaaaaaaaaaaaa');
console.timeEnd('benchmark');
< benchmark: 0.060ms
> console.time('benchmark');
/^(([a-z])+.)+[A-Z](https://github.com/jagracey/regex-dos/blob/HEAD/%5Ba-z%5D)+$/.test('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
console.timeEnd('benchmark');
< benchmark: 308.656ms
> console.time('benchmark');
/^(([a-z])+.)+[A-Z](https://github.com/jagracey/regex-dos/blob/HEAD/%5Ba-z%5D)+$/.test('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
console.timeEnd('benchmark');
< benchmark: 3179.829ms
> console.time('benchmark');
/^(([a-z])+.)+[A-Z](https://github.com/jagracey/regex-dos/blob/HEAD/%5Ba-z%5D)+$/.test('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
console.timeEnd('benchmark');
< benchmark: 22159.769ms // 22 seconds
> // You can guess what would happen if you test the RegEx with 100 repeating characters.
console.time('benchmark');
/^(([a-z])+.)+[A-Z](https://github.com/jagracey/regex-dos/blob/HEAD/%5Ba-z%5D)+$/.test( 'a'.repeat(100) );
console.timeEnd('benchmark');
< benchmark: lol.....no.
Como siempre, instala con NPM.
npm install redos
Puedes ejecutar redos en la CLI:
# Use "Find" to run Regex-DoS for any set of JS files you want.
find . -name "*.js" -not -path "./node_modules/*" -exec redos {} \;
O para ejecutarlo como módulo de node:
var redos = require('redos');
// Using a Callback
redos(" 'aaaa'.split(/a+b?c*/g); ", function(regexNodes){
console.log( regexNodes.results() );
};
// Or Without a Callback
redos(" 'aaaa'.split(/a+b?c*/g); ").results();
// Or With Better Content to Parse
const fs = require('fs');
const content = fs.readFileSync('./foobar.js'); // <--- Your own file Here.
redos( content ).results();
¿Próximamente?
Consulta la guía de contribución para obtener detalles sobre cómo contribuir. Probablemente sea lo que esperas.
Consulta el Código de Conducta para más detalles. Básicamente se reduce a:
Con el interés de fomentar un entorno abierto y acogedor, nosotros, como contribuyentes y mantenedores, nos comprometemos a hacer de la participación en nuestro proyecto y nuestra comunidad una experiencia libre de acoso para todos, independientemente de la edad, la complexión física, la discapacidad, la etnia, la identidad y expresión de género, el nivel de experiencia, la nacionalidad, la apariencia personal, la raza, la religión o la identidad y orientación sexual.
La Licencia MIT (MIT)
Copyright (c) 2016 John Gracey
Se concede permiso, de forma gratuita, a cualquier persona que obtenga una copia de este software y de los archivos de documentación asociados (el "Software"), para tratar con el Software sin restricción, incluidos, sin limitación, los derechos de uso, copia, modificación, fusión, publicación, distribución, sublicencia y/o venta de copias del Software, y para permitir a las personas a las que se les proporcione el Software, hacer lo mismo, sujeto a las siguientes condiciones:
El aviso de copyright anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DEL COPYRIGHT SERÁN RESPONSABLES DE CUALQUIER RECLAMO, DAÑOS U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTROS ACUERDOS EN EL SOFTWARE.