我们经常会开发了一个下载功能,具体实现就是后台实现一个下载方法,接收一个带有路径的文件名参数,再通过流将对应的文件返回给客户端。但是这种方式潜在一个安全漏洞——通过修改这个文件名参数的值,可以下载操作系统中当前账号有权访问的任意文件。极有可能造成操作系统内核文件被修改,操作系统密码泄露,web应用文件被修改,WEB应用挂马等多种安全事件。
如何防止下载任意文件呢?
一、限制下载文件的扩展名
二、限制下载文件所在的路径
三、防止目录回溯
四、动态校验码
根据待下载文件,生成MD5摘要或者其他动态验证码算法并将动态校验码融合到下载链接中,客户端浏览器提交下载请求时,再次校验动态验证码。
如何防止下载任意文件呢?
一、限制下载文件的扩展名
String fileName= request.getParameter("fileName");
if(!fileName.endWith(".doc")){
return null;
}
二、限制下载文件所在的路径
String filePath= fileName.substring(0,fileName.lastIndexOf('\\'));
if(!filePath.startWith("/download")){
return null;
}
三、防止目录回溯
if(filePath.contains("\\..")){
return null;
}
四、动态校验码
根据待下载文件,生成MD5摘要或者其他动态验证码算法并将动态校验码融合到下载链接中,客户端浏览器提交下载请求时,再次校验动态验证码。
String md5Code=MD5(file);
http://xxx/download/?fileName=/download/a.doc&code=dgaq2342rjwioafqwewf
String requestCode = request.getParameter("code");
if(code.equals(md5Code)){
download();
}