kkFileView二次开发记录

lishihuan大约 5 分钟

kkFileView二次开发记录

项目基本介绍

  • IndexController 是首页,但是上线前是不能放开的,因为存在安全问题
  • application.properties 项目配置文件,目前二次开发主要是 设置 trust.hostssrf.trusted_domains IP白名单设置 -- 注意上线去掉 127.0.0.1,test.local.com 调试ip

1. 域名下多级路径无法正常预览

指定 baseUrl 来解决域名下多级路径无法正常访问问题

通过优化 server/src/main/java/cn/keking/web/filter/BaseUrlFilter.java 实现的

http://127.0.0.1:8012/onlinePreview?url=aHR0cDovL3Nnd3BkbS5haC5zZ2NjLmNvbS&baseUrl=http://127.0.0.1:8012

场景描述:

  • 我的本机 设置一个域名 test.local.com 【【通过在 hosts 配置从而实现这个域名解析】

    • 在hosts文件中 C:\Windows\System32\drivers\etc\hosts
    • 添加127.0.0.1 test.local.com
  • 其中文件 地址http://localhost:8012/demo/测试001.xlsx ----> http://test.local.com/kkfview/onlineView/demo/测试001.xlsx

  • 本地nginx 配置 【因为需要模拟二级域名】

    因为需要模拟二级域名,所以由我的nginx转发到测试库的nginx,然后转发回来

    监听80端口,转发到测试库的nginx

    	server {
    		listen       80;
    		server_name  test.local.com;
    		location /kkfview/ {
                root   html;
                index  index.html index.htm;
    			proxy_pass http://192.168.2.231:8500/; #转发到测试库,再由测试库转发回来
            }
         }
    
  • 测试服务的nginx配置

    	server {
    		listen       8500;
    		server_name  localhost;
    		location /onlineView/ {
        			proxy_pass http://192.168.2.33:8012/;
               	}
         }
    
  • 访问地址

    这时访问,如果不指定baseUrl ,则会导致无法正常加载,目前这个版本提示跨域【之前是加载的url地址不对,一直加载中】

    http://test.local.com/kkfview/onlineView/onlinePreview?url=aHR0cDovL3Rlc3QubG9jYWwuY29tL2trZnZpZXcvb25saW5lVmlldy9kZW1vLyVFNiVCNSU4QiVFOCVBRiU5NTAwMS54bHN4&baseUrl=http://test.local.com/kkfview/onlineView
    

2. AXSS、SSRF漏洞解决

  • IndexController.java 中注释掉全部

  • 限制文件上传格式

    #禁止上传类型
    prohibit = ${KK_PROHIBIT:html,htm,js,css,php,asp,aspx,jsp,jspx,py,rb,pl,cgi,exe,dll,com,bat,sh,cmd,msi,jar,vbs,wsf,wsh,ps1,class,pyc,pyo,xsl,xslt,svg,swf,chm,hta,mht,mhtml,properties,yml,yaml,ini,env,conf,config,json,db,sqlite,sql}
    
    
  • 限制文件地址白名单【 设置的是信任的文件位置,也即是文件url地址】

    trust.host = 101.138.55.107,101.138.55.116,192.168.2.231
    
  • 设置 请求白名单

    # 请求白名单
    ssrf.trusted_domains= 101.138.55.107,101.138.55.116,192.168.2.231
    
  • 生成环境最好关闭对外端口

3. 部署到docker

目前构建镜像需要用到 ycsrc/kkfileview-base:4.4.0 网上经常无法下载资源, 最好离线部署 kkfileview-base-4.4.0.tar

注: 打包前如果修改了源码,需要 对项目先进行编译,clean、install 重新生成新的jar包

3.1 离线部署

通过idea 构建好镜像,然后从docker中打包为zip到服务器上执行

  • 先打开 Docker Desktop

  • 执行根目录下的Dockerfile 文件

