CKEditor/CKFinder升级心得

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

一、CKFinder的若干问题

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

<CKFinder:FileBrowser ID="FileBrowser1" runat="server"></CKFinder:FileBrowser>

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

string sExtension = System.IO.Path.GetExtension( oFile.FileName );
sExtension = sExtension.TrimStart( '.' );

在下面加一行代码:

sFileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + sExtension;

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

 

3.上传安全问题

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

public override bool CheckAuthentication()
{
   return false;
}

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

public override bool CheckAuthentication()
{
   return HttpContext.Current.User.Identity.IsAuthenticated;
}

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

 

3.2 文件扩展名校验

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

ResourceType type;

type = ResourceType.Add("Zip");
...
type.AllowedExtensions = new string[] { "zip" };
type.DeniedExtensions = new string[] {"asp","aspx","jsp","php","ashx","js","html","htm" };
...

这一段设置相当于只允许.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,找到

public string[] AllowedExtensions;
public string[] DeniedExtensions;

再增加二个数组

public string[] AllowedMIMETypes;
public string[] DeniedMIMETypes;

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

AllowedMIMETypes = new string[0];
DeniedMIMETypes = new string[0];

然后再增加一个方法:

public bool CheckMIMEType(string mimeType)
{
    mimeType = mimeType.Trim().ToLower();

    if (DeniedMIMETypes.Length > 0)
    {
	if (Array.IndexOf(this.DeniedMIMETypes, mimeType) >= 0)
	{
	    return false;
	}
    }

    if (AllowedMIMETypes.Length > 0)
    {
	return (Array.IndexOf(this.AllowedMIMETypes, mimeType) >= 0);
    }
    else
    {
	return true;
    }
}

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

if (!this.CurrentFolder.ResourceTypeInfo.CheckExtension(sExtension))
{
    ConnectorException.Throw(Errors.InvalidExtension);
}

然后加上:

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

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

ResourceType type;

type = ResourceType.Add("Zip");
...
type.AllowedExtensions = new string[] { "zip" };
type.DeniedExtensions = new string[] {"asp","aspx","jsp","php","ashx","js","html","htm" };
type.AllowedMIMETypes = new string[] { "application/x-zip-compressed" };
type.DeniedMIMETypes = new string[] {"text/plain" };

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

4.上传文件大小限制

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

type = ResourceType.Add("Zip");
...
type.MaxSize = 0;

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

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

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

if (Dir.Length == 0 || Dir.Substring(0,1)!="/") //如果Dir为空,或者只是相对路径
{
	return HttpContext.Current.Server.MapPath(Url);
}
else
{
	if (Dir.IndexOf(":\\") == -1)//如果不是物理路径
	{
	    return HttpContext.Current.Server.MapPath(Dir);
	}
	else
	{
	    return Dir;
	}
}

6.动态指定上传路径

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

public string DynamicBaseUrl
{
    get
    {
	object _baseUrl = HttpContext.Current.Session["CKFinder:DynamicBaseUrl"];
	if (_baseUrl == null || string.IsNullOrEmpty(_baseUrl.ToString()))
	{
	    _baseUrl = "/ckfinder/userfiles/";
	}
	this.BaseUrl = _baseUrl.ToString();
	return this.BaseUrl;
    }
}

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

//BaseUrl = "/ckfinder/userfiles/";
BaseUrl = DynamicBaseUrl;

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

protected void Page_Load(object sender, EventArgs e)
{
    Session["CKFinder:DynamicBaseUrl"] = "/upload/";
}

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

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

 

二、与CKeditor的整合

1.CKeditor的设置

window.onload = function () {
    CKEDITOR.replace("editor1", {
	filebrowserBrowseUrl: '/ckfinder/ckfinder.html', //启用浏览功能
	filebrowserImageBrowseUrl: '/ckfinder/ckfinder.html?Type=Image',
	filebrowserFlashBrowseUrl: '/ckfinder/ckfinder.html?Type=Flash',
	filebrowserUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Zip',
	filebrowserImageUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Image',
	filebrowserFlashUploadUrl: '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Flash'
    });
}

这样就可以了,需要说明的"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源代码

时间: 2024-09-10 03:15:01

CKEditor/CKFinder升级心得的相关文章

ckeditor-完整CKEditor+CKFinder上传附件demo

问题描述 完整CKEditor+CKFinder上传附件demo 有没有完整的javaWeb示例,可以上传图片和其他附件(最基本保证能上传图片),急急急! 解决方案 在JSP里使用CKEditor和CKFinder:http://www.cnblogs.com/yuepeng/archive/2013/04/01/2992097.html CKEditor3.6.4上传路径配置--java版:http://www.cnblogs.com/sfmjp/articles/2827858.html 解

ckeditor-完整CKEditor+CKFinder 上传图片限制大小

问题描述 完整CKEditor+CKFinder 上传图片限制大小 在ckfinder.xml里面设置图片的大小,但是没有起到限制作用 但是在长传大于1M的时候,没有起到限制作用 解决方案 什么语言版本的ckeditor?设置为1048576看看,不支持加单位的吧.. 解决方案二: 把1m改成1024*1024试一试 解决方案三: ckfinder 在上传图片后, ckeditor 获取图片路径时 多了个斜杠 如何解决呀?

CKEDITOR+CKFINDER的图片上传配置(C#/asp.net/php)

CKEDITOR+CKFINDER的图片上传配置(C#/asp教程.net/php教程) php keditor的代码全部重写,但里面没有了上传功能,只是一个纯粹的文件在线编辑器,如果需要上传图片,还需要下载ckfinder. 首先去官方上下载源代码,然后分别解压缩在网站根目录里(默认ckeditor和ckfinder文件夹里,一般不需要改动) 在所需要的页面插入JS <script type="text/网页特效" src="/ckeditor/ckeditor.JS

PHP中Ckeditor+Ckfinder配置图片上传功能

第一:安装配置CKEditor 在扩展CKfinder实现图片上传之前,我们先把最基本的CKeditor编辑器安装一下. 1.  将下载的ckeditor_3.4.2.zip解压,复制目录下的ckeditor文件夹至所需目录,如/admin/. 第一:安装配置CKEditor ,可改/admin/ckeditor/ckeditor.js来配置编辑器,如字体.背景色.语言 .界面高宽.编辑器按钮分布等  代码如下 复制代码 config.language = 'en'; config.skin =

急!!!java ckeditor+ckfinder上传图片问题!!!

问题描述 ckeditor+ckfinder整合完成后(开发工具是MyEclipse),在本机测试上传图片和浏览服务器都没有问题,但是打成war包后,部署到weblogic上,就出问题了提示:从服务器读取XML数据出错,服务器返回原始结果:Error500--InternalServerErrorjava.lang.Exception:Configurationwasn'tinitializedcorrectly.Checkserverlogs.atcom.ckfinder.connector.

thinkphp下ckeditor+ckfinder的图片上传配置详解

最新发布的CKFinder 1.4版 已经提供了对CKEditor3.0的支持CKFinder 1.4 下载地址:http://ckfinder.com/CKEditor3.0 下载地址:http://ckeditor.com/ 下载后直接解压得到ckeditor文件夹,包括如下内容: ck配置图片   其中sample为例子,source为源文件,为了减少editor的体积,直接删除.其他你也可删除一些,像语言只留zh-cn.然后将整个文件夹直接拷贝到网站htdocsnewtpPublicJs

CKEditor+CKFinder+php上传文件配置方法

新版本的CKEditor只提供了基本的文本编辑功能,上传模块由另一个组件CKFinder.这里主要记录CKFinder上传的一些参数配置,能够成功上传文件,自定义上传文件目录,按日期+随机字符重命名文件. 1.下载CKFinder. 下载CKFinder,解压跟CKEditor放同一目录,下载地址:http://ckfinder.com/ 2.开启上传功能. 打开ckfinder\config.php文件,找到函数CheckAuthentication(),大约在21行,将最后一行return

ckeditor+ckfinder,在weblogic上部署war包后,浏览服务器出错

问题描述 从服务器读取XML数据出错服务器返回原始结果:Error500--InternalServerErrorjava.lang.Exception:Configurationwasn'tinitializedcorrectly.Checkserverlogs.atcom.ckfinder.connector.ConnectorServlet.getResponse(ConnectorServlet.java:126)atcom.ckfinder.connector.ConnectorSer

s2sh ckeditor+ckfinder 图片上传没反应

问题描述 大家好,我的遇到的问题是这样我的项目是s2sh环境,最近需要在项目上搭建个富编辑器,就选了,ckeditor和cdfinder,我把ckeditor和cdfinder整合到一般的java项目时,一切测试正常,把测试好的代码移植到s2sh中,图片上传没反应,我按照网上的写的经验,http://blog.csdn.net/cuihaiyang/article/details/6526190把<filter-mapping><filter-name>Struts2</fi