首页 > 解决方案 > 循环条件的未经检查的输入 - LocalDate 的 CheckMarx 错误

问题描述

    public List<ExchangeRate> getExchangeRate(@RequestBody @Validated ExchangeRateRequest exchangeRateRequest) {
        LocalDateTime conversionDateTime = parseConversionDateTime(exchangeRateRequest.getConversionDateTime());
        List<ExchangeRate> exchangeRateList = service.getExchangeRates(exchangeRateRequest, conversionDateTime);
        return exchangeRateList;
    }

    private LocalDate getPreviousBusinessDate(LocalDateTime conversionDateTime) {
        ZonedDateTime localConversionDateTimeWithZone = ZonedDateTime.of(conversionDateTime, ZoneOffset.systemDefault());
        ZonedDateTime conversionDateTimeAtUtc = localConversionDateTimeWithZone.withZoneSameInstant(ZoneOffset.UTC);
        LocalDate currentUtcDate = conversionDateTimeAtUtc.toLocalDate();
        LocalDate prev = currentUtcDate.minusDays(1);
        while(prev.getDayOfWeek()==DayOfWeek.SUNDAY || prev.getDayOfWeek()==DayOfWeek.SATURDAY) {
            prev = prev.minusDays(1);
        }
        return prev;
    }

public class ExchangeRateRequest {
    private final String conversionDateTime;

    @Valid
    private final List<ExchangeRateCurrency> currencies;

    @JsonCreator
    public ExchangeRateRequest(@JsonProperty("conversionDateTime") String conversionDateTime,
                               @JsonProperty("currencies") List<ExchangeRateCurrency> currencies) {
        this.conversionDateTime = conversionDateTime;
        this.currencies = currencies;
    }
}

元素exchangeRateRequest未经验证就流经代码,最终在 ExchangeRateService.java 的 getPreviousBusinessDate 中的循环条件中使用。这构成了循环条件的未检查输入。

我该如何解决?

标签: javavalidationsecure-codingcheckmarx

解决方案


我认为这种情况是误报,您无事可做(除了要求您的复选标记所有者忽略此结果。

Unchecked Input for Loop Condition意味着循环可能会因未清理条件而意外运行。

例如,如果您在循环中进行硬计算,例如您希望从用户那里获得一周中的某一天来在一周的下一个休息日运行您的计算,那么用户可以给您数字 8,而您将获得无限循环。

在您的情况下循环条件不是range,而只是检查特定状态,如果不在此状态下,则代码将继续。

我看不出任何可能发生的坏事的情况。


推荐阅读