CKEditor/CKFinder升级心得
这几天把一个旧项目中的fckeditor升级为ckeditor 3.2 + ckfinder 1.4.3 组合,下面是一些升级心得:
一、CKFinder的若干问题
1.单独使用
ckfinder从原fckeditor分离出来以后可以单独使用,通常我习惯于在工具栏中添加ckfinder.dll,这样以后要使用ckfinder直接从工具箱拖出来即可.
拖到页面中后,会形成这样一个控件实例:
1
|
< CKFinder:FileBrowser ID = "FileBrowser1" runat = "server" ></ CKFinder:FileBrowser >
|
2.上传文件自动重命名
修改ckfinder的源文件,找到Connector\CommandHandlers\FileUploadCommandHandler.cs这个文件,定位到:
1
|
string sExtension = System.IO.Path.GetExtension( oFile.FileName );
|
2
|
sExtension = sExtension.TrimStart( '.' );
|
在下面加一行代码:
1
|
sFileName = DateTime.Now.ToString( "yyyyMMddHHmmssfff" ) + "." + sExtension;
|
即强制把文件名改为时间格式字符串.
3.上传安全问题
3.1 跟fckeditor类似,默认情况下ckfinder是不允许上传的,找到config.ascx这个文件,定位到
1
|
public override bool CheckAuthentication()
|
2
|
{
|
3
|
return false ;
|
4
|
}
|
在这里加入自己需要的判断逻辑,千万不要直接改成return true;这样相当于免费把自己的服务器变成一个网络硬盘+肉鸡,任何人都可以直接上传任何文件(包括木马),起码也得类似下面这样:
1
|
public override bool CheckAuthentication()
|
2
|
{
|
3
|
return HttpContext.Current.User.Identity.IsAuthenticated;
|
4
|
}
|
如果您是用membership/role来认证的,上面代码要求用户登录后才能使用ckfinder的上传功能.
3.2 文件扩展名校验
默认情况下,ckfinder几乎能上传任何文件,所以设置允许上传的文件扩展名是必需的,ckfinder采用了黑白名单的做法,即同时可以设置"允许上传的扩展名"及"禁止上传的扩展名",config.ascx中可参考下面这样设置:
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代码的留言(或产品编码,个人简介编辑等),写上这样一行代码
1
|
<!--inlude file = "xxx.jpeg"-->
|
这里xxx.jpeg即上传后的"伪jpeg"木马,如果服务端允许包含文件的话,浏览包含这行代码的页面,木马就能运行了!
为了防止这类攻击,必须要在服务端做MIME/ContentType校验,因为文件的扩展名不管改成什么,其内在的MIME/ContentType是不会变的,修改方法:
定位到Settings\ResourceType.cs,找到
1
|
public string [] AllowedExtensions;
|
2
|
public string [] DeniedExtensions;
|
再增加二个数组
1
|
public string [] AllowedMIMETypes;
|
2
|
public string [] DeniedMIMETypes;
|
相应的构造函数也加初始化代码:
1
|
AllowedMIMETypes = new string [0];
|
2
|
DeniedMIMETypes = new string [0];
|
然后再增加一个方法:
01
|
public bool CheckMIMEType( string mimeType)
|
02
|
{
|
03
|
mimeType = mimeType.Trim().ToLower();
|
04
|
|
05
|
if (DeniedMIMETypes.Length > 0)
|
06
|
{
|
07
|
if (Array.IndexOf( this .DeniedMIMETypes, mimeType) >= 0)
|
08
|
{
|
09
|
return false ;
|
10
|
}
|
11
|
}
|
12
|
|
13
|
if (AllowedMIMETypes.Length > 0)
|
14
|
{
|
15
|
return (Array.IndexOf( this .AllowedMIMETypes, mimeType) >= 0);
|
16
|
}
|
17
|
else
|
18
|
{
|
19
|
return true ;
|
20
|
}
|
21
|
}
|
然后定位到Connector\CommandHandlers\FileUploadCommandHandler.cs,找到:
1
|
if (! this .CurrentFolder.ResourceTypeInfo.CheckExtension(sExtension))
|
2
|
{
|
3
|
ConnectorException.Throw(Errors.InvalidExtension);
|
4
|
}
|
然后加上:
1
|
string sFileMIME = oFile.ContentType;
|
2
|
if (! this .CurrentFolder.ResourceTypeInfo.CheckMIMEType(sFileMIME)) //检测上传文件的MIME类型
|
3
|
{
|
4
|
ConnectorException.Throw(Errors.InvalidMIMEType);
|
5
|
}
|
最后再修改config.ascx,加上MIME类型的黑白名单:
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里加上限制就行了
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()方法,改成下面这样:
01
|
if (Dir.Length == 0 || Dir.Substring(0,1)!= "/" ) //如果Dir为空,或者只是相对路径
|
02
|
{
|
03
|
return HttpContext.Current.Server.MapPath(Url);
|
04
|
}
|
05
|
else
|
06
|
{
|
07
|
if (Dir.IndexOf( ":\\" ) == -1) //如果不是物理路径
|
08
|
{
|
09
|
return HttpContext.Current.Server.MapPath(Dir);
|
10
|
}
|
11
|
else
|
12
|
{
|
13
|
return Dir;
|
14
|
}
|
15
|
}
|
6.动态指定上传路径
默认情况下无法用cs代码修改config.ascx中的BaseUrl设置,因为其后端代码ConfigFile中并没有提供修改BaseUrl的方法,这里我借用了fckeditor以前的用法:利用session来动态处理
01
|
public string DynamicBaseUrl
|
02
|
{
|
03
|
get
|
04
|
{
|
05
|
object _baseUrl = HttpContext.Current.Session[ "CKFinder:DynamicBaseUrl" ];
|
06
|
if (_baseUrl == null || string .IsNullOrEmpty(_baseUrl.ToString()))
|
07
|
{
|
08
|
_baseUrl = "/ckfinder/userfiles/" ;
|
09
|
}
|
10
|
this .BaseUrl = _baseUrl.ToString();
|
11
|
return this .BaseUrl;
|
12
|
}
|
13
|
}
|
如上,在Settings\ConfigFile.cs中增加一个属性,让其从session中取值,然后再把config.ascx中的BaseUrl改成下面这样
1
|
//BaseUrl = "/ckfinder/userfiles/";
|
2
|
BaseUrl = DynamicBaseUrl;
|
最后在嵌入ckFinder的页面中类似这样处理:
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的设置
01
|
window.onload = function () {
|
02
|
CKEDITOR.replace( "editor1" , {
|
03
|
filebrowserBrowseUrl: '/ckfinder/ckfinder.html' , //启用浏览功能
|
04
|
filebrowserImageBrowseUrl: '/ckfinder/ckfinder.html?Type=Image' ,
|
05
|
filebrowserFlashBrowseUrl: '/ckfinder/ckfinder.html?Type=Flash' ,
|
06
|
filebrowserUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Zip' ,
|
07
|
filebrowserImageUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Image' ,
|
08
|
filebrowserFlashUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Flash'
|
09
|
});
|
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://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载于:https://www.cnblogs.com/caihong5459/archive/2010/07/16/1778858.html
CKEditor/CKFinder升级心得相关推荐
- 在ASP.NET项目中使用CKEditor +CKFinder实现图片上传功能
前言 之前的项目中一直使用的是FCKeditor,昨天突然有个想法:为什么不试一下新的CKEditor呢?于是花了大半天的时间去学习它的用法,现在把我的学习过程与大家分享一下. 谈起FCKeditor ...
- ckeditor finder php,CKEDITOR CKFINDER的图片上传配置(C#/asp.net/php)
CKEDITOR+CKFINDER的图片上传配置(C#/asp教程.net/php教程) php keditor的代码全部重写,但里面没有了上传功能,只是一个纯粹的文件在线编辑器,如果需要上传图片,还 ...
- CKEditor+CKFinder配置学习
CKEditor+CKFinder配置学习 基于dotNetFramework环境, 解决方案部署在VS2010 + dotNetFramework4.0 [下载源码] 富文本编辑器学习,常见富文本编 ...
- ckfinder php 配置,PHP中Ckeditor+Ckfinder配置图片上传功能_PHP教程
从标题来看我们知道Ckeditor不支持图片上传功能,它是需要一个组件Ckfinder才可以支持上传图片, 本文章就来详细的介绍了如何配置Ckeditor+Ckfinder实现图片上传的功能. 第一: ...
- 三国战记服务器维护要多久,《三国战纪》新手开荒1至60级快速升级心得
作者:damn3025 来源:巴士论坛(点此进入) <三国战纪>1到60级急速升级心得,之前是自己摸索着玩游戏,也走了很多弯路,所以把经验积攒下来,让新来的朋友可以少走弯路.我们的目标是: ...
- 网络编辑器插件ckeditor+ckfinder配置
原帖地址 另外一个 去掉编辑器的下边栏 在config.js中加入: config.removePlugins = 'elementspath'; config.resize_enabled = fa ...
- ckeditor+ckfinder配置用法
ckeditor+ckfinder配置用法 一.使用方法:1.在页面<head>中引入ckeditor核心文件ckeditor.js <script type="te ...
- ckeditor+ckfinder配置
ckeditor+ckfinder配置用法 一.使用方法: 1.在页面<head>中引入ckeditor核心文件ckeditor.js <script type=&q ...
- 使用Ckeditor+Ckfinder完成图片上传
在介绍CKEditor之前,首先要了解Fckeditor.FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器,具有轻量化,安装配置的特点,能够和PHP.JavaScript. ...
- asp.net mvc中ckeditor+ckfinder的配置方法
开源网页编辑软件FCKEditor在09年发布更新到3.0,并改名为CKEditor.改进后的ckeditor更加模块话,配置更加灵活,和以前的fckeditor使用方式上也有所不同.在我的mvc项目 ...
最新文章
- 信不信?以面向对象的思想是可以写好高并发程序的!
- 使用数值计算库Zero - VC6调用失败、cfree调用成功
- (网络编程)InetAddress(表示ip地址的类)相关使用
- SetForceGroundWindow
- Min_25筛有关求解次小质因子
- oracle的awr日志,oracle 导出awr信息
- python安装库pandas_安装python的第三方库 geopandas
- 控制系统分析与设计(一):控制系统分类及建模
- 在r中弄方差分析表_R语言 | 方差分析(上)
- 本地传奇架设详细教程
- 【习题 4-7 UVA - 509】RAID!
- 手把手教你Photoshop中的图层混合模式(一)
- <2021SC@SDUSC>【Overload游戏引擎】OvCore源码模块分析(三)——GlobalHelpers
- eNSP实验记录(一):路由器与交换机
- 北航2022软件工程第一次作业——阅读、思考、调研、实践
- CSS外边距重叠和高度坍塌完美解决
- 计算机组成dr是什么意思,体检中DR诊断是什么意思
- 实战:第十五章:摸爬滚打这些年的心路历程
- 如何在Mac中转换图片格式
- 超级 POM,POM的层级关系