我正在使用klocwok来审查我的代码。对于给定的代码行:
byte sigToVerify = new byte[sigFileInputStream.available()];
我收到以下错误报告:
SV.DOS。ARRSIZE:未经验证的用户输入
sigFileInputStream.available()
用于数组大小 - 攻击者可以 指定导致服务器上资源使用率较高的大量数字 和 DOS 攻击
请帮我解决这个问题。
如果没有更多的代码片段可以继续,我认为 Klocwork 在这里报告了一个有效的问题。您应该查看为 SV 提供的文档。DOS。ARRSIZE 检查器,它解释了为什么会报告这种情况。关于漏洞和风险:
在验证应用程序外部数据的使用之前 由应用程序使用。如果此数据用于分配数组 对象在应用程序中,数据的内容必须紧密 检查。攻击者可以利用此漏洞强制 应用程序分配非常大量的对象,导致高 应用程序服务器上的资源使用情况以及 拒绝服务 (DoS( 条件。
关于缓解和预防:
防止来自用户输入的 DoS 攻击可以通过以下方法实现 验证来自应用程序外部的任何和所有输入(用户输入、 文件输入、系统参数等(。验证应包括长度 和内容。...还应检查用于分配的数据 合理的值,假设用户输入可能包含非常小的值 或非常大的值。
甚至 Java InputStream API 文档(FileInputStream 是其中的子类(也警告说,使用 available()
方法的返回值是一个坏主意:
请注意,虽然 InputStream 的某些实现将返回 流中的总字节数,许多不会。它永远不会 更正后使用此方法的返回值分配缓冲区 旨在保存此流中的所有数据。
如何修复代码以避免这种情况的一个示例是,如上所述,在使用 available()
分配数组之前验证 返回的值:
int buffSize = sigFileInputStream.available();
if (buffSize > 0 && buffSize < 100000000) { // 100MB
byte sigToVerify = new byte[buffSize];
// do something with sigToVerify ...
} else {
// error
}
请注意,100000000 或 100MB sigToVerify
对于您的目的来说可能仍然太大,或者可能太小。 您应该根据代码尝试完成的内容确定要在此处使用的最合理的值。