检视文章

將insoler相簿網址改為數字格式,並修正討論區內的相簿連結

上次我為了解決網頁開啟速度異常緩慢問題,把討論區、部落格的網址,從原本的「標題直接轉換網址」的格式改成純數字格式:

更換討論區、部落格的網址、解決Blogs部落格網頁開啟速度異常緩慢問題、更新imagick等

原本海豚的網址的設計是直接從討論區、部落格的標題名稱,直接轉成網址相容格式。通常討論區、部落格的標題標題是使用中文,就會變成「中文網址」。雖然並沒有使用上的問題,但是在標題很長的時候(原廠設計最長的標題是255字元),就會導致「長網址」的問題。

雖然「長網址」並不會出錯,但是網站系統的設計都是依靠「網址」來點選某一篇文章、某一個討論話題。「太長的網址」+「超過數十萬篇」甚至是「數百萬篇」討論話題、文章,就會導致MySQL在搜尋文章時需要花費更多時間!沒人會希望點選一篇文章,需要花2-5秒的時間才能開啟。

所以「太長的中文網址」就會成為拖垮MySQL Server資料庫伺服器的原因之一!所以我花了許多時間研究要如何變更討論區、部落格的網址,從「長中文網址」改成非常簡短的「純數字網址」。也修正完畢討論區、部落格的站內連結,從中文網址改成數字網址。

新的「數字網址」是使用PHP的時間格式,這是以「秒」為單位。為了避免在同一秒內有多人同時發表文章、討論話題,所以我再加上4位數的「微秒時間」,也就是「時間秒+4位數微秒」。因為微秒時間絕對不可能重複(如果是取隨機亂數的話,事實上在同一秒內就有可能會重複,導致網址索引錯誤!),而且4位數微秒的意思,可以確保同一秒內,最多可以有100位,甚至是1000位(理論上是可以達到9999位)會員同時發表文章,也不會出錯。

我確定這樣可以改進MySQL的搜尋效能,所以下一步就是把「insoler相簿」也套用相同的方式,改用「純數字網址」。原本的相簿的網址也是從「相簿名稱」直接轉換成網址格式,所以會看到中文網址的相簿連結。雖然目前「相簿」的數量還不算很多,還不到5000本相簿,理論上並不會拖垮MySQL資料庫的搜尋速度,但是因為搜尋照片的時候,會一起搜尋相簿。或是點選「相簿」的時候,也會一起搜尋那本相簿裡面有哪些「照片」?

雖然目前的「相簿」總數還不到5000本,卻成為MySQL搜尋上沈重負擔的問題!

例如ayaka會員今天貼的這本相簿:

黑Mac OS installer

在原本的海豚系統,會把這本相簿,依照相簿名稱轉換成「黑Mac-OS-installer」這樣的網址格式(因為網址格式裡面禁止使用空白字元),如果有其他會員也使用同樣的相簿名稱,系統就會自動在「黑Mac-OS-installer」網址後面加上一個日期,變成類似「黑Mac-OS-installer2017-08-31」這種格式,可說是越變越複雜,越來越長,對於提升MySQL資料庫的搜尋速度,一點幫助也沒有!

改成「數字網址」以後,就會看到「15002292686423」這樣的網址。這樣就不用為了與別人的相簿區別,又要想辦法更換網址!因為「時間秒+4位數微秒」,已經可以讓insoler在同一秒內,最多可以有1000位(理論上是可以達到9999位)會員同時新增相簿,而且不會出問題!

雖然「上傳照片」也是使用相同的「時間秒+4位數微秒」但是因為相簿與照片的前置網址不同,所以就算剛好數字相同(也就是連微秒時間都相同)也不會有任何問題。

目前以insoler的「活動」會員數來看(有很多都是註冊之後,就幾乎不會再來),絕對不可能會有同一秒內多人新增相簿、多人同時上傳照片的問題,所以「時間秒+4位數微秒」目前應該是非常夠用,或許就算再經過10年大概都不會有「同一秒內,1000位以上會員」同時新增相簿、同時上傳照片的情況出現。

修正MoxieManager的安全性漏洞

屬於海豚系統的「PREMIUM」都有權利可以從原廠網址下載一個MoxieManager模組,自動安裝到TinyMCE這個WYSIWYG HTML Editor的網頁版本的Word文字編輯器。你可以在工具列的右邊看到一個「上傳・插入圖片」的圖示:

原廠提供的版本是MoxieManager 1.3,雖然是1.3 (2013-09-10)非常老舊的版本,距離現在的最新版本2.1.7 (2017-04-03),可能有許多差別:

MoxieManager Changelog

但是我在Demo網頁,按「Browse」並試著上傳一張圖片,卻看不出有太大的差異!再加上insoler會員不多,不直得付費另外購買升級版。

MoxieManager Demo

原本MoxieManager的設計可以上傳「jpg,jpeg,png,gif,webm,mp4,html,htm,txt,docx,doc,zip,pdf」這麼多種格式。但其實一開始就被我刪減了許多格式。去年因為需要讓ayaka會員可以上傳 .zip 檔案,有開放過 .zip、pdf 格式。但就一直開啟中,忘記關閉!

最近發現某會員上傳zip、pdf檔案,但卻沒有貼在討論區!所以我關閉了其他格式,只允許上傳「jpg,jpeg,png,gif」這4種圖片格式。某會員發現無法上傳zip、pdf檔案之後,就故意更換副檔名,加上 .jpg 上傳了PowerPoint的簡報檔案!

換句話說,MoxieManager並沒有檢查上傳的圖片是不是「假圖片」「假檔案」,就直接上傳,而且還會產生一個空白內容的「縮圖」!換句話說,MoxieManager 1.3版(無法測試與試用新的2.1.7版)有重大的安全性漏洞!

