CKEditor与CKFinder学习--安全的使用CKFinder与权限控制

article/2025/9/16 8:37:45

0 前言

上一篇博客中说了ckeditor与ckfinder整合之后进行图文混排的时候通过浏览服务器按钮可以浏览服务器上的所有资源,文件,图片,该用户上传的,非该用户上传的,不仅可以查看,还可以删除、重命名等。所以不是很安全。

这里写图片描述

这里写图片描述

上一篇博客介绍了一种方法就是直接屏蔽掉浏览服务器的按钮,这样用户就只能上传,通过上传后再引用。不过尽管把按钮屏蔽了,但是链接的路径依然存在。
通过访问
http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html
用户依然可以访问到文件浏览的页面

这里写图片描述
所以本文的第一个就是介绍如何不让用户访问http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html页面。
不让用户访问上面的页面,可以有很多种方法,可以参考之前的Shiro进行拦截,然而本文今天介绍使用SpringMVC的拦截器对其进行拦截。

1 通过拦截器阻止直接访问

1.1 定义拦截器

实现HandlerInterceptor接口

package com.gwc.cktest.intercepter;import java.util.Enumeration;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;public class CkfinderInterceepter implements HandlerInterceptor {private static final Log logger = LogFactory.getLog(CkfinderInterceepter.class);@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {logger.info("==========走到了 afterCompletion() 方法");}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView model)throws Exception {logger.info("==========走到了 postHandle() 方法");}// 返回值,表示我们是否需要将当前的请求拦截下来// 如果返回false,请求将被终止,如果为true,请求将被放行// Object arg2 表示的是被拦截的请求的目标对象@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {logger.info("==========走到了 preHandle() 方法"+"==========");logger.info("==========进行拦截==========");return false;}}

1.2 配置拦截器和拦截规则

在SpringMVC的配置文件中进行拦截器的配置和拦截规则的设定

    <mvc:interceptors><mvc:interceptor><!-- 拦截规则 --><mvc:mapping path="/**/ckfinder.html" /><!-- 拦截器 --><bean class="com.gwc.cktest.intercepter.CkfinderInterceepter"></bean></mvc:interceptor></mvc:interceptors>

因为我们需要拦截的是
http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html
所以我们的拦截规则设置为/**/ckfinder.html

1.3 效果

没有配置拦截器

这里写图片描述

配置拦截器之后

这里写图片描述

这种方式有点类似CSDN写博客了,只允许上传图片或者引用其他在线图片,不能浏览
这里写图片描述

2 细粒度的权限控制

细粒度的权限控制中,我们将不会全部拦截对http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html的请求,而是进行有条件的拦截,条件就是ckfinder权限中的角色session对应的key为CKFinder_UserRole,我们在拦截器中需要查看session中是否有有CKFinder_UserRole再决定放行与否。在用户登录的时候往session中写CKFinder_UserRole。
具体流程图如下。

这里写图片描述

先来配置资源访问的访问控制(ACL),这部分在ckfinder.xml中进行配置。

2.1 配置ckfinder.xml

首先阅读一下ckfinder的开发者文档
http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/Access_Control
它介绍了访问控制,主要是通过配置accessControls来控制用户的权限的

<!--
The session variable name that CKFinder must use to retrieve
the "role" of the current user. The "role", can be used in the "accessControls"
settings (bellow).
--><userRoleSessionVar>CKFinder_UserRole</userRoleSessionVar><accessControls><accessControl><role>*</role><resourceType>Images</resourceType><folder>/Logos</folder><folderView>true</folderView><folderCreate>true</folderCreate><folderRename>true</folderRename><folderDelete>true</folderDelete><fileView>true</fileView><fileUpload>false</fileUpload><fileRename>false</fileRename><fileDelete>false</fileDelete></accessControl></accessControls>

