原理
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類型來進行計算。
.