Désactiver la remise à zéro du mot de passe de WordPress

12 commentaires
Désactiver la remise à zéro du mot de passe de WordPress

Pour sécuriser votre site WordPress des hackeurs, une bonne technique consiste à empêcher le changement de mot de passe depuis un compte utilisateur ainsi que par mail. En utilisant ce hack, seuls les administrateurs connectés pourront effectuer cette manipulation.

Mise à jour : Julio de BoiteAWeb m’a proposé une version modifié pour améliorer la sécurité du script. La voici et merci à lui !

<?php
/*
* Plugin Name: Password Reset Removed
* Description: Removes the ability for non admin users to change/reset their passwords.
* Version: 1.1
* Author: Derek Herman ; Modified by Juliobox (boiteaweb.fr)
* Author URI: http://valendesigns.com
*/
add_filter( 'show_password_fields', 'baw_prr_i_am_admin' );
add_filter( 'allow_password_reset', 'baw_prr_i_am_admin' );
add_filter( 'gettext', 'baw_prr_remove_me' );

function baw_prr_i_am_admin()
{
return is_admin() && current_user_can('administrator');
}
function baw_prr_remove_me($text)
{
return str_replace( array('Lost your password?', 'Lost your password'), '', trim($text, '?') );
}

function baw_prr_no_password_change( $dummy1, $dummy2, $user )
{
if( !baw_prr_i_am_admin() )
unset( $user->user_pass );
}
add_action( 'user_profile_update_errors', 'baw_prr_no_password_change', 10, 3 );
?>

Proposé par Derek Herman, ce script PHP empêchera les utilisateurs non administrateurs de réinitialiser leur mot de passe.

Le voici dans son intégralité :

<?php
/*
* Plugin Name: Password Reset Removed
* Description: Removes the ability for non admin users to change/reset their passwords.
* Version: 1.0
* Author: Derek Herman
* Author URI: http://valendesigns.com
*/
class Password_Reset_Removed
{

function __construct()
{
add_filter( 'show_password_fields', array( $this, 'disable' ) );
add_filter( 'allow_password_reset', array( $this, 'disable' ) );
add_filter( 'gettext', array( $this, 'remove' ) );
}

function disable()
{
if ( is_admin() ) {
$userdata = wp_get_current_user();
$user = new WP_User($userdata->ID);
if ( !empty( $user->roles ) && is_array( $user->roles ) && $user->roles[0] == 'administrator' )
return true;
}
return false;
}

function remove($text)
{
return str_replace( array('Lost your password?', 'Lost your password'), '', trim($text, '?') );
}
}

$pass_reset_removed = new Password_Reset_Removed();
?>

Pour l’installer sur votre WordPress, connectez-vous sur votre serveur FTP à l’aide de votre client favori – FileZilla, Tansmit, etc. Créez un nouveau dossier que vous nommerez mu-plugins dans le répertoire /wp-content/

Ce dossier présente une particularité propre à WordPress : tous les plugins présents à l’intérieur seront activés d’office – d’où le nom de must-use pour mu.

Envoyez le script PHP que vous aurez préalablement télécharger ou copier dans un nouveau fichier que vous nommerez par exemple lost-password.php.

Vous pouvez également télécharger directement le script à partir du lien suivant :

Password Reset Removed

Plugin WordPress pour empêcher la réinitialisation de mot de passe.

Taille : 1,4 Ko  • Hits : 1 144

Cette technique a été mise en place sur WordPress Channel afin d’améliorer le niveau de sécurité général. N’oubliez pas d’user d’un mot de passe solide et de le changer régulièrement.

Par Aurélien Denis

Consultant & Développeur WordPress / WooCommerce. Un site à créer, à maintenir ou à débuguer ? Contactez-moi.

12 commentaires
  1. Laurent

    Bonjour, peut-on mettre en place ce script et autoriser les “clients” (customer) enregistrés à contourner l’interdiction ?

  2. Alex

    Bonjour,
    Je n’arrive pas à mettre en place cette solution, la fonction est toujours active chez moi.
    Pouvez-vous m’aider ?

  3. d'haene

    Bonjour navré de laisser un commentaire sur un post vieux de presque deux ans mais je voulais savoir si il etait toujours judicieux d’installer ce mu-plugin avec la nouvelle version de wordpress ?
    Et si oui pouvez vous me precisez la demarche a suivre, en effet il y a quelque etapes qui m’échappe :
    1)dans le répertoire /wp-content/mu-plugins déposer le fichier php contenant le premier script de la page
    2)”Envoyez le script PHP que vous aurez préalablement télécharger ou copier dans un nouveau fichier que vous nommerez par exemple lost-password.php”. ?!?!?!
    Parlez vous d’un autre script ou du meme ? (Password Reset Removed = lost-password.php?????)

    Merci a toi et julio potier
    je ne commente pas beaucoup mais suit vos actus/astuce/hack/test et autres articles que vous publier a tous les deux.
    Depuis que je me suis lancer dans l’aventure wordpress les scripts donner comme ca me font peur : ne sachant pas les comprendre completement(ou pas du tout d’ailleurs) il est legitime de ce demander si la personne qui le met a disposition est fiable et n’as pas lancer “une porte d’entré” grande ouverte pour les hackeurs.

    La correction de julio est rassurante ^^

    Continuer comme ça les gars, bravo pour la motiv des divers tuto
    (une idéé comme ca : avez vous deja penser a demander un espace sur le site wordpress ou vous pourriez mettre à disposition les tutos fiables et pertinent pour faciliter leur accés au nouveau comme moi ???)
    Cordialement

    1. Aurélien Denis auteur de l’article

      Pour l’avoir testé à l’instant (il est en place sur ce site), le script fonctionne bien. Attention toutefois à ne pas l’installer si WordPress dispose d’un espace membre (en WooCommerce notamment) car cela bloquerait la réinitialisation des mots de passe des clients.

      Merci du soutien ! 😉

  4. marc metzger

    Bonsoir, je découvre ce site avec grand intérêt, félicitations pour le travail… Je serai intéressé pour voir la version final du script proposé par BoiteAWeb… Je débutes avec WP, alors pardonnez mon incompétence…
    Cordialement.

    1. Julio Potier (BoiteAWeb)

      Bonsoir, mon code est celui qui est en premier dans l’article. Le second est l’original.
      A bientôt !

  5. BoiteAWeb

    Voilà, article à jour, merci Aurélien, j’ai modifié la fonction « disable » pour qu’elle soit optimisée (une seule ligne), j’ai supprimé la classe (inutile), j’ai ajouté un hook sur l’update du profil avec ‘user_profile_update_errors’ et son 3ème paramètre « user ». Il me suffit de supprimer le pass pour qu’il ne soit pas mis à jour.
    Là maintenant on ne peut VRAIMENT plus changer son pass, même si on est un hacker 😉

    1. Aurélien Denis auteur de l’article

      Good job ! 😎

  6. BoiteAWeb

    Bonjour !
    Attention, il est tout de même possible de modifier le mot de passe avec ce plugin !
    Je viens de tester et c’est tout à fait faisabl “pour un hacker”.
    Ne pas confondre “show” et “allow”, donc show_password_fields=false empêche juste l’affichage des champs mais pas la modification du pass.
    Voilà pour l’info du jour :]

    1. Aurélien Denis auteur de l’article

      Salut !

      Et tu penses que l’on pourrait améliorer ce script pour corriger ce problème ou pas du tout ? 🙂

  7. informatique grenoble

    je suis passer totalement à coté de cette fonction mais d’un autre coté, je trouve ca dérangeant de désactiver cette fonction …

    surtout que je vois pas comment un user peut recuperer le mdp …

    tant qu’on se connecte avec droits restreints, en https et les sauvegqrdes OK, je vois pas trop le pb en fait …

    merci pour cet éclairage !

    Sebastien

    1. Aurélien Denis auteur de l’article

      C’est simple : un non admin ne peut pas réinitialiser son mot de passe.

      De fait, si un hacker tente de faire quelque chose (c’est courant en ayant piraté le compte mail) c’est impossible.

Laisser un commentaire