2种安全下载的方案

来源:互联网 发布:手机阿里和淘宝的区别 编辑:程序博客网 时间:2024/05/19 03:22

系统后台提供恢复文件的下载,原本是放在一个开放目录中,客户端可以直接下载

app.use('/svc/public', express.static(__dirname + '/../public'));

但是这样没有鉴权,不安全,用户A只要知道另一个用户的企业ID,就可以下载到他的恢复文件。另外整个下载过程没有经过程序的干预,也不利于后续做一些统计方面的工作

改造为下载需要先经过后台的服务,具体有2种做法:

node读取文件,将流写到response中

用express很容易实现:

function doDownload(req, res, next) {    var enterpriseId = req.params["enterpriseId"];    var absolutePath = resolvePath(enterpriseId);    res.download(absolutePath, "resume.zip", function(err){        if(err){            logger.error("download fail: " + err);        }    });}function resolvePath(enterpriseId) {    var filePath =  FRAMEWORKPATH + "/../public/mobile/backup/" + enterpriseId + ".zip";    return path.resolve(filePath);}

上面的public目录已经不再向外部开放,只能由node读取文件的内容,通过响应写给客户端

拷贝临时文件,下载完成后即删除

服务端收到下载的请求后,先生成一个随机的文件名,并将目标文件拷贝到一个开放的目录中,然后将临时文件的URL作为响应给到客户端

客户端到这个开放目录下载,下载完成之后,服务端就把临时文件删除

从性能角度来说,或许第二种方式是更好的,node的负担比较轻,只需要返回临时文件的路径。下载通过nginx就可以完成了

0 0
原创粉丝点击