原理
BigDecimal在JAVA中常用于金额的计算。BigDecimal表面上接收了科学计算法的参数然后进行了一个计算,但是没有对精度做校验。如果用户恶意的传入一个极大值,例如1e1111111
或1e9999
,那么会导致BigDecimal计算时间延迟很大,从而造成系统崩溃。
漏洞实践与修复
public class Test {
public static void main(String[] args) {
String value = "1e99999999";
//数据检查
if (value.contains("1e")) {
log.error("传入数据错误");
} else {
BigDecimal num = new BigDecimal(value);
Long startTime = System.currentTimeMillis();
BigDecimal num1 = new BigDecimal(0.00001);
System.out.println(num1.subtract(num));
Long endTime = System.currentTimeMillis();
Long tempTime = (endTime - startTime);
System.out.println(tempTime);
}
}
}
- 我们可以对传入的数据进行一次格式校验,拦截到科学计数法1ex输入。
- 我们可以将String类型转化为number类型,再转换为BigDecimal类型.
易现点
外部传入的String字符串,直接转化成BigDecimal类型来进行计算。
.
网友评论