CKEditor/CKFinder一些特殊配置

article/2025/9/16 9:06:54

这几天把一个旧项目中的fckeditor升级为ckeditor 3.2 + ckfinder 1.4.3 组合,下面是一些升级心得:

一、CKFinder的若干问题

1.单独使用
ckfinder从原fckeditor分离出来以后可以单独使用,通常我习惯于在工具栏中添加ckfinder.dll,这样以后要使用ckfinder直接从工具箱拖出来即可.
 
拖到页面中后,会形成这样一个控件实例:

csharp 代码
  1. <CKFinder:FileBrowser ID="FileBrowser1" runat="server"></CKFinder:FileBrowser>

2.上传文件自动重命名
修改ckfinder的源文件,找到Connector/CommandHandlers/FileUploadCommandHandler.cs这个文件,定位到:

csharp 代码
  1. string sExtension = System.IO.Path.GetExtension( oFile.FileName );
  2. sExtension = sExtension.TrimStart( '.' ); 

在下面加一行代码:

csharp 代码
  1. sFileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + sExtension;

即强制把文件名改为时间格式字符串.

 

3.上传安全问题

3.1 跟fckeditor类似,默认情况下ckfinder是不允许上传的,找到config.ascx这个文件,定位到

csharp 代码
  1. public override bool CheckAuthentication()  
  2.  {  
  3.    return false;  

在这里加入自己需要的判断逻辑,千万不要直接改成return true;这样相当于免费把自己的服务器变成一个网络硬盘+肉鸡,任何人都可以直接上传任何文件(包括木马),起码也得类似下面这样:

csharp 代码
  1. public override bool CheckAuthentication()  
  2. {
  3.     return HttpContext.Current.User.Identity.IsAuthenticated;

如果您是用membership/role来认证的,上面代码要求用户登录后才能使用ckfinder的上传功能.

 

3.2 文件扩展名校验

默认情况下,ckfinder几乎能上传任何文件,所以设置允许上传的文件扩展名是必需的,ckfinder采用了黑白名单的做法,即同时可以设置"允许上传的扩展名"及"禁止上传的扩展名",config.ascx中可参考下面这样设置:

csharp 代码
  1. ResourceType type;  
  2.  
  3. type = ResourceType.Add("Zip");  
  4. ...
  5. type.AllowedExtensions = new string[] { "zip" };  
  6. type.DeniedExtensions = new string[] {"asp","aspx","jsp","php","ashx","js","html","htm" };  
  7. ... 

这一段设置相当于只允许.zip文件上传,同时禁止.asp,.aspx...之类的服务端文件上传

 

3.3 MIME类型/ContentType校验

光有扩展名校验是远远不够的,比如在asp时代就有一种经典的攻击方式:

a.先把asp木马文件扩展名改成.jpeg之类(这样就能绕过扩展名检验)
b.然后利用其它发包工具(或直接用ckfinder的上传功能),上传"伪jpeg"文件
c.如果网站还支持html代码的留言(或产品编码,个人简介编辑等),写上这样一行代码<!--inlude file = "xxx.jpeg"-->

这里xxx.jpeg即上传后的"伪jpeg"木马,如果服务端允许包含文件的话,浏览包含这行代码的页面,木马就能运行了!

为了防止这类攻击,必须要在服务端做MIME/ContentType校验,因为文件的扩展名不管改成什么,其内在的MIME/ContentType是不会变的,修改方法:

定位到Settings/ResourceType.cs,找到

csharp 代码
  1. public string[] AllowedExtensions;
  2. public string[] DeniedExtensions; 

再增加二个数组

csharp 代码
  1. public string[] AllowedMIMETypes;
  2. public string[] DeniedMIMETypes; 

相应的构造函数也加初始化代码:

csharp 代码
  1. AllowedMIMETypes = new string[0];
  2. DeniedMIMETypes = new string[0]; 

然后再增加一个方法:

csharp 代码
  1. public bool CheckMIMEType(string mimeType)  
  2. {  
  3.    mimeType = mimeType.Trim().ToLower();  
  4.    if (DeniedMIMETypes.Length > 0)  
  5.    {  
  6.     if (Array.IndexOf(this.DeniedMIMETypes, mimeType) >= 0)  
  7.     {  
  8.       return false;  
  9.     }  
  10.    } 
  11.  
  12.    if (AllowedMIMETypes.Length > 0)  
  13.    {  
  14.     return (Array.IndexOf(this.AllowedMIMETypes, mimeType) >= 0);  
  15.     }  
  16.     else 
  17.     {  
  18.     return true;  
  19.     }  

然后定位到Connector/CommandHandlers/FileUploadCommandHandler.cs,找到:

csharp 代码
  1. if (!this.CurrentFolder.ResourceTypeInfo.CheckExtension(sExtension))  
  2.  {  
  3.   ConnectorException.Throw(Errors.InvalidExtension);  
  4.  } 

然后加上:

csharp 代码
  1. string sFileMIME = oFile.ContentType;
  2. if (!this.CurrentFolder.ResourceTypeInfo.CheckMIMEType(sFileMIME))//检测上传文件的MIME类型
  3. {
  4.     ConnectorException.Throw(Errors.InvalidMIMEType);
  5. }

最后再修改config.ascx,加上MIME类型的黑白名单:

csharp 代码
  1. ResourceType type;
  2.  
  3. type = ResourceType.Add("Zip");
  4. ...
  5. type.AllowedExtensions = new string[] { "zip" };
  6. type.DeniedExtensions = new string[] {"asp","aspx","jsp","php","ashx","js","html","htm" };
  7. type.AllowedMIMETypes = new string[] { "application/x-zip-compressed" };
  8. type.DeniedMIMETypes = new string[] {"text/plain" };

这样就相对就安全一些了(当然服务器端还可以进一步做安全处理,不过这个话题再展开就变成"服务器安全设置"专题了,不在本文的讨论范围,暂不深入)

4.上传文件大小限制

默认情况下ResourceType的构造函数里,MaxSize=0即不对上传文件大小做限制,所以只要在config.ascx里加上限制就行了

csharp 代码
  1. type = ResourceType.Add("Zip");
  2. ...
  3. type.MaxSize = 0;

即把这里的MaxSize改成想要的值即可(以字节为单位计算),注意:ResourceType虽然有MaxSize成员,但其实上传代码中并未对上传文件大小做判断,而是在上传完成后生成缩略图时,才做了一次判断,如果需要在上传文件SaveAs以前就做判断处理,自行加一条if语句,比较oFile.ContentLength与MaxSize即可

5.上传后缩略图无法正常显示

这是ckFinder在windows系统中的一个小bug,定位到Settings/Thumbnails.cs,找到public string GetTargetDirectory()方法,改成下面这样:

csharp 代码
  1. if (Dir.Length == 0 || Dir.Substring(0,1)!="/"//如果Dir为空,或者只是相对路径
  2. {
  3.     return HttpContext.Current.Server.MapPath(Url);
  4. }
  5. else
  6. {
  7.     if (Dir.IndexOf("://") == -1)//如果不是物理路径
  8.     {
  9.         return HttpContext.Current.Server.MapPath(Dir);
  10.     }
  11.     else
  12.     {
  13.         return Dir;
  14.     }
  15. }

6.动态指定上传路径

默认情况下无法用cs代码修改config.ascx中的BaseUrl设置,因为其后端代码ConfigFile中并没有提供修改BaseUrl的方法,这里我借用了fckeditor以前的用法:利用session来动态处理

csharp 代码
  1. public string DynamicBaseUrl
  2. {            
  3.     get
  4.     {
  5.     object _baseUrl = HttpContext.Current.Session["CKFinder:DynamicBaseUrl"];
  6.     if (_baseUrl == null || string.IsNullOrEmpty(_baseUrl.ToString())) 
  7.     {
  8.         _baseUrl = "/ckfinder/userfiles/";
  9.     }
  10.     this.BaseUrl = _baseUrl.ToString();
  11.     return this.BaseUrl;
  12.     }
  13. }

如上,在Settings/ConfigFile.cs中增加一个属性,让其从session中取值,然后再把config.ascx中的BaseUrl改成下面这样

csharp 代码
  1. //BaseUrl = "/ckfinder/userfiles/";
  2. BaseUrl = DynamicBaseUrl;

最后在嵌入ckFinder的页面中类似这样处理:

csharp 代码
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.     Session["CKFinder:DynamicBaseUrl"] = "/upload/";
  4. }

7.CKfinder免费版本如何去掉“那啥”的提示

打开core/js/ckfinder_ie.js,找到 {en.call(window,qo);},改成{/*en.call(window,qo);*/}即可

 

二、与CKeditor的整合

1.CKeditor的设置

csharp 代码
  1. window.onload = function () {
  2.     CKEDITOR.replace("editor1", {
  3.     filebrowserBrowseUrl: '/ckfinder/ckfinder.html'//启用浏览功能
  4.     filebrowserImageBrowseUrl: '/ckfinder/ckfinder.html?Type=Image',
  5.     filebrowserFlashBrowseUrl: '/ckfinder/ckfinder.html?Type=Flash',
  6.     filebrowserUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Zip',
  7.     filebrowserImageUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Image',
  8.     filebrowserFlashUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Flash'
  9.     });
  10. }

这样就可以了,需要说明的"ckfinder.html?Type=Image"上的Type=XXX,即对应CKFinder中Config.ascx的ResourceType设置,而且ResourceType的名称不能用中文名,否则在快速上传时无法上传到服务端。(很多地方是在html中以js方式接收参数的,改成中文后会导致乱码,从而无法正确定位目录,熟悉js的朋友如果想让其支持中文Type名,技术上讲应该是可以修改实现的)

2.与Asp.Net默认安全性的冲突处理

可参见上一篇博文,不再重复

最后:CKFinder需要Session/ViewState,所以如果您的Asp.Net项目中禁用了Session或ViewState,可能会无法正常运行,解决办法要么启用Session/ViewState,要么自行修改CKFinder源代码


本文转自:http://www.cnblogs.com/yjmyzz/archive/2010/03/24/1693934.html


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

相关文章

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盘就可以使用电脑自带的网卡,所以这里我讲解的…

联想计算机无线网络设置密码,联想路由器怎么设置密码

在这个互联网时代里,路由器是互联网系统中的重要组成部分,是连接因特网中局域网和广域网的设备,它可以根据信道实际的情况选择最合适的路径,那么你知道联想路由器怎么设置密码吗?下面是学习啦小编整理的一些关于联想路由器设置密码的相关资料,供你参考。 联想路由器设置密…

Router Password Kracker(路由器密码破解工具)

在我们破解出了wifi的密码,却因为路由器默认密码被改,而无法登陆路由器管理界面是不是很蛋疼。 下面给大家介绍一款路由器密码破解工具&#xff0c;Kracker。 【工具介绍】 Kracker&#xff1a;一款免费的破解软件&#xff0c;它可以用于破解路由器或调制解调器等。 一般路由器…

TPLink路由器登陆密码怎么破解

TPLink路由器登陆密码忘记了怎么办?由于路由器设置通常只是偶尔进行,因此时间长了可能就忘记了路由器登陆密码。当路由器登陆密码忘记后,我们可以采用暴力破解登陆路由器,也可以通过恢复路由器出厂设置来清除登陆密码。以下小编就为大家分享一下具体破解TPLink路由器登陆密…

无线路由器怎么改密码 修改路由器密码

时下有许多蹭网软件&#xff0c;可以轻松破解WIFI密码&#xff0c;占用我们的网络&#xff0c;而定期修改路由器密码&#xff0c;可有效防止这些蹭网行为&#xff0c;那么无线路由器怎么改密码&#xff1f;这里就教大家如何修改路由器密码&#xff0c;一起来看看。 无线路由器…

思科模拟器:cisco路由器密码恢复(密码破解)

环境&#xff1a;思科模拟器 准备一个路由器 我们如果要去密码恢复时候&#xff0c;需要去修改寄存器值&#xff0c;就是修改寄存器值让路由器不去加载以前的配置文件同理console口密码也会一起消失&#xff0c;也就说你修改完以后是所有配置都会没&#xff0c;并不是单一的密码…