修改CKFinder上傳路徑

 1、CKFinder的若干問題php

1.單獨使用html

ckfinder從原fckeditor分離出來之後能夠單獨使用,一般我習慣於在工具欄中添加ckfinder.dll,這樣之後要使用ckfinder直接從工具箱拖出來便可.windows

 

 

拖到頁面中後,會造成這樣一個控件實例:後端

         <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( '.' );session

在下面加一行代碼:app

         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);*/}便可

 

2、與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名,技術上講應該是能夠修改實現的)

相關文章
相關標籤/搜索