WordPress

bezpieczeństwo – Wymuszaj na użytkowniku zmianę hasła w interfejsie użytkownika przy pierwszym logowaniu i polityce haseł

  • 23 maja, 2020
  • 4 min read
bezpieczeństwo – Wymuszaj na użytkowniku zmianę hasła w interfejsie użytkownika przy pierwszym logowaniu i polityce haseł


Jest to wieloaspektowy problem, który prawdopodobnie wydaje się (przynajmniej dla mnie) łatwy na początku. Nie jestem pewien, czy kod działa, jednak jest blisko działania ale co najważniejsze, pokazuje przepływ tego, co musi się wydarzyć:

/**
 * First of all, hook up to the login process.
 */
add_action( 'wp_login', function( $user_login, $user ) {
    //Let's see if the user that just logged in has a proper password, meaning, he reset his default one to a custom one.
    $has_proper_password = get_user_meta( $user->ID, 'has_proper_password', True );

    //If he doesn't
    if( $has_proper_password === '0' ) {
        //Always redirect him to that password panel.
        wp_safe_redirect( wp_login_url( '?action=lostpassword' ) );
    }
});

Więc przede wszystkim podłączasz się do procesu logowania. Zakładam, że generujesz domyślne hasło dla użytkownika i wysyłasz je pocztą e-mail, a powodem, dla którego chcesz to zmienić, jest to, że zwykły tekst nigdy nie jest ważny, jeśli atakujący uzyska dostęp do medium, do którego został wysłany. Powrót do tematu, rdzeniem tego podsystemu będzie user_meta z flagą has_proper_password, w tym miejscu zapiszesz flagę, która powie nam, czy dany użytkownik zresetował swoje domyślne hasło. Za każdym razem, gdy się zalogują, jeśli nie zmienią swojego domyślnego hasła, zostaną po prostu przekierowani na ten twój ekran. Iść dalej.

Warto przeczytać!  Jak dostosować kolor tła edytora bloków WordPress

Następnie będziesz chciał pobrać aktualne zaszyfrowane hasło użytkownika, gdy spróbuje zresetować. Hak password_reset zapala się tuż przed tym:

//Let's store the old password, before the reset happened.
$old_password_hash="";

//We'll grab it from the 'password_reset' hook which fires right before the password is updated.
add_action( 'password_reset', function( $user, $new_pass ) {
    $old_password_hash = $user->user_pass;
});

Świetnie, teraz mamy hash użytkownika. Załóżmy, że nastąpiła udana zmiana haseł. Podsumowując, chcesz do tego wrócić user_meta a jeśli użytkownik nie zmienił swojego domyślnego hasła, postępuj zgodnie z logiką:

  1. Czy nowe hasło jest takie samo jak stare? Jeśli tak, przekieruj z powrotem do tego ekranu zmiany hasła z nową wiadomością lub czymś w tym rodzaju. Jeśli nie, kontynuuj.
  2. Tak więc nowe hasło jest zupełnie nowe — również ważne, świetnie, **wszystko, co teraz zrobimy, to je zaktualizujemy user_meta powiedzieć systemowi, że kiedy użytkownik zaloguje się ponownie, nie powinien go zatrzymywać i prosić o prawidłowe hasło, ponieważ już tam jest.
  3. Przekieruj albo do logowania, albo jeśli chcesz mieć ochotę, przekaż sesję przez kod, aby użytkownik nie musiał ponownie się logować.
Warto przeczytać!  php - Learndash Notifications - Wyślij powiadomienie, jeśli kurs nie został jeszcze ukończony

Wszystko to w kodzie:

//Second of all, hook up to the change password process.
add_action( 'after_password_reset', function( $user, $new_pass ) {
    $has_proper_password = get_user_meta( $user->ID, 'has_proper_password', True );

    /**
     * If, before this reset happened, the user still didn't have a proper password and now
     * he supposedly does
     */
    if( $has_proper_password === '0' ) {

        //First of all, is the password that was just updated the same as the one that we gave to them?
        if( wp_check_password( $new_pass, $old_password_hash ) === False ) {
            //Redirect back to that reset page? I don't know.
        }

        //But if it isn't and therefore the newly picked password is a different one, let the system know by attaching some data to the user.
        $update = add_user_meta(
            $user->ID,
            'has_proper_password',
            '1'
        );

        //If the update failed, no worries, next time the user will just be prompted to reset again, however, this is an issue you'll have to solve.
        if( $update === False ) {
            return;
        }
    }
});


Źródło