今天聊个容易被忽略的坑:一行正则写错,整个服务能被一个字符串干趴。
根子在贪婪回溯。.* 这种量词会先一路吞到串尾再往回试,一旦写成 (a+)+$ 这类嵌套重复,碰到 aaaa…aaab 这种末尾带个不匹配字符的输入,回溯次数直接指数级爆炸。正常输入毫无波澜,恶意输入一打过来,单核 CPU 瞬间吃满,其他请求全排队,等于一个不用登录的拒绝服务。这玩意儿有个正经名字叫 ReDoS。
我之前有个接口拿正则校验用户输入,自测全过,上线后被人扫了一波就卡死,查了半天才定位到那行 .*。
治法是:点号换成具体字符集如 [^>]*,别让它乱吞;尽量别写嵌套重复;能用专门解析器的就别硬上正则;最后给匹配加超时和输入长度上限,双保险。