所有的权限都在accessControls标签中,具体的权限被配置在一个个accessControl中
其中第一个role标签代表的是角色,与其称作角色不如称为key为CKFinder_UserRole的session,在userRoleSessionVar可以配置。
你可以配置自己喜欢的session使其key为CKFinder_UserRole的value为你喜欢的任何字符串,不过最好能见名知意,*表示是所有的用户都可以访问。
其他标签也很好理解resourceType表示资源类型,以folder开头的是对文件夹的操作权限,以file开头的是对文的操作权限。

2.1.1 权限配置

现在我们配置两种权限,一个是admin,权限最大,什么权限都有,另一个是user权限,他只能查看根目录下的Images资源,而且对文件夹有只读操作和创建操作,对文件具有查看和上传操作。

    <userRoleSessionVar>CKFinder_UserRole</userRoleSessionVar><accessControls><accessControl><role>admin</role><resourceType>*</resourceType><folder>/</folder><folderView>true</folderView><folderCreate>true</folderCreate><folderRename>true</folderRename><folderDelete>true</folderDelete><fileView>true</fileView><fileUpload>true</fileUpload><fileRename>true</fileRename><fileDelete>true</fileDelete></accessControl><accessControl><role>user</role><resourceType>Images</resourceType><folder>/</folder><folderView>true</folderView><folderCreate>true</folderCreate><folderRename>false</folderRename><folderDelete>false</folderDelete><fileView>true</fileView><fileUpload>true</fileUpload><fileRename>false</fileRename><fileDelete>false</fileDelete></accessControl></accessControls>

2.2 拦截器实现

将上面的拦截器进行修改,只改preHandle方法,如果session中有CKFinder_UserRole则放行,否则拦截请求。

    // 返回值,表示我们是否需要将当前的请求拦截下来// 如果返回false,请求将被终止,如果为true,请求将被放行// Object arg2 表示的是被拦截的请求的目标对象@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {logger.info("==========走到了 preHandle() 方法"+"==========");HttpSession session = request.getSession();String user = (String) session.getAttribute("CKFinder_UserRole");if (StringUtils.isNotEmpty(user)) {logger.info("==========session中的CKFinder_UserRole:"+user+"==========");return true;}logger.info("==========session中没有CKFinder_UserRole进行拦截==========");return false;}

2.3 登录时写session