image-20250524135401119
image-20250524135401119
  • Docker Desktop 中就能看到这个镜像

  • 指定一个文件夹,打包tar 压缩文件【通过下面的命令将,镜像打包到当前文件夹】-- 可以理解为下载镜像离线文件

    docker save -o kkfileview-4.4.0.tar kkfileview-4.4.0:latest
    
  • 然后通过离线部署镜像/容器 【进入到目标服务器指定一个文件夹,将镜像文件放入,然后执行下面的命令,将镜像tar部署到docker容器中】

    # load镜像tar包到服务器
    docker load -i kkfileview-4.4.0.tar
    # 部署到docker容器
    docker run -m 2048m --restart always -d -p 8012:8012 kkfileview-4.4.0 
    

3.2 通过Dockerfile直接部署

  • mavn 中 cleaninstall 拿到 server/target/kkFileView-4.4.0.tar.gz

  • 拷贝根目录下的 Dockerfile 文件

  • 服务器上创建 文件夹 mkdir /home/kkFileView

  • 将上面的2个文件放到kkFileView 文件夹中,执行Dockerfile 文件

    docker build -t kkfileview-4.4.0 .
    

    通过 docker images 查询是否镜像部署成功

  • 部署到容器

    docker run -m 2048m --restart always -d -p 8012:8012 kkfileview-4.4.0 
    
  • 这里可能会失败,因为前面删除过 残留网络配置

    这时候最好删除掉刚刚创建的 kkfileview 容器,重新执行

    [root@k8s-master kkFileView]# systemctl stop docker
    [root@k8s-master kkFileView]# systemctl start docker
    [root@k8s-master kkFileView]# docker run -m 2048m --restart always -d -p 8012:8012 kkfileview-4.4.0
    

3.3 如果是再次安装需要先移除容器,才能重新安装

# 查看当前运行的kkfileview容器(获取容器ID或名称)
docker ps | grep kkfileview

# 停止容器(替换<容器ID/名称>为实际值,如kkfileview_container)
docker stop <容器ID/名称>

# 删除容器(彻底清理旧实例)
docker rm <容器ID/名称>


# 查看所有kkfileview镜像
docker images | grep kkfileview
# 删除镜像
docker rmi <旧镜像ID/标签>

如果是再自己电脑中操作Dockerfile 来打包离线镜像,则 最好也删除本机 Docker Desktop 中的这个镜像【若新镜像与旧镜像标签相同】,防止不能正常覆盖

4. 其他

4.1 离线安装

  • 安装 kkfileview-base 镜像-这个是为了安装kkfileview 需要的基础镜像
# 1. 下载
docker pull ycsrc/kkfileview-base:4.4.0

# 2. 将docker中的kkfileview-base:4.4.0 打离线包、得到 kkfileview-base-4.4.0.tar 【离线tar】
docker save -o kkfileview-base-4.4.0.tar ycsrc/kkfileview-base:4.4.0

# 3. 将kkfileview-base-4.4.0.tar 上传都指定服务器的位置【部署镜像】
docker load -i kkfileview-base-4.4.0.tar
  • kkfileview-4.4.0 部署
# 1. 将镜像打包
docker save -o kkfileview-4.4.0.tar kkfileview-4.4.0:latest
# 2. 部署镜像
docker load -i kkfileview-4.4.0.tar
# 3. 部署到docker容器
docker run -m 2048m --restart always -d -p 8012:8012 kkfileview-4.4.0 

4.2 docker 镜像端口不受防火墙控制

Docker 容器未在防火墙 (firewalld) 中显式放行端口却仍可访问,原因是Docker 默认绕过防火墙规则

解决方案:

  • 检查是否存在/etc/docker/daemon.json 如果没有创建
  • daemon.json中添加 "iptables": false
  • 重启docker systemctl restart docker
# 如果需要放开8012端口
firewall-cmd --zone=public --add-port=8012/tcp --permanent
systemctl restart firewalld.service

# 删除8012
firewall-cmd --zone=public --remove-port=8012/tcp --permanent
systemctl restart firewalld.service

4.3 开发注意

  • 目前控制了ip白名单,如果个人需要调试,请修改 配置文件 server/src/main/config/application.properties 下面的2个属性,添加自己的ip即可

    • trust.host 限制文件的url的白名单
    • ssrf.trusted_domains 限制url的白名单的
  • 调试完成后,请检查下面2个人地方