
请在投稿前阅读贡献指南。
ReDoS 扫描运行时的截图。

维基百科和OWASP对此有不错的解释。基本上,某些正则表达式在处理特定输入时可能需要极长的时间。下面是一个真实示例。
> 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.
像往常一样,使用 NPM 安装。
npm install redos
您可以在命令行中运行 redos:
# 使用 "Find" 对任意一组 JS 文件运行 Regex-DoS。
find . -name "*.js" -not -path "./node_modules/*" -exec redos {} \;
或者作为 node 模块运行:
var redos = require('redos');
// 使用回调
redos(" 'aaaa'.split(/a+b?c*/g); ", function(regexNodes){
console.log( regexNodes.results() );
};
// 或者不使用回调
redos(" 'aaaa'.split(/a+b?c*/g); ").results();
// 或者使用更合适的内容进行解析
const fs = require('fs');
const content = fs.readFileSync('./foobar.js'); // <--- 您自己的文件
redos( content ).results();
即将推出?
有关如何贡献的详细信息,请参阅贡献指南。内容可能和您预期的一样。
有关详细信息,请参阅行为准则。基本可以归结为:
为了营造一个开放和友好的环境,我们作为 贡献者和维护者承诺,让参与我们的项目和 社区对每个人来说都是一种无骚扰的体验,无论年龄、体型、 残疾、种族、性别认同与表达、经验水平、 国籍、个人外貌、种族、宗教或性认同与取向如何。
MIT 许可证(MIT)
版权所有 (c) 2016 John Gracey
特此免费授予任何获得本软件及相关文档文件(“软件”)副本的人不受限制地处理本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向其提供本软件的人员这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。
本软件按“现状”提供,不附带任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权保证。在任何情况下,作者或版权持有人均不对因使用本软件或与本软件的使用或其他交易有关的任何索赔、损害或其他责任负责,无论是合同行为、侵权行为还是其他行为。