Deaktivieren Sie die WP REST API sicher
P粉463811100
P粉463811100 2024-01-10 16:27:31
0
2
515

Ich habe versucht, die Sicherheit meiner Wordpress-Seite zu verbessern, und habe dabei festgestellt, dass die WP-REST-API standardmäßig aktiviert ist (ab WP 4.4, wenn ich mich richtig erinnere).

Wie kann ich es sicher deaktivieren?

„Sicher“ bedeutet hier, dass es keine unbeabsichtigten Nebenwirkungen verursacht, z. B. dass keine anderen WP-Kernfunktionen beeinträchtigt werden.

Eine Möglichkeit besteht darin, .htaccess zu verwenden, um die Regeln neu zu schreiben, aber überraschenderweise habe ich keine „offiziellen“ Anweisungen dafür gefunden.

Jede Hilfe oder jeder Rat ist sehr willkommen :)

Update: Plugins von Drittanbietern sind nicht die Lösung, nach der ich suche. Obwohl ich weiß, dass es viele Tools gibt, die diese Aufgabe lösen können, enthalten sie viele zusätzliche Funktionen, die die Website verlangsamen können. Ich hoffe, dass es für dieses Problem eine einzeilige Lösung ohne den zusätzlichen Aufwand eines Plugins gibt.

Update 2: Dies ist die offizielle Meinung von WordPress: https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i-disable-the-rest-api

Demnach hofft das WordPress-Team, dass zukünftige WP-Funktionen auf der neuen REST-API basieren. Das bedeutet, dass es keine sichere Möglichkeit gibt, die REST-API zu deaktivieren.

Wir hoffen nur, dass es genügend Sicherheitsexperten gibt, die für die WP-Sicherheit verantwortlich sind.

Update 3:

Im WordPress-API-Handbuch ist eine Problemumgehung verfügbar: Sie können eine Authentifizierung für alle Anfragen verlangen

Dadurch wird sichergestellt, dass der anonyme Zugriff auf die REST-API der Website deaktiviert ist und nur authentifizierte Anfragen gültig sind.

P粉463811100
P粉463811100

Antworte allen(2)
P粉478445671

接受的答案会禁用未经身份验证的用户的所有 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';
}
P粉512363233

根据作者最初的问题,我选择了来自 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;
});
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage