Désactivez en toute sécurité l'API WP REST
P粉463811100
P粉463811100 2024-01-10 16:27:31
0
2
484

Je cherchais à améliorer la sécurité de mon site Wordpress et ce faisant, j'ai découvert que l'API WP REST est activée par défaut (à partir de WP 4.4 si je me souviens bien).

Quel est le moyen sûr de le désactiver ?

« Sûr » signifie ici que cela ne provoquera pas d'effets secondaires involontaires, tels que le fait de ne pas interrompre aucune autre fonctionnalité principale de WP.

Une façon possible est d'utiliser .htaccess pour réécrire les règles, mais étonnamment, je n'ai trouvé aucune instruction "officielle" pour ce faire.

Toute aide ou conseil est grandement apprécié :)

Mise à jour : Les plugins tiers ne sont pas la solution que je recherche. Bien que je sache qu'il existe de nombreux outils qui peuvent résoudre cette tâche, ils contiennent de nombreuses fonctionnalités supplémentaires qui peuvent ralentir le site Web. J'espère qu'il existe une solution en une seule ligne à ce problème sans la surcharge supplémentaire d'un plugin.

Mise à jour 2 : Ceci est l'avis officiel de WordPress : https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i-disable-the-rest-api

Selon cela, l'équipe WordPress espère que les futures fonctionnalités de WP s'appuieront sur la nouvelle API REST. Cela signifie qu'il n'existe aucun moyen sûr de désactiver l'API REST.

Nous espérons simplement qu'il y aura suffisamment d'experts en sécurité responsables de la sécurité de WP.

Mise à jour 3 :

Une solution de contournement est disponible dans le manuel de l'API WordPress : vous pouvez exiger une authentification pour toutes les demandes

Cela garantit que l'accès anonyme à l'API REST du site Web est désactivé et que seules les demandes authentifiées sont valides.

P粉463811100
P粉463811100

répondre à tous(2)
P粉478445671

La réponse acceptée désactive tous les appels API pour les utilisateurs non authentifiés, mais de nos jours, de nombreux plugins s'appuient sur cette fonctionnalité API.

La désactivation de tous les appels entraînera un comportement inattendu du site Web, ce qui m'est également arrivé lors de l'utilisation de ce code.

Par exemple, ContactForm7 utilise cette API pour envoyer les informations de contact à la base de données (je pense) et effectuer la validation ReCaptcha.

Je pense qu'il est préférable de désactiver certains points de terminaison (par défaut) pour les utilisateurs non authentifiés, comme ceci :

// 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;
}

De cette façon, les seuls points de terminaison ouverts maintenant sont ceux installés par le plugin.

Pour une liste complète des points de terminaison actifs sur votre site, voir https://YOURSITE.com/wp-json/

Vous êtes libre de modifier le tableau $endpoints_to_remove selon vos besoins.

Si vous avez des types de publications personnalisés, assurez-vous de tous les ajouter à la liste.

Dans mon cas, J'ai également modifié le préfixe du point de terminaison par défaut de wp-json 更改为 mybrand-api. Cela devrait dissuader les robots d’effectuer des milliers de requêtes par force brute.

Voici ce que j'ai fait :

// 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

Sur la base de la question originale de l'auteur, j'ai choisi l'option 2 de la suggestion officielle de WordPress (https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can- je-désactive-le-reste-api). Il suffit donc de mettre votre fichier function.php et de laisser uniquement les utilisateurs connectés utiliser le reste de l'API (mais vérifiez simplement le lien d'origine au cas où mon bloc de code serait obsolète ;) ): Mise à jour (1er octobre 2021) :

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;
});
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal