正则表达式注入¶
ID: js/regex-injection
Kind: path-problem
Security severity: 7.5
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-730
- external/cwe/cwe-400
Query suites:
- javascript-code-scanning.qls
- javascript-security-extended.qls
- javascript-security-and-quality.qls
使用未经清理的用户输入构造正则表达式很危险,因为恶意用户可能能够修改表达式的含义。特别是,这样的用户可能能够提供一个在最坏情况下会花费指数级时间的正则表达式片段,并利用它来执行拒绝服务攻击。
建议¶
在将用户输入嵌入到正则表达式之前,使用清理函数(例如 lodash 的_.escapeRegExp
)来转义在正则表达式中具有特殊含义的元字符。
示例¶
以下示例显示了一个 HTTP 请求参数,该参数用于构造正则表达式,而没有进行预先清理。
var express = require('express');
var app = express();
app.get('/findKey', function(req, res) {
var key = req.param("key"), input = req.param("input");
// BAD: Unsanitized user input is used to construct a regular expression
var re = new RegExp("\\b" + key + "=(.*)\n");
});
相反,应该先清理请求参数,例如使用 lodash 包中的函数_.escapeRegExp
。这可以确保用户无法插入在正则表达式中具有特殊含义的字符。
var express = require('express');
var _ = require('lodash');
var app = express();
app.get('/findKey', function(req, res) {
var key = req.param("key"), input = req.param("input");
// GOOD: User input is sanitized before constructing the regex
var safeKey = _.escapeRegExp(key);
var re = new RegExp("\\b" + safeKey + "=(.*)\n");
});
参考资料¶
OWASP: 正则表达式拒绝服务 - ReDoS.
维基百科: ReDoS.
npm: lodash.
通用弱点枚举: CWE-730.
通用弱点枚举: CWE-400.