JavaEE文件泄露与修复方案
在JavaEE应用中,文件泄露漏洞通常由路径遍历、不安全文件访问或配置缺陷引发。以下是常见原因、风险及修复方案:
常见泄露原因
路径遍历攻击
java
// 漏洞示例:用户可构造参数获取任意文件 String filePath = request.getParameter("file"); File file = new File("/baseDir/" + filePath); // 攻击者输入"../../../etc/passwd"
静态资源目录暴露敏感文件
将
WEB-INF
或META-INF
目录映射为静态资源。
错误信息泄露
异常堆栈暴露服务器路径(如
FileNotFoundException
显示完整路径)。
未授权文件下载
下载接口未校验用户权限或文件名合法性。
修复方案
1. 路径遍历防护
java
// 安全写法:规范路径并校验是否在允许目录内 String userInput = request.getParameter("file"); Path baseDir = Paths.get("/safe/baseDir").toAbsolutePath().normalize(); Path resolvedPath = baseDir.resolve(userInput).normalize();if (!resolvedPath.startsWith(baseDir)) {throw new SecurityException("非法路径访问"); } File file = resolvedPath.toFile();
2. 禁用敏感目录访问
web.xml 配置:禁止访问
WEB-INF
和META-INF
xml
<security-constraint><web-resource-collection><url-pattern>/WEB-INF/*</url-pattern><url-pattern>/META-INF/*</url-pattern></web-resource-collection><auth-constraint /> </security-constraint>
3. 文件下载安全控制
白名单校验文件名:
java
if (!fileName.matches("[a-zA-Z0-9_\\-]+\\.(jpg|pdf)")) {response.sendError(400, "非法文件名");return; }
权限校验:
java
if (!user.hasPermission(fileName)) {response.sendError(403, "无访问权限"); }
4. 错误信息处理
全局异常处理器屏蔽敏感信息:
java
@WebServlet("/error-handler") public class ErrorHandler extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp) {Throwable ex = (Throwable) req.getAttribute("javax.servlet.error.exception");resp.sendRedirect("/generic-error.html"); // 跳转到通用错误页} }
在
web.xml
中配置:xml
<error-page><exception-type>java.lang.Throwable</exception-type><location>/error-handler</location> </error-page>
5. 服务器加固
文件存储隔离:将用户上传文件存储到独立目录(如
/data/uploads
),禁止放在Web应用目录内。最小权限原则:运行容器的系统用户仅授予必要目录的读/写权限。
安全扫描:使用工具(如 OWASP ZAP、Fortify)定期扫描路径遍历漏洞。
6. 安全编码规范
避免直接拼接用户输入的文件路径,使用
Path.normalize()
消除../
。对下载文件名进行RFC 5987编码,防止XSS:
java
String safeFileName = "filename=\"" + fileName.replace("\"", "") + "\""; String encodedFileName = "filename*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8"); response.setHeader("Content-Disposition", "attachment; " + safeFileName + "; " + encodedFileName);
防御多层架构
层级 | 防护措施 |
---|---|
前端 | 文件名白名单校验(JS二次验证) |
网关 | WAF拦截 ../ 、%2e%2e/ 等攻击 |
应用层 | 路径规范化+目录权限校验 |
存储层 | 文件独立存储+最小权限 |
容器 | 配置安全约束(web.xml) |
测试验证
尝试访问
http://host/download?file=../../WEB-INF/web.xml
。使用工具检测目录遍历(如 Burp Suite Intruder)。
检查错误页面是否暴露路径信息。
通过以上措施,可显著降低JavaEE应用文件泄露风险。核心原则:永不信任用户输入,强制路径校验,最小化权限暴露。