• 关于正则效率问题(正则导致程序卡死)


    前言:

      在Java中,正则的使用需要谨慎,好的正则可以方便我们的代码,但是不好的正则,可能成为黑客攻击的漏洞。类似本例子的正则,黑客可以组织不同的匹配字符,使得校验不过,耗尽服务器资源(资源耗尽攻击)。详见正则的状态机原理。

    1.说明:2018/8/17:
        校验输入字符串是否合规,允许:100000000000^145^1^1000.00| 100000000000^145^1^1000.00| ....
        如此序列(100000000000^145^1^1000.00|)必须满足1-18个,19个则失败。
        写正则:reg = ^(\d{12}\^\d{3}\^[123456]{1}\^\d+[\.\d+]*\|){1,18}$
    代码:
    String regex = "^(\d{12}\^\d{3}\^[123456]{1}\^\d+[\.\d+]*\|){1,18}$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(prove);
    if (!matcher.matches()) {
          return false;
    }
    return true;
    

      

    2.问题:
        在测试案例中含有18个序列,正常通过。在案例增加到19个序列时,程序卡死。
    3.分析:
        正则循环次数过多!导致资源耗尽或死循环。
    4.解决方法:
        减少正则校验的循环次数,改为程序循环!,直接传递切割好的数组,再对数组进行循环。
    代码:
    String[] proves = accountProve.split("\|");        
     if (proves.length > 18 || proves.length < 1) {
          return false;
      }
     for (String prove : proves) {
         String regex = "^(\d{12}\^\d{3}\^[123456]{1}\^\d+[\.\d+]*)$";
         Pattern pattern = Pattern.compile(regex);
         Matcher matcher = pattern.matcher(prove);
         if (!matcher.matches()) {
             return false;
          }
     }
    return true;
          
    
    凡你能说的,你说清楚。凡你不能说的,留给沉默!
  • 相关阅读:
    Django终端打印SQL语句
    Django之缓存
    Django总结三
    Django之信号
    Django之Form的ModelForm
    git下
    Ajax实现文件的上传
    operator模块
    Django之Form自定义验证规则
    New Concept English Two 32 88
  • 原文地址:https://www.cnblogs.com/dhcao/p/10451760.html
Copyright © 2020-2023  润新知