@RequestMapping(value = "/admin.html", method = RequestMethod.POST)@ResponseBodypublic String ckAdmin(HttpServletRequest request, String userId) {logger.info("==========" + userId + "登陆了" + "==========");HttpSession session=request.getSession();// 这里的逻辑很简单,如果是admin就将session中CKFinder_UserRole设为admin,其他的设置为userif (userId.equals("admin")) {session.setAttribute("CKFinder_UserRole", "admin");} else {session.setAttribute("CKFinder_UserRole", "user");}logger.info("==========" + "session 设置成功" + "==========");return "session 设置成功";}

退出时清空session

@RequestMapping(value = "/logout.html", method = RequestMethod.POST)@ResponseBodypublic String ckLogout(HttpServletRequest request) {HttpSession session = request.getSession();Enumeration<?> e = session.getAttributeNames();while (e.hasMoreElements()) {String sessionName = (String) e.nextElement();logger.info("==========存在的session有:" + sessionName + ":"+session.getAttribute(sessionName)+"==========");session.removeAttribute(sessionName);}logger.info("==========" + "session 移除成功" + "==========");return "session 移除成功";}

2.4 演示

2.4.1 没有session

当用户没有登录,也就是说session中还什么都没有的时候

这里写图片描述

用户通过浏览服务器什么也干不了

这里写图片描述

http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html也是无法访问的。

这是日志信息

这里写图片描述

2.4.2 session中CKFinder_UserRole为user

这里写图片描述

这个时候用户只能浏览,上传,不能删除照片,重命名照片

这里写图片描述

当然,通过http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html直接访问,用户只能看到Images文件夹,对文件夹也只能读和创建操作

这里写图片描述

2.4.3 session中CKFinder_UserRole为admin

这里写图片描述

这个时候用户可以进行所有的操作

这里写图片描述

当然,通过http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html直接访问可以看到其他的文件夹,且具有删除操作

这里写图片描述

ckfinder的安全使用就写到这里。

示例地址

https://github.com/peer44/ckeditor

参考文献

http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/Access_Control


http://chatgpt.dhexx.cn/article/JnYjBEV4.shtml

相关文章

CKEditor和CKFinder及CKEditor配置属性说明

最近在做一个新闻发布平台&#xff0c;放弃了很早的FCKEditor&#xff0c;使用CKEditor和CKFinder&#xff0c;尽管免费的CKFinder是Demo版本&#xff0c;但是功能完整&#xff0c;而且用户都是比较集中精神发新闻的人&#xff0c;不会在意这个。按照官网的document一步一步配置…

ckfinder--如何去掉版本提示This is the demo version of CKFinder

最近用到ckfinder作为文件管理集成到项目当中使用&#xff0c;但是发下从官网下载来的java版本的ckfinder插件&#xff0c;跑起项目起来发现提示信息This is the demo version of CKFinder&#xff0c;于是就在网上查找各种资料&#xff0c;有各种不同版本的解释&#xff0c;而…

CKFinder 介绍

<转载:http://baike.baidu.com/view/3565650.htm#1> CKFinder 简介 CKFinder是一个强大而易于使用的Web浏览器的Ajax文件管理器。 其简单的界面使得它直观&#xff0c;快速学习的各类用户&#xff0c;从高级人才到互联网初学者。 特点 文件夹树导航 &#xff1a;用户直…

CKEditor与CKFinder学习--整合SpringMVC

先来看一下效果 这个是我采用了office2013的皮肤&#xff0c;并对界面按钮做了优化后的效果 这个是bootstrap的皮肤&#xff0c;好了&#xff0c;开始进入正题。 第一步 下载 下载ckeditor和ckfinder ckeditor Full Package版本 http://download.cksource.com/CKEditor/CK…

CKEditor/CKFinder一些特殊配置

这几天把一个旧项目中的fckeditor升级为ckeditor 3.2 ckfinder 1.4.3 组合&#xff0c;下面是一些升级心得: 一、CKFinder的若干问题 1.单独使用ckfinder从原fckeditor分离出来以后可以单独使用&#xff0c;通常我习惯于在工具栏中添加ckfinder.dll&#xff0c;这样以后要使用…

ckfinder使用

ckeditor环境搭建 &#xff0c;请参考 JSP中使用CKEditor3.6入门教程 JSP页面使用富文本控件ckeditor提交表单数据 JSP页面使用富文本控件ckeditor自定义样式 JSP使用ckeditor和ckfinder实现富文本及上传功能 源码下载 一、下载 ckeditor下载地址为&#xff1a;http://ckedito…

ckeditor和ckfinder集成详细配置及其优化

1、下载文件目录结构分析 ckeditor和ckfinder的下载网址分别是&#xff1a; ckeditor&#xff1a;http://ckeditor.com/ ckfinder&#xff1a;http://cksource.com/ckfinder 下载下来后的目录结构&#xff1a; ckeditor&#xff1a; 精简&#xff1a; 1.samples文件夹&am…

CKEditor&ckfindtor

前言 之前的项目中一直使用的是FCKeditor&#xff0c;昨天突然有个想法&#xff1a;为什么不试一下新的CKEditor呢&#xff1f;于是花了大半天的时间去学习它的用法&#xff0c;现在把我的学习过程与大家分享一下。 谈起FCKeditor&#xff0c;相信没几个Web程序员不知道的吧。不…

在JSP里使用CKEditor和CKFinder

在JSP里使用CKEditor和CKFinder 最近在做一个新闻发布平台&#xff0c;放弃了很早的FCKEditor&#xff0c;使用CKEditor和CKFinder&#xff0c;尽管免费的CKFinder是Demo版本&#xff0c;但是功能完整&#xff0c;而且用户都是比较集中精神发新闻的人&#xff0c;不会在意这个。…

ckfinder2上传绕过漏洞

CKFinder 是国外一款非常流行的所见即所得文字编辑器,其1.4.3 asp.net版本存在任意文件上传漏洞,攻击者可以利用该漏洞上传任意文件。ckfinder2上传绕过漏洞, CKFinder在上传文件的时候,强制将文件名(不包括后缀)中点号等其他字符转为下划线_,但是在修改文件名时却没有任何…

Ckeditor5 整合Ckfinder3 防出错实战教程(二)整合篇

Ckeditor5 整合Ckfinder3 防出错实战教程&#xff08;二&#xff09;文件图片上传和管理 自从写了 Ckeditor5完全开发指南教程&#xff08;一&#xff09;后&#xff0c;很多码友都说不错&#xff0c;一直说更新呢&#xff0c;也没时间&#xff0c;慢慢忘了&#xff0c; 今天突…

思科路由器修改密码

第一步&#xff1a;重启路由器 #表示进度 &#xff0c;在60秒内切换到CLI&#xff0c;在重启之前完成ctrlc进入ROM模式&#xff08;窗口如下所示&#xff09; 第二步&#xff1a;自动重启路由器 输入 rommon1> confreg 0x2142 忽略NARAM中的配置文件 rommon2> reset 重…

没有一个绝对安全的系统 (二) 破解路由器后台密码

此教程只为分享&#xff0c;请勿用于其它用途 在学习黑客的道路&#xff0c;好难走啊&#xff0c;一堆乱七八糟的资料 还是翻墙出去学吧 有时间补一期 kali linux 破解 wifi 密码以及 使用 mac 破解wifi 的教程 破解路由器后台&#xff08;mac os&#xff09; 1. 安装 hy…

计算机网络实验如何设置无线路由器密码,怎么设置路由器密码 路由器设置密码方法【图文】...

随着互联网的不断发展&#xff0c;和智能手机的出现&#xff0c;连接电脑与手机的桥梁路由器诞生了&#xff0c;那么大家对路由器有多少了解呢?知道它是用来做什么的?其实路由器是连接因特网的一种设备&#xff0c;它可以把一些网络数据分发到智能手机上&#xff0c;让智能手…

获取路由器后台账号密码

获取路由器后台账号密码 偶然发现的路由器的漏洞 网站目录&#xff1a; 我是先分析他登陆按钮的事件 <input type"submit" name"login" class"button3" value"登录" onclick"return check();">return check(); &a…

华硕Android原始密码,华硕路由器默认密码是多少?ASUS路由器初始密码介绍

华硕路由器的默认初始密码是所有入手华硕路由器的伙伴们需要知道的&#xff0c;不知道华硕无线路由器默认密码是无法设置使用华硕路由器的&#xff0c;那么&#xff0c;华硕路由器默认密码是多少呢&#xff1f;对此&#xff0c;本文就为大家详细介绍华硕路由器初始密码&#xf…

无线路由器服务器密码忘记了怎么办,忘了路由器密码怎么进行ip设置

忘了路由器密码怎么进行ip设置 方法1 1点击屏幕右下角的网络连接的图标打开网络和共享中心。 2打开本地连接或无线网络连接。 3点击详细信息。 4里面的IPv4 默认网关 和 IPv4 DHCP 服务器 里的内容就是无线路由器的IP了 方法2 1还有一种方法也可以看到 而且很快捷。那就是利用c…

思科路由器重置密码的方法

#####重置前准备&#xff1a;通过反转线连接路由器的控口&#xff0c;保证电脑端与路由器能够正常交互。 ###第一步&#xff1a;物理重启路由器 也就是拨动路由器的电源开关 ###第二步&#xff1a;60s内在电脑端按住 Ctrlbreak/pause 进入以下窗口 第三步&#xff1a;输入…

利用CDLinux里面的水滴破解路由器密码的教程

工具: 1.CDLinux系统镜像(网上有很多,这里我提供一个我使用的:http://yunpan.cn/cFgIifL8s6zUF 访问密码 a0ef) 2.U盘一个,不需要很大。(可以使用虚拟机安装这个镜像文件,但是需要特定版本的外置无线网卡,但是如果安装在U盘就可以使用电脑自带的网卡,所以这里我讲解的…