当前位置: 首页 > news >正文

[实践总结] 限制正则表达式匹配次数/时间 防止DoS攻击

思路

1、优化正则表达式
2、正则表达式无法优化的话,可以考虑限制匹配次数,或者限制匹配时间

限制 匹配次数

public class CountedCharSequence implements CharSequence {private final CharSequence charSequence;private long count;public CountedCharSequence(CharSequence charSequence, long count) {this.charSequence = charSequence;this.count = count;}@Overridepublic String toString() {return charSequence.toString();}@Overridepublic int length() {return charSequence.length();}@Overridepublic char charAt(int index) {if (index <= 0) {throw new IllegalArgumentException("Regex match over max " + count + " times");}count--;return charSequence.charAt(index);}@Overridepublic CharSequence subSequence(int start, int end) {return charSequence.subSequence(start, end);}
}

模拟Dos攻击

String str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";long start = System.nanoTime();
Pattern.compile("^(a+)+$").matcher(str).matches();
System.out.println(((System.nanoTime() - start)) + " nano seconds");执行用时
1399200 nano seconds

超过 1亿 就会报错

long start1 = System.nanoTime();try {Pattern.compile("^(a+)+$").matcher(new CountedCharSequence(str, 100_000_000)).matches();
} catch (Exception e) {System.out.println(e.getMessage());
}System.out.println(((System.nanoTime() - start1)) + " nano seconds");执行用时
Regex match over max 100000000 times
601800 nano seconds

限制 匹配时间

import java.util.regex.Pattern;public final class TimedCharSequence implements CharSequence {private final CharSequence sequence;private final long timestamp;public TimedCharSequence(CharSequence sequence, long nanoseconds) {this.sequence = sequence;this.timestamp = System.nanoTime() + nanoseconds;}@Overridepublic String toString() {return sequence.toString();}@Overridepublic int length() {return sequence.length();}@Overridepublic char charAt(int index) {if (timestamp < System.nanoTime()) {throw new IllegalStateException("Regex match timeout");}return sequence.charAt(index);}@Overridepublic CharSequence subSequence(int start, int end) {return sequence.subSequence(start, end);}
}

模拟Dos攻击

String str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";long start = System.nanoTime();
Pattern.compile("^(a+)+$").matcher(str).matches();
System.out.println(((System.nanoTime() - start)) + " nano seconds");执行用时:
1385400 nano seconds

超过 给定时间间隔就报错

long start1 = System.nanoTime();try {Pattern.compile("^(a+)+$").matcher(new TimedCharSequence(str, 10_000)).matches();
} catch (Exception e) {System.out.println(e.getMessage());
}System.out.println(((System.nanoTime() - start1)) + " nano seconds");执行用时:
Regex match timeout
123100 nano seconds

[Ref]

[Ref] 限制正则表达式执行时间

http://www.lryc.cn/news/274124.html

相关文章:

  • ffmpeg 5.0版本调试 ffmpeg 5.01 static版本
  • 应用在游戏机触摸屏中的触摸感应芯片
  • D-Link DES-108 交换机
  • VIT用于图像分类 学习笔记(附代码)
  • MongoDB Certified Associate Developer 认证考试心得
  • 基于Java车间工时管理系统(源码+部署文档)
  • 2024.1.5
  • 水库大坝安全监测设计与施工经验
  • 媒体捕捉-拍照
  • Typora+PicGo+Gitee构建云存储图片
  • 【话题】ChatGPT等大语言模型为什么没有智能2
  • 通过大量生物、地球、农业、气象、生态、环境科学领域中案例,一起探索如何优雅地使用大模型吧!
  • slf4j+logback源码加载流程解析
  • KVM虚拟机部署K8S重启后/etc/hosts内容丢失
  • Redis使用场景(五)
  • 【UnityShader入门精要学习笔记】(2)GPU流水线
  • CSS免费在线字体格式转换器 CSS @font-face 生成器
  • Codeium在IDEA里的3个坑
  • C-C++ 项目构建指南:如何使用 Makefile 提高开发效率
  • 基于SpringBoot的图书管理系统
  • 矩阵对角线遍历
  • 【教程】Typecho Joe主题开启并修复壁纸相册不显示问题
  • MR混合现实情景实训教学系统在法律专业课堂上的应用
  • 车载 Android之 核心服务 - CarPropertyService 的VehicleHAL
  • 年底了,准备跳槽的可以看看...
  • Bagging算法_随机森林Random_Forest
  • 物理与网络安全
  • torch.meshgrid和np.meshgrid的区别
  • 【PostgreSQL】约束-唯一约束
  • 学习使用js/jquery获取指定class名称的三种方式