我们碰巧使用IBM appscan http://www-01.ibm.com/software/awdtools/appscan/
针对我们的java代码库,它返回了大约3000个高严重性漏洞。
它们中的大多数恰好是系统信息泄漏,它认为当我们在catch块中打印堆栈跟踪时会发生这种情况,但是我们只打印它正在发生的文件名和行号,这使我们能够更好地调试代码。
有些是关于SQL注入,输入验证等。
但是,我的问题是关于资源耗尽(文件描述符,磁盘空间,套接字......),它列出了java.io.BufferedReader.readLine
的所有实例作为可能的外部攻击的地方。
InputStream ins=conn.getInputStream();
String inputLine;
if (!preserveLinefeeds) {
BufferedReader in = new BufferedReader(new InputStreamReader(ins));
while ((inputLine = in.readLine()) != null)
pr.readThreadResponse+=inputLine;
in.close();
ins.close();
}
conn是一个HttpURLConnection对象。
如何在代码中添加safegaurds来防止这种情况?
答案 0 :(得分:5)
如果AppScan指示与readLine关联的拒绝服务漏洞,则可能不是由于对关闭流失败的任何担忧(无论这可能是多么重要),而是由于readLine的无限性质。由于readLine继续读取输入,直到读取换行符或CR-LF,如果输入源不受信任,则可能会在没有预期CR-LF的情况下输入非常大量的数据,从而导致内存耗尽情况。 / p>
要解决此问题,您可以确保(通过应用程序以外的机制)输入大小限制为安全合理(尽管AppScan,Fortify和其他工具将继续抱怨readLine),或者更好的是,你可以使用有界读取例程替换readLines,该例程设置将被读入缓冲区的字符数的绝对最大值。
答案 1 :(得分:2)
每次打开流时,请确保finally块在完成后关闭流。
如果在从代码中的流中读取时抛出IOException,则流将不会被关闭,因此警告
Java 7通过try with resources构造简化了这一过程。在java 6或更早版本中,您需要复制许多样板文件,例如
InputStream ins = null;
try {
ins = conn.getInputStream();
...
} finally {
IOUtils.closeQuietly(ins);
}
使用Apache Commons的IOUtils类
如果您不想添加依赖项
,可以编写自己的closeQuietly