安全检测之Directory traversal in Spring framework

本文解决Spring MVC中静态文件如CSS、JS等访问问题。原配置导致mapping失效,通过使用<mvc:default-servlet-handler/>交由默认servlet处理解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Directory traversal in Spring framework

提示CSS、JS 等静态文件有问题需要提升Spring的版本问题,根据官方问题解释4.1.x必须升级到4.1.2及以上版本,但是升级无效。

安全检测问题图片


查看Spring MVC的xml配置,发现静态资源配置方案有问题。
原代码写法如下:

<mvc:resources mapping="/common/**" location="/common/" cache-period="31536000" />
<mvc:resources mapping="/static/**" location="/static/" cache-period="31536000" />

解决方案:

对静态资源文件的访问, 将无法mapping到Controller的path交给default servlet handler处理
<mvc:default-servlet-handler />

在若依框架(RuoYi Framework)中实现文件下载功能,通常涉及后端控制器的接口设计、文件流的处理以及前端页面的调用逻辑。以下是具体的实现步骤和示例代码。 ### 后端实现 #### 1. 创建文件下载接口 在控制器类中添加一个方法,用于处理文件下载请求。该方法需要读取服务器上的文件,并通过 `HttpServletResponse` 将文件内容以流的形式返回给客户端。 ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; @RestController @RequestMapping("/file") public class FileDownloadController { @GetMapping("/download") public void downloadFile(HttpServletResponse response) { String filePath = "/path/to/your/file.txt"; // 文件在服务器上的实际路径 File file = new File(filePath); if (!file.exists()) { try { response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found"); } catch (IOException e) { e.printStackTrace(); } return; } response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); try (FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { os.write(buffer, 2, bytesRead); } } catch (Exception e) { e.printStackTrace(); } } } ``` #### 2. 配置文件存储路径 确保在应用配置文件(如 `application.yml` 或 `application.properties`)中设置文件存储路径,或者直接硬编码在代码中。推荐使用配置方式以便灵活调整: ```yaml file: upload-dir: /path/to/upload/directory ``` 然后可以通过 `@Value` 注入配置值: ```java @Value("${file.upload-dir}") private String uploadDir; ``` ### 前端实现 在 Vue.js 中,可以通过 `axios` 发起 GET 请求并触发浏览器下载行为。需要注意的是,`axios` 默认会将响应数据解析为 JSON,因此需要设置 `responseType: 'blob'` 来正确接收二进制文件流。 ```javascript export default { methods: { async downloadFile() { try { const response = await axios.get('/file/download', { responseType: 'blob' // 必须设置为 blob 类型以接收文件流 }); const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'file.txt'); // 设置下载文件名 document.body.appendChild(link); link.click(); link.remove(); } catch (error) { console.error('文件下载失败:', error); } } } } ``` ### 安全性考虑 - **权限控制**:确保只有授权用户才能访问特定文件。 - **路径校验**:防止路径穿越攻击(Path Traversal),例如用户输入 `../../etc/passwd`。 - **文件类型限制**:限制可下载的文件类型,避免敏感文件被下载。 - **日志记录**:记录文件下载行为,便于审计与追踪。 ### 跨域问题处理 如果前端与后端部署在不同的域名或端口上,可能会遇到跨域问题。可以在 Spring Boot 应用中启用全局 CORS 支持: ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/file/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*"); } } ``` ### 总结 以上步骤展示了如何在若依框架中实现文件下载功能。从后端的文件流处理到前端的下载触发机制,均提供了完整的实现方案,并结合了安全性建议和跨域问题的解决策略。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值