首頁  >  問答  >  主體

安全性禁用 WP REST API

我正在考慮提高我的 Wordpress 網站的安全性,在這樣做時發現預設啟用了 WP REST API(如果我沒記錯的話,從 WP 4.4 開始)。

停用它的安全方法是什麼?

這裡的「安全」是指它不會導致意外的副作用,例如不會破壞任何其他 WP 核心功能。

一種可能的方法是使用 .htaccess 重寫規則,但令人驚訝的是我沒有找到任何這樣做的「官方」說明。

非常感謝任何幫助或建議:)

更新: 第三方插件不是我正在尋找的解決方案。儘管我知道有很多可以解決該任務的工具,但它們包含許多會減慢網站速度的額外功能。我希望有一個單行解決方案可以解決這個問題,而無需額外的插件開銷。

更新 2: 這是Wordpress的官方意見:https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i-disable-the-rest-api

據此,Wordpress 團隊希望未來的 WP 功能能依賴新的 REST API。這意味著沒有保證安全性的方法來停用 REST API。

我們只是希望有足夠的安全專家來負責 WP 的安全。

更新3:

#

WordPress API 手冊中提供了一種解決方法 - 您可以要求對所有請求進行身份驗證

這可確保停用對網站 REST API 的匿名訪問,只有經過驗證的請求才有效。

P粉463811100P粉463811100306 天前467

全部回覆(2)我來回復

  • P粉478445671

    P粉4784456712024-01-11 15:20:53

    接受的答案會停用未經身份驗證的使用者的所有 API 呼叫,但現在許多插件都依賴此 API 的功能。

    停用所有呼叫將導致意外的網站行為,在我使用此程式碼時也發生過這種情況。

    例如,ContactForm7 使用此 API 將聯絡資訊傳送到資料庫(我認為)並進行 ReCaptcha 驗證。

    我認為最好為未經身份驗證的用戶禁用某些(預設)端點,如下所示:

    // Disable some endpoints for unauthenticated users
    add_filter( 'rest_endpoints', 'disable_default_endpoints' );
    function disable_default_endpoints( $endpoints ) {
        $endpoints_to_remove = array(
            '/oembed/1.0',
            '/wp/v2',
            '/wp/v2/media',
            '/wp/v2/types',
            '/wp/v2/statuses',
            '/wp/v2/taxonomies',
            '/wp/v2/tags',
            '/wp/v2/users',
            '/wp/v2/comments',
            '/wp/v2/settings',
            '/wp/v2/themes',
            '/wp/v2/blocks',
            '/wp/v2/oembed',
            '/wp/v2/posts',
            '/wp/v2/pages',
            '/wp/v2/block-renderer',
            '/wp/v2/search',
            '/wp/v2/categories'
        );
    
        if ( ! is_user_logged_in() ) {
            foreach ( $endpoints_to_remove as $rem_endpoint ) {
                // $base_endpoint = "/wp/v2/{$rem_endpoint}";
                foreach ( $endpoints as $maybe_endpoint => $object ) {
                    if ( stripos( $maybe_endpoint, $rem_endpoint ) !== false ) {
                        unset( $endpoints[ $maybe_endpoint ] );
                    }
                }
            }
        }
        return $endpoints;
    }

    這樣,現在開啟的唯一端點是由外掛程式安裝的端點。

    有關您網站上活動的端點的完整列表,請參閱https://YOURSITE.com/wp-json/

    #

    您可以根據您的要求隨意編輯 $endpoints_to_remove 陣列。

    如果您有自訂貼文類型,請確保將它們全部新增到清單中。

    就我而言,我還將預設端點前綴wp-json 更改為 mybrand-api。這應該會對發出數千個暴力請求的機器人起到威懾作用。

    這是我所做的:

    // Custom rest api prefix (Make sure to go to Dashboard > Settings > Permalinks and press Save button to flush/rewrite url cache )
    add_filter( 'rest_url_prefix', 'rest_api_url_prefix' );
    function rest_api_url_prefix() {
        return 'mybrand-api';
    }

    回覆
    0
  • P粉512363233

    P粉5123632332024-01-11 12:47:36

    根據作者最初的問題,我選擇了來自WordPress 官方建議的選項2(https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions /#can-i-disable-the-rest-api)。因此,只需放入你的functions.php,只讓登入的用戶使用其餘的API(但只需交叉檢查原始鏈接,以防我的程式碼區塊過時;)): 更新(2021年10月1日):

    #
    add_filter( 'rest_authentication_errors', function( $result ) {
        // If a previous authentication check was applied,
        // pass that result along without modification.
        if ( true === $result || is_wp_error( $result ) ) {
            return $result;
        }
    
        // No authentication has been performed yet.
        // Return an error if user is not logged in.
        if ( ! is_user_logged_in() ) {
            return new WP_Error(
                'rest_not_logged_in',
                __( 'You are not currently logged in.' ),
                array( 'status' => 401 )
            );
        }
    
        // Our custom authentication check should have no effect
        // on logged-in requests
        return $result;
    });

    回覆
    0
  • 取消回覆