Java SV.DOS.ARRSIZE:未验证的用户输入“sigFileInputStream.available()”在Klocwork中,用于以下行

Java SV.DOS.ARRSIZE:未验证的用户输入“sigFileInputStream.available()”在Klocwork中,用于以下行,java,inputstream,fileinputstream,klocwork,Java,Inputstream,Fileinputstream,Klocwork,我正在使用klocwok检查我的代码。 对于给定的代码行: byte sigToVerify = new byte[sigFileInputStream.available()]; 我收到以下错误报告: SV.DOS.ARRSIZE:未验证的用户输入 sigFileInputStream.exe可用于阵列大小-攻击者可以 指定一个导致服务器上资源使用率高的大数字 和拒绝服务攻击 请帮我解决这个问题。如果没有更多的代码片段,我认为Klocwork在这里报告了一个有效的问题。您应该查看为检查器提供

我正在使用klocwok检查我的代码。 对于给定的代码行:

byte sigToVerify = new byte[sigFileInputStream.available()];
我收到以下错误报告:

SV.DOS.ARRSIZE:未验证的用户输入 sigFileInputStream.exe可用于阵列大小-攻击者可以 指定一个导致服务器上资源使用率高的大数字 和拒绝服务攻击


请帮我解决这个问题。

如果没有更多的代码片段,我认为Klocwork在这里报告了一个有效的问题。您应该查看为检查器提供的文档,这解释了报告此情况的原因。关于脆弱性和风险:

使用来自应用程序外部的数据之前必须进行验证 由应用程序使用。如果此数据用于分配 对象中,数据的内容必须密切相关 选中的。攻击者可以利用此漏洞强制执行攻击 分配大量对象的应用程序,导致 应用程序服务器上的资源使用情况以及 拒绝服务DoS条件

关于缓解和预防:

通过以下方法可以防止来自用户输入的DoS攻击: 验证应用程序用户输入之外的任何和所有输入, 文件输入、系统参数等。。验证应包括长度 和内容。。。还应检查用于分配的数据是否正确 合理的值,假设用户输入可能包含非常小的 或非常大的值

即使FileInputStream是其子类的Java文档也警告说,使用可用方法的返回值是个坏主意:

注意,虽然InputStream的一些实现将返回 流中的总字节数,许多字节不会。从来都不是 更正以使用此方法的返回值分配缓冲区 用于保存此流中的所有数据

如何修复代码以避免出现这种情况的一个示例是,如上所述,在使用available返回的值分配数组之前,验证该值:

int buffSize = sigFileInputStream.available();
if (buffSize > 0 && buffSize < 100000000) { // 100MB
  byte sigToVerify = new byte[buffSize];
  // do something with sigToVerify ...
} else {
  // error
}
请注意,用于sigToVerify的100000000或100MB对于您的目的来说可能仍然太大,或者太小。您应该根据您的代码试图实现的目标来确定在这里使用的最合理的值