我花了許多時間,找到處理上傳圖片的「縮圖」程式,位於 Moxie-v.1.3.0/moxie/data/moxiemanager/classes/Handlers/UploadHandler.php

// Resize the temporary blob
if ($config->get("upload.autoresize") && preg_match('/gif|jpe?g|png/i', MOXMAN_Util_PathUtils::getExtension($tempFilePath)) === 1) {
    $size = getimagesize($tempFilePath);
    $maxWidth = $config->get('upload.max_width', -1);
    $maxHeight = $config->get('upload.max_height', -1);

    if ($maxWidth > 0 && $maxHeight > 0 && ($size[0] > $maxWidth || $size[1] > $maxHeight)) {
        $imageAlter = new MOXMAN_Media_ImageAlter();
        $imageAlter->load($tempFilePath);
        $imageAlter->resize($maxWidth, $maxHeight, true);
        $imageAlter->save($tempFilePath, $config->get("upload.autoresize_jpeg_quality", 90));
    }
}

這段程式碼會判斷是否要處理上傳圖片的「自動縮圖」,如果有開啟「upload.autoresize = true」,以及上傳的圖片格式是「jpg,jpeg,png,gif」的話,就會讀取上傳圖片的大小(長、寬的點數),再按照縮圖大小的設定(預設是縮小為800x600點),以及縮圖畫質設定為90%。看起來似乎很普通、很正常的程式碼。

但是MoxieManager卻竟然忘記檢查,當getimagesize取得圖片大小的傳回值是「false」無法讀取圖片大小的時候,居然也照樣進行縮圖,而沒有處理PHP函數的傳回值是「false」的失敗場合!hit

雖然對我來說,「故意更換副檔名,加上 .jpg 上傳了PowerPoint的簡報檔案」是一種「惡意行為」,但也只能說感謝那位潛水會員,讓我知道MoxieManager的安全性漏洞!或許就算是最新的2.1.7版仍舊有這個安全性漏洞,如果沒有人做過這種事,也沒人告知MoxieManager的研發人員的話。由於無法試用目前最新的2.1.7版,而且從操作介面也看不出有什麼差異,所以我也不想浪費錢升級到新版。乾脆自己來解決安全性漏洞還比較實在。

我在insoler首頁裡面特別放了一個原版的Dolphin-v.7.3.3系統,使用相同的MySQL資料庫。但是因為我修改了Photos模組的許多部分,所以只有Photos模組更換成我寫的版本,其他全部都是Dolphin-v.7.3.3原版,連EXIF都沒有安裝,當然,連「討論區」也沒有設定好,所以會看不到會員圖示,以及翻譯的語系。因為其他部分不是測試的重點,所以請忽略那些部分。

用文字很難說明網頁開啟速度的差異,所以我特別錄製了一個影片,請特別留意左上角網頁標籤上的「逆時針旋轉」的網頁載入圖示。旋轉次數越多,就表示網頁的顯示速度越慢。

你可以看到在登入insoler帳號以後,點選「首頁」、「照片」的顯示速度會比沒有登入以前緩慢許多,特別是「照片」的首頁顯示速度會比首頁更慢。目前只能猜想「照片」的首頁會一次預覽15張照片,首頁只有12張照片,所以「照片」的首頁的顯示速度會比首頁更慢一些。

當然,我在地下社群網站有測試過,就算減少「照片」的首頁的瀏覽照片張數,在登入insoler帳號以後,還是會很明顯的變得緩慢!

底下是測試「在沒有登入帳號時,網站首頁與照片首頁的網頁開啟速度、網頁顯示速度」,因為從上面的測試可以發現「沒有登入帳號時」的insoler首頁、照片首頁的顯示速度本來就會比較快,真正的問題是「登入使用者帳號」的問題!

insoler 在沒有登入帳號時,網站首頁與照片首頁的網頁開啟速度、網頁顯示速度

底下是測試「在登入使用者帳號時,網站首頁與照片首頁的網頁開啟速度、網頁顯示速度」。因為沒有經過「測試比較」,一般人很難感受到「系統改善前、改善後」的差異,所以我特別在insoler首頁放一個幾乎接近Dolphin-v.7.3.3原版的版本,可以讓你比較「原廠版本」與「我的版本」在顯示速度上的差異!

insoler 在登入使用者帳號時,網站首頁與照片首頁的網頁開啟速度、網頁顯示速度

你可以看到「在登入使用者帳號以後」的「原廠版本」(請留意網址後面有多了一個Dolphin,而且討論區無法正常顯示會員圖示,以及正確翻譯)的網站「首頁」以及「照片」首頁的顯示速度。應該會發現,「我改寫的版本」很明顯的比原廠版本快了很多!幾乎是一點選就能開啟、顯示。

但是「原廠版本」會需要多轉1-2圈,請留意Firefox瀏覽器上面的標籤頁面。我其實不喜歡Firefox(除了速度慢以外,最大問題是同時開了多個YouTube影片,就會全部同時播放,什麼也聽不懂!)、Google Chrome瀏覽器,所以平時都是只用Safari。

但是Safari在「安全網站」不會顯示完整網址,只會顯示公司名稱,所以只好改用Firefox來進行測試。

蘇言霖 2017/08/31 2 857
评论
排序依据: 
每页:
 
  •  ayaka: 
     

    一般情況沒有導致JPEG encoder執行惡意代碼其實都不算security issue,只能算bug。

     
     2017/09/011 个答复1 个答复 
    0
     
评分
0
文章资讯
蘇言霖
「超級懶貓級」社群網站站長
2017/08/31 (2422天前)
动作