一、问题描述
路径遍历是指应用程序接收了未经合理校验的用户参数用于进行与文件读取查看相关操作,而该参数包含了特殊的字符(例如“..”和“/”),使用了这类特殊字符可以摆脱受保护的限制,越权访问一些受保护的文件、目录或者覆盖敏感数据。
路径遍历利用应用程序的特殊符号(“~/”,“../”)可以进行目录回溯,从而使攻击者越权访问或者覆盖敏感数据,如网站的配置文件、系统的核心文件等。
二、问题避免
(1)程序对非受信的用户输入数据净化,对网站用户提交过来的文件名进行硬编码或者统一编码,过滤非法字符。
(2)对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。
(3)合理配置 web 服务器的目录权限。
三、修复方法
1、对需要下载的文件,存储路径信息的数据库,后台接口返回对应的id和文件名称,提供的下载接口入参为文件id,根据前端传来的id查数据库获取文件路径进行下载。而不是直接将文件路径输出在前端页面
2、对于根据文件名称下载的接口,对入参进行特殊符号过滤,可使用以下方法:
public static String filter(String data) {
Pattern pattern = Pattern.compile("[\\s\\\\/:\\*\\?\\\"<>\\|]");
Matcher matcher = pattern.matcher(data);
data = matcher.replaceAll("");
return data;
}