提升 WordPress 網站安全與效能:如何用 upload_mimes 限制檔案上傳類型?

最近在幫客戶維護網站時,又遇到了很經典的問題:要怎麼管理使用者上傳到 WordPress 的檔案呢?

有時候,我們不希望使用者上傳一些超大的影音檔,拖垮網站效能;有時候是基於安全考量,想避免一些有潛在風險的檔案格式
或者,如果你的網站有使用外部圖床(像 Amazon S3Cloudflare 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() 這個函式,裡面就有完整的清單了。

希望這個小技巧對你有幫助!透過這個方式,可以讓你的網站更安全、也更符合你的管理需求。

相連文章

臉書留言

一般留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *