ReDos(正则表达式拒绝服务攻击)
是一种利用正则表达式的特性,通过设计特定输入让正则表达式的处理时间变得极长,从而耗尽系统资源,导致服务不可用的攻击手段.
防护策略
- 限制输入长度,避免处理超长的输入
- 使用安全的正则表达式,避免使用大量嵌套重复的模式
(a+)+
,(a|aa)*
- 使用编译好的正则表达式库,如RE2(Google维护的正则表达式库,设计用于避免回溯和爆炸性增长)
限制正则表达式的执行时间,设置正则表达式匹配的最大执行时间,超时则中断匹配操作
import signal class TimeoutException(Exception): pass def timeout_handler(signum, frame): raise TimeoutException("Regular expression execution timed out") signal.signal(signal.SIGALRM, timeout_handler) def safe_regex_match(pattern, string, timeout=1): signal.alarm(timeout) try: return re.match(pattern, string) except TimeoutException: return None finally: signal.alarm(0)