kekingcn / kkFileView

Universal File Online Preview Project based on Spring-Boot
https://kkview.cn
10.73k stars 2.73k forks source link

kkFileView安全性问题 #369

Open 1506085843 opened 2 years ago

1506085843 commented 2 years ago

假如预览地址是:

http://ip地址:8012/onlinePreview?url=aHR0cDovLzEyNy4wLjAuMTo4MDgwL2ZpbGUvdGVzdC50eHQ%3D](https://gitee.com/link?target=http%3A%2F%2Fip%25E5%259C%25B0%25E5%259D%2580%3A8012%2FonlinePreview%3Furl%3DaHR0cDovLzEyNy4wLjAuMTo4MDgwL2ZpbGUvdGVzdC50eHQ%253D

集成到项目时,对于一些敏感隐私文件,如果想做到登录后才能预览怎么解决?kkFileView只是通过上面的url来预览,那么如果该链接复制给其他人,其他人也能预览了。

liyanggyang commented 2 years ago

kkFileView生成的url,你自行更换IP地址和端口,然后通过nginx转发,nginx转发之前进行配置 auth_request 模块鉴权。

jasonfong11 commented 12 months ago

kkFileView生成的url,你自行更换IP地址和端口,然后通过nginx转发,nginx转发之前进行配置 auth_request 模块鉴权。

不行啊,onlinePreview还会调用一些js请求,这些请求还会重新进入auth_request鉴权,而且参数也无法携带,导致无法进行鉴权

1506085843 commented 11 months ago

可以在链接中加入token以及时间戳等参数,代码示例如下:

<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/js-base64@3.6.0/base64.min.js"></script>

//假设你项目的后端文件接口是 http://127.0.0.1:8080/filedownload 该接口返回文件流,并且假设该接口接受fileId 参数
var originUrl = 'http://127.0.0.1:8080/filedownload?fileId=1'; //要预览文件的访问地址,该接口返回文件流
var previewUrl = originUrl + '&fullfilename=test.txt'//fullfilename是必须的,有了该参数kkFileView才知道文件名是什么
//kkFileView 的 onlinePreview 接口就会拿着参数去请求 http://127.0.0.1:8080/filedownload 接口,把文件下载到安装目录的 file/demo 文件夹下,然后转换后把预览界面展示到浏览器。
window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(previewUrl)));

可参考这篇文章:kkFileView安装及使用——文件预览解决方案

jasonfong11 commented 11 months ago

可以在链接中加入token以及时间戳等参数,代码示例如下:

<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/js-base64@3.6.0/base64.min.js"></script>

//假设你项目的后端文件接口是 http://127.0.0.1:8080/filedownload 该接口返回文件流,并且假设该接口接受fileId 参数
var originUrl = 'http://127.0.0.1:8080/filedownload?fileId=1'; //要预览文件的访问地址,该接口返回文件流
var previewUrl = originUrl + '&fullfilename=test.txt'//fullfilename是必须的,有了该参数kkFileView才知道文件名是什么
//kkFileView 的 onlinePreview 接口就会拿着参数去请求 http://127.0.0.1:8080/filedownload 接口,把文件下载到安装目录的 file/demo 文件夹下,然后转换后把预览界面展示到浏览器。
window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(previewUrl)));

可参考这篇文章:kkFileView安装及使用——文件预览解决方案

这个是可以通过文件流下载的方式鉴权,但是我还是遇到了一个问题,就是你第一次接口通过鉴权后,kkfileview下载了文件到/file文件夹里,当你这个接口过期了,然而请求的fullfilename还是同一个文件名称,那么kkfileview依旧是可以打开这份文件,因为在/file内,这份文件是还存在的,只有你更改了fullfilename,才会去重新调用接口获取文件流 我自己的解决办法是,接口返回随机的文件名称,以及对应的key,fullfilename使用随机的文件名称+文件类型,key用来鉴权,这样虽然会重复产生很多文件,但是算是暂时实现了鉴权,可以在配置文件中,配置清除文件task的cron表达式

jasonfong11 commented 11 months ago

之前还看到一个叫高雄修改版的kkfileview,那个好像可以修改属性,及时更新文件