安全组觉得我们文件下载不够安全。给了份修复方案
1、净化数据:对用户传过来的文件名参数进行硬编码或统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。
2、web应用程序可以使用chroot环境包含被访问的web目录,或者使用绝对路径+参数来访问文件目录,时使其即使越权也在访问目录之内。www目录就是一个chroot应用. 由chroot创造出的那个根目录,叫做“chroot监狱”(所谓"监狱"就是指通过chroot机制来更改某个进程所能看到的根目录,即将某进程限制在指定目录中,保证该进程只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全,详细具体chroot的用法,可参考:http://blog.csdn.net/frozen_fish/article/details/2244870
3、任意文件下载漏洞也有可能是web所采用的中间件的版本低而导致问题的产生,例如ibm的websphere的任意文件下载漏洞,需更新其中间件的版本可修复。
4、要下载的文件地址保存至数据库中。
5、文件路径保存至数据库,让用户提交文件对应ID下载文件。
6、用户下载文件之前需要进行权限判断。
7、文件放在web无法直接访问的目录下。
8、不允许提供目录遍历服务。
9、公开文件可放置在web应用程序下载目录中通过链接进行下载。
简单来说:
解决方案一,
将文件路径存在数据库中,每次下载时传输文件id,通过数据库存储的文件权限判断用户有无下载权限。
然后通过文件id获取具体的文件路径进行下载。
解决方案二,
先对文件名utf-8编码,检查特殊字符,校验用户权限
String tf8Filename = null;
try {
tf8Filename = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new AppException("文件名编码异常");
}
Pattern pattern = Pattern.compile("\.\.|[\\/