是一种利用正则表达式的特性,通过设计特定输入让正则表达式的处理时间变得极长,从而耗尽系统资源,导致服务不可用的攻击手段.

防护策略

  • 限制输入长度,避免处理超长的输入
  • 使用安全的正则表达式,避免使用大量嵌套重复的模式 (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)