提升 WordPress 網站安全與效能:如何用 upload_mimes 限制檔案上傳類型?
最近在幫客戶維護網站時,又遇到了很經典的問題:要怎麼管理使用者上傳到 WordPress 的檔案呢?
有時候,我們不希望使用者上傳一些超大的影音檔,拖垮網站效能;有時候是基於安全考量,想避免一些有潛在風險的檔案格式
或者,如果你的網站有使用外部圖床(像 Amazon S3 或 Cloudflare R2),限制檔案類型也能讓管理更方便。
這時候,WordPress 內建的 upload_mimes 這個 Filter Hook 就派上用場了!它讓我們可以很方便地決定,到底哪些檔案「可以」或「不可以」被上傳。
今天就來分享一下如何使用「黑名單」的方式來實作,也就是禁止某些特定的檔案類型。
當然,你也可以反過來,改用「白名單」只允許特定幾種檔案喔!
程式碼範例:禁止上傳常見的影音檔案
你可以把下面這段程式碼,加到你佈景主題的 functions.php 檔案中。
/**
* 使用 upload_mimes Hook 過濾不允許的檔案上傳類型
*
* @param array $existing_mimes 現有的 MIME Type 陣列.
* @return array 修改後的 MIME Type 陣列.
*/
function my_custom_upload_mimes( $existing_mimes = array() ) {
// 在這裡列出你想「禁止」上傳的檔案類型 (黑名單)
$blacklist = array(
// 音訊檔案
'mp3|m4a|m4b' => 'audio/mpeg',
'wav' => 'audio/wav',
'ogg|oga' => 'audio/ogg',
'mid|midi' => 'audio/midi',
'wma' => 'audio/x-ms-wma',
// 影片檔案
'wmv' => 'video/x-ms-wmv',
'avi' => 'video/avi',
'flv' => 'video/x-flv',
'mov|qt' => 'video/quicktime',
'mpeg|mpg|mpe' => 'video/mpeg',
'mp4|m4v' => 'video/mp4',
'ogv' => 'video/ogg',
'webm' => 'video/webm',
'mkv' => 'video/x-matroska',
'3gp|3gpp' => 'video/3gpp',
'3g2|3gp2' => 'video/3gpp2',
);
// 從現有的 MIME 陣列中移除它們 (避免有其他外掛有加入而沒有限制)
foreach ( $blacklist as $extensions => $mime_type ) {
// 使用 unset() 移除陣列中的元素
unset( $existing_mimes[ $extensions ] );
}
// 回傳處理過的陣列
return $existing_mimes;
}
// 透過 'upload_mimes' Hook 執行
add_filter( 'upload_mimes', 'my_custom_upload_mimes', 1000, 1 );
程式碼說明:
my_custom_upload_mimes:
這是我自己定義的名稱,你可以改成任何你喜歡的識別名稱,建議加上自己的前綴,避免跟其他外掛衝突。
$blacklist 陣列:
把想禁止的檔案類型整理成一個「黑名單」陣列,這樣看起來更清楚,也方便未來管理。
unset($existing_mimes[$extensions]):
這是移除陣列元素的核心語法。
WordPress 就是透過這個 $existing_mimes 陣列來判斷檔案可否上傳的。
add_filter(…):
這行就是 WordPress Hook 的精髓,它告訴 WordPress:「在處理檔案上傳的 MIME 類型時,請用我寫的 my_custom_upload_mimes 過濾一下」
想知道 WordPress 支援哪些 MIME Type?
如果你想新增或移除其他檔案類型,但不確定它們的 MIME Type 是什麼,可以直接到 WordPress 的核心檔案裡尋找
路徑在 /wp-includes/functions.php,搜尋 wp_get_mime_types() 這個函式,裡面就有完整的清單了。
希望這個小技巧對你有幫助!透過這個方式,可以讓你的網站更安全、也更符合你的管理需求。
臉書留言
一般留言