安全漏洞:非法的BigDecimal造成系统崩溃 原理 漏洞实践与修复 易现点

原理

BigDecimal在JAVA中常用于金额的计算。BigDecimal表面上接收了科学计算法的参数然后进行了一个计算,但是没有对精度做校验。如果用户恶意的传入一个极大值,例如1e11111111e9999,那么会导致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类型来进行计算。

.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章