Безопасное отключение 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-isisable-the-rest- апи

В соответствии с этим, команда Wordpress хочет, чтобы будущая функциональность WP зависела от нового REST API. Это означает, что не существует гарантированного безопасного способа отключения REST API.

Давайте просто надеяться, что есть достаточно экспертов по безопасности, заботящихся о безопасности WP.

Обновление 3:

Обходной путь представлен в WordPress API Handbook - вы можете требовать аутентификацию для всех запросов

Это гарантирует, что анонимный доступ к REST API вашего сайта отключен, будут работать только аутентифицированные запросы.

Ответ 1

Из оригинального вопроса автора я выбрал вариант 2, полученный из официальных рекомендаций Wordpress (https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i -disable-the-rest-api). Так что просто поместите ваш файл functions.php, чтобы позволить только зарегистрированным пользователям использовать остальные API:

add_filter( 'rest_authentication_errors', function( $result ) {
    if ( ! empty( $result ) ) {
        return $result;
    }
    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
    }
    return $result;
});

Ответ 2

В конце концов, отключение REST API не было плохой идеей. Это фактически открыло огромную дыру во всех сайтах !

В WordPress 4.4 был способ

Здесь я нашел возможное решение с помощью .htaccess но его следует тщательно протестировать в сочетании с тем, что есть в вашем файле .htaccess (например, правилами pretty-url, добавленными самим wordpress):

# WP REST API BLOCK JSON REQUESTS 
# Block/Forbid Requests to: /wp-json/wp/
# WP REST API REQUEST METHODS: GET, POST, PUT, PATCH, DELETE
RewriteCond %{REQUEST_METHOD} ^(GET|POST|PUT|PATCH|DELETE) [NC]
RewriteCond %{REQUEST_URI} ^.*wp-json/wp/ [NC]
RewriteRule ^(.*)$ - [F]

Очень радикальный метод - также иметь веб-страницу 404.html в корне, а затем добавить эту строку:

# WP REST API BLOCK JSON REQUESTS 
# Redirect to a 404.html (you may want to add a 404 header!) 
RewriteRule ^wp-json.*$ 404.html

Обратите внимание, что если вы не используете статическую страницу, т.е. не связаны с функциями WordPress, если вы хотите вернуть ошибку 404 с соответствующей страницей ошибок, это отдельная тема, с множеством проблем, связанных с Wordpress.

Ответ 3

Вы можете отключить его для запросов, отличных от localhost:

function restrict_rest_api_to_localhost() {
    $whitelist = [ '127.0.0.1', "::1" ];

    if( ! in_array($_SERVER['REMOTE_ADDR'], $whitelist ) ){
        die( 'REST API is disabled.' );
    }
}
add_action( 'rest_api_init', 'restrict_rest_api_to_localhost', 0 );

Ответ 4

С помощью плагина " Отключить REST API " вы можете выбрать, какие API вы хотите включить, например, контактную форму 7 API. Ознакомьтесь с настройками плагина (yoursite.com/wp-admin/options-general.php?page=disable_rest_api_settings)

Ответ 5

Если вы используете Nginx, это быстрый способ заблокировать (но не отключить)/wp-json. Вы можете добавить их в свой блок сервера:

   location ~* /wp-json/.* {
    deny all;
    access_log off;
    log_not_found off;
}

Чтобы также заблокировать перечисление пользователей через RSS-канал

location ~* /feed/.* {
    deny all;
    access_log off;
    log_not_found off;
}