
👮 👊 Scanner per Denial of Service (ReDos) tramite RegEx

Si prega di leggere le linee guida per i contributi prima di contribuire.
Uno screenshot della scansione ReDoS in azione.

Wikipedia e OSWAP forniscono delle buone spiegazioni. In pratica, alcune RegEx possono richiedere molto tempo per determinati input. Ecco un esempio reale.
> console.time('benchmark');
/^(([a-z])+.)+[A-Z](https://github.com/jagracey/regex-dos/blob/master/%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/master/%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/master/%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/master/%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/master/%5Ba-z%5D)+$/.test( 'a'.repeat(100) );
console.timeEnd('benchmark');
< benchmark: lol.....no.
Come al solito, installa con NPM.
npm install redos
Puoi eseguire redos tramite CLI:
# Use "Find" to run Regex-DoS for any set of JS files you want.
find . -name "*.js" -not -path "./node_modules/*" -exec redos {} \;
Oppure per eseguirlo come modulo 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();
In arrivo?
Vedi la guida ai contributi per i dettagli su come contribuire. Probabilmente è quello che ti aspetti.
Vedi il Codice di Condotta per i dettagli. In sostanza si riduce a:
Nell'interesse di promuovere un ambiente aperto e accogliente, noi, contributori e manutentori ci impegniamo a rendere la partecipazione al nostro progetto e alla nostra comunità un'esperienza libera da molestie per tutti, indipendentemente da età, corporatura, disabilità, etnia, identità ed espressione di genere, livello di esperienza, nazionalità, aspetto personale, razza, religione o identità e orientamento sessuale.
La Licenza MIT (MIT)
Copyright (c) 2016 John Gracey
Con la presente si concede gratuitamente a chiunque ottenga una copia di questo software e dei file di documentazione associati (il "Software"), di utilizzare il Software senza alcuna restrizione, inclusi, senza limitazione, i diritti di utilizzare, copiare, modificare, unire, pubblicare, distribuire, concedere in sublicenza e/o vendere copie del Software, e di permettere alle persone a cui il Software è fornito di fare altrettanto, alle seguenti condizioni:
L'avviso di copyright qui sopra e questo avviso di permesso dovranno essere inclusi in tutte le copie o parti sostanziali del Software.
IL SOFTWARE È FORNITO "COSÌ COM'È", SENZA GARANZIA DI ALCUN TIPO, ESPRESSA O IMPLICITA, INCLUSI MA NON LIMITATI ALLE GARANZIE DI COMMERCIABILITÀ, IDONEITÀ PER UN PARTICOLARE SCOPO E NON VIOLAZIONE. IN NESSUN CASO GLI AUTORI O I TITOLARI DEL COPYRIGHT SARANNO RESPONSABILI PER QUALSIASI RECLAMO, DANNO O ALTRA RESPONSABILITÀ, SIA IN UN'AZIONE DI CONTRATTO, ILLECITO O ALTRO, DERIVANTE DA, FUORI O IN CONNESSIONE CON IL SOFTWARE O L'USO O ALTRE OPERAZIONI NEL SOFTWARE.