安全漏洞:非法的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類型來進行計算。

.

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