【发布时间】:2016-08-17 14:43:59
【问题描述】:
我用的是Tomcat8/Java
我目前允许从服务器下载敏感的用户生成的 Excel 文件(用 Java/POI 创建),方法是创建一个带有 GUID 的文件名,然后将其保存在公开可用的目录中,并提供此文件的链接.
第一阶段
用户选择各种参数,JSP 将这些参数发送到 Java 文件中
String fileName = "excelFiles/"
+ myReports
.createExcel(listCompanyDetails);
public static String createExcel(List listCompanyDetails) {
String fileName = "MyFile"+UUID.randomUUID() + ".xls";
String fileFullPath="\..."+fileName;
FileInputStream inputStream = new FileInputStream(new File(APPCodeTable.templateExcelFile));
Workbook wb=new HSSFWorkbook(inputStream);
FileOutputStream out = new FileOutputStream(fileFullPath);
wb.write(out);
out.close();
}
第 2 阶段
JSP 然后在 iFrame 中显示文件
<iframe id="target_upload" name="target_upload" width="100%"
src="<%=fileName%>" height="100%"></iframe>
在我们的系统上完成的渗透测试结果表明,我们应该改为从 jsp 文件以流的形式生成文件,这样会更安全,因为它可以避免使用 GUID,并且可以避免使用直接链接到将绕过登录授权的文件。
然而,使用 servlet 似乎是更好的编码实践。例如Implementing a simple file download servlet。
我正在考虑将文档保存在服务器上,由 GUID 标识,然后将此 GUID 传递给 servlet。然而,这似乎违背了我提高安全性的初衷。
如果我实现了一个简单的下载 servlet(如附加链接中所示),我如何才能在该 servlet 中获取我创建的文件?
【问题讨论】:
-
简单地通过 servlet 流式传输似乎并不能解决任何安全问题——尤其是因为通过 Tomcat 提供的静态资源已经由 servlet(catalina DefaultServlet)提供。因此,回答这个问题需要更好地了解安全发现的实际内容(与发现提出的解决方案相比)
-
我稍微更新了关于安全问题的问题
-
“但是我仍然需要将文档保存在服务器上”....这个陈述不一定是真的(或者它为什么是真的背后的原因还不清楚)。如果您实际上是“即时”生成 XLSX(即由 HttpServletRequest 触发),那么您无需将 Workbook 写入 FileOutputStream,而是将其写入 HttpServletResponse 的 outputStream。例如new Workbook().write(httpServletResponse.getOutputStream()) 还有比这更多的东西,但是如果这种方法看起来可行,我会以答案的形式写出详细信息
-
谢谢@jamey graham。我重写了我的问题,以便让您了解您建议的方法在我的特定情况下是否可行......