使用 ESAPI 的数字验证有什么好处吗?

Are there any benefits using ESAPI's number validations?

我被要求在我们所有的 REST 端点中添加一些输入验证。我们的系统中有两个自定义验证约束,围绕着 ESAPI 库;一个用于字符串,包装 #isValidInput and one for Long, wrapping #isValidNumber.

ESAPI 的 #isValidNumber seems to simply check the number's min and max value (something that I can simply do with JSR-303 @Min / @Max)。使用 ESAPI 库是否有任何额外的好处,或者我是否可以简单地删除自定义约束并添加 bean 验证注释?

我同意我们需要 ESAPI 提供的字符串规范化,但对于数字我有点怀疑。

Are there any added benefits for using the ESAPI library or can I simply remove the custom constraint and add the bean validation annotations?

简而言之,是的。如果您注意到对 #isValidInput you linked is whether to turn canonicalization 的调用中的最后一个参数打开或关闭。如果您的应用程序关闭了它,ESAPI 给您的唯一好处是将您的验证正则表达式外包给 validation.properties,如果出现产品问题,您可以更改值并重新启动服务器,从而节省应用程序构建和部署. JSR-303 将需要重新编译和部署。

但是,如果您启用了规范化,ESAPI 提供了我迄今为止在另一个 Java 安全库中未发现的功能,即检测给定 mixed encoding and multiple encoding 的能力输入字符串。从取证和事件响应的角度来看,这非常有用,因为我们可以实时判断我们的 Web 应用程序是否受到攻击,以及记录和审计有关执行攻击的用户的信息。

^^^你上次说的好像都知道了。我还没有看到没有为数字传递 Strings 的 Web 容器。我的猜测是你从 request.getParameter("foo"); 中提取它,这意味着它是一个字符串,你仍然需要规范化提供的防御。即使它可能在转换为 IntegerLong 时被解析异常捕获,there's also the risk of overflow or underflow 也可能以不同的方式扰乱您的应用程序。