ReDoS(正则回溯导致的拒绝服务)
某些正则表达式在 特定输入 下会发生指数级回溯,浏览器主线程长时间占用,页面 卡死。若在服务端用于校验也可能拖垮 CPU。
危险正则示意(经典嵌套量词)
js
/^(\d+)+$/.test('1111111111111111111111111!');部分引擎上可能明显变慢(示意性质,实际依赖引擎与输入)。
另一常见模式:分组 + 嵌套 *。
前端输入校验原则
- 限制输入长度 再跑正则。
- 避免用户可控复杂正则(不要把用户输入拼进
new RegExp(user))。 - 使用 线性时间 库或 RE2 类引擎(若在 Node 侧)。
js
function safeCheckPin(pin) {
if (pin.length > 32) return false;
return /^\d{6}$/.test(pin); // 固定长度数字,回溯面小
}小结
对用户提供的字符串:先做长度裁剪;禁止动态拼装失控正则;高危校验放在服务端并设超时。
