当前位置: 首页 > 知识库问答 >
问题:

Java:Matcher.find使用高cpu利用率

祁辰阳
2023-03-14

我正在使用mod安全规则https://github.com/SpiderLabs/owasp-modsecurity-crs清理用户输入数据。在将用户输入与mod security rule正则表达式匹配时,我面临着cpu激增和延迟。总的来说,它包含500个正则表达式来检查不同类型的攻击(xss、badrobots、generic和sql)。对于每个请求,我检查所有参数并对照所有这500个正则表达式进行检查。我正在使用Matcher。查找以检查参数。在这种情况下,一些参数落在无限循环中,我使用下面的技术解决了这个问题。

取消长时间运行的正则表达式匹配?。

清理一个用户请求大约需要500毫秒,cpu%迅速增长。我使用visualvm进行了分析。Java语言net与我的测试套件runner。

Cpu配置文件输出

请帮助我降低cpu使用率%和平均负载

共有3个答案

谷梁振
2023-03-14

我认为这是问题的根源,而不是regex性能本身:

对于每个请求,我检查所有参数并对照所有这500个正则表达式进行检查

无论你的正则表达式有多快,这仍然是大量的工作。我不知道您有多少个参数,但即使只有很少的参数,仍然需要在每个请求中检查数千个正则表达式。这会杀死你的CPU。

除了通过预编译和/或简化它们来提高正则表达式性能等显而易见的事情之外,您还可以执行以下操作来减少正则表达式检查的数量:

>

  • 根据参数类型对用户输入进行正验证。例如,如果某个参数必须是一个简单的数字,则不要浪费时间检查它是否包含恶意XML脚本。只需检查它是否匹配[0-9](或类似的简单内容)。如果是,则可以-跳过检查所有500个正则表达式。

    尝试找到可以消除所有类型攻击的简单regexp——在regexp中找到常见的东西。例如,如果有100个regexp正在检查是否存在某些HTML标记,请首先检查内容是否至少包含一个HTML标记。如果没有,则在检查100个regexp时立即保存。

    缓存结果。webapps中生成的许多参数都会重复。不要反复检查相同的内容,只需记住最终的验证结果。注意限制缓存的最大大小以避免DOS攻击。

    还要注意,否定验证通常很容易绕过。有人只需更改恶意代码中的几个字符,您的regexp就不匹配了。您必须增加regexp的“数据库”,以防止新的攻击。正面验证(白名单)没有这个缺点,更有效。

  • 公羊曜灿
    2023-03-14

    我建议您看看这篇文章:“为入侵检测实现更快的字符串匹配或超过Snort的速度”

    有更好的方法来匹配您描述的匹配。从本质上讲,您需要匹配500个模式,并将其编译成一个后缀树,该后缀树可以非常有效地将输入与所有规则同时匹配。

    本文解释了Dan Gusfield将这种方法描述为“精确集匹配的Boyer-Moore方法”。

    Boyer-Moore是一种著名的字符串匹配算法。本文描述了一种用于集合匹配的Boyer-Moore变体。

    权烨磊
    2023-03-14

    如果可能的话,只编译一次regex并保持它们,而不是重复(隐式)编译(尤其是在循环中)
    参见java。util。regex-模式的重要性。编译()?了解更多信息。

     类似资料:
    • 问题内容: 关闭。 这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 7年前关闭。 最近,我的服务器CPU性能一直很高。 CPU平均负载为13.91(1分钟)11.72(5分钟)8.01(15分钟),而我的站点的流量仅略有增加。 运行完最高命令后,我看到MySQL使用的CPU是160%! 最近,我一直在优化表,并切换到持久连接。这会

    • 谁能解释一下这两种方法的真正区别 vm。GetTotalizationofCPU(CloudSim.clock()); 和 cloudlet.get利用OfCpu(CloudSim.clock()); 提前感谢

    • 我对wowza中的cpu使用有问题。 这是可疑的线程。这个线程被占用了高CPU。 这个线程占用了大量cpu。这是jdk bug还是其他? 这是我的环境。 CentOS 5.4版(最终版) WowzaMediaServer-3.1.2 java版本1.6.0_23 java(TM)SE Runtime Environment(构建1.6.0_23-b05)java HotSpot(TM)64位服务器

    • 问题内容: 在Linux中是否有命令或任何其他方式来获取当前或平均 CPU使用率 (对于多处理器环境)? 我在小型系统中使用嵌入式Linux。基本上,我需要确定CPU利用率,以便在CPU利用率很高的情况下,可以将新进程转移到系统中的另一个控制器,而不是在可能忙于执行更重要进程的主处理器上执行。 这个问题不仅仅在于对进程进行优先级排序,另一个控制器可以充分处理新进程,只是当主处理器不忙时,我希望它来

    • 我有一个Java应用程序(基于web),它有时会在几个小时内显示非常高的CPU利用率(几乎90%)。Linux的TOP命令显示了这一点。重新启动应用程序时,问题就会消失。 所以要调查: 我使用线程转储来查找线程正在执行的操作。有几个线程处于“可运行”状态,一些线程处于其他一些状态。在重复执行线程转储时,我确实看到一些线程总是处于“可运行”状态。因此,他们似乎是罪魁祸首。 但我无法确定,哪个线程占用

    • 如何获取库伯内特斯集群中 CPU 使用率最高的前三个容器? 上面的命令为所有名称空间中的所有pod提供了CPU和内存利用率。如何将其限制在CPU利用率最高的前三个机架上? 此外,我尝试按CPU排序,但似乎排序不起作用。 输出: