修改CKFinder上传路径
一、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;这样相当于免费把自己的服务器变成一个网络硬盘+肉鸡,任何人都可以直接上传任何文件(包括木马),起码也得类似下面这样:
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名,技术上讲应该是可以修改实现的)
修改CKFinder上传路径的更多相关文章
- kindeditor修改图片上传路径-使用webapi上传图片到图片服务器
kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 在这里我着重介绍一些使用kindeditor修改图片上传路径并通过webapi上传图片到图片服务器的方案. 因为我使用的 ...
- kindeditor扩展粘贴图片功能&修改图片上传路径并通过webapi上传图片到图片服务器
前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...
- kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器
前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...
- UMEditor(Ueditor mini)修改图片上传路径
UMEditor(Ueditor mini)修改图片上传路径 imageUp.ashx string pathbase = "/UpLoad/images/"; //保存文件夹在网 ...
- PHP结合Ueditor并修改图片上传路径
投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2016-10-16 我要评论 使用ueditor编辑器,附件默认在ueditor/php/upload/, 但是大家的附件地址的默认路 ...
- PHP结合Ueditor并修改图片上传路径 微信小程序 拼接域名显示图片
前言 在使用UEditor编辑器时,一般我们都是需要修改默认的图片上传路径的,下面是我整理好的修改位置和方法供大家参考. 操作 Ueditor PHP版本本身自带了一套上传程序,我们可以在此基础中,找 ...
- ueditor1.4.3 php版本使用修改图片上传路径
实例化编辑器必须带上一下东西 header部分 <script type="text/javascript" charset="utf-8" src=&q ...
- Baidu UEditor .net 下修改默认上传路径
public override void Process() { byte[] uploadFileBytes = null; string uploadFileName = null; if (Up ...
- 百度UEditor图片上传或文件上传路径自定义
最近在项目中使用到百度UEditor的图片以及文件上传功能,但在上传的时候路径总是按照预设规则来自动生成,不方便一些特殊文件的维护.于是开始查看文档和源代码,其实操作还是比较简单的,具体如下: 1.百 ...
随机推荐
- HDU 2639 (01背包第k优解)
/* 01背包第k优解问题 f[i][j][k] 前i个物品体积为j的第k优解 对于每次的ij状态 记下之前的两种状态 i-1 j-w[i] (选i) i-1 j (不选i) 分别k个 然后归并排序并 ...
- 一些 Windows 系统不常见的 鼠标光标常数
一些 Windows 系统不常见的 鼠标光标常数 Private Declare Function SetCursor Lib "user32" (ByVal hCursor A ...
- 兼容所有浏览器的JQuery zClip插件实现复制到剪贴板功能
相信这个功能大家平时上网经常能碰到,以前也没怎么留意怎么实现的,直到项目中需要. 网上一搜一大堆,单纯使用js方法也不是没有,但是由于各浏览器的安全机制不同,不是跨浏览器的.去看了几个常用的网站,都是 ...
- mysql 优化点小结
1.数据库表设计的合理性 1)三范式 一范式:原子性,属性不可分: 二范式:无部分依赖, 例:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分),存在部分依赖 (学号) → (姓名, 年龄) ...
- (转)Thinkphp系统常量 演示
Thinkphp2.1框架内置了许多系统常量, 具体如下: __ROOT__ : 网站根目录地址 __APP__ : 当前项目(入口文件)地址 __URL__ : 当前模块地址 __ACTION__ ...
- c - 根据首字母判断星期几
#include <stdio.h> #include <ctype.h> /* 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母. */ ...
- 你好,C++(7)第三部分 C++世界众生相 3.2.1 变量的定义与初始化
第3部分 C++世界众生相 在听过了HelloWorld.exe的自我介绍,完成了与C++世界的第一次亲密接触后,大家是不是都急不可待地想要一试身手,开始编写C++程序了呢?程序的两大任务是描述数据和 ...
- Qt Painter放大时,event处理应该注意的要点
比如当你Qt中用QPainter进行window和viewport,逻辑和物理坐标分离的形式进行绘图放大的时候,你会发现鼠标的移动和放大之后的图像有点不跟手,比如你是用QTransform进行放大变换 ...
- jquey复选框三级分类关联一二级分类
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Category_Manag ...
- jquery实现页面置顶功能代码
<html> <head> <title></title><script type='text/javascript> //回到顶部功能 f ...