Déconnecter les utilisateurs inactifs de WordPress

Par Alan Pilloud
Publié le 27 juillet 2017

Sans cette mesure de sécurité, les utilisateurs peuvent oublier de se déconnecter et rendent disponible leurs informations, qui pourraient être confidentielles.

Heureusement, déconnecter automatiquement un utilisateur de WordPress au bout d’un temps donné est une mesure de sécurité simple à mettre en place.

Dans cet exemple, seuls les utilisateurs connectés au frontend sont concernés. Bien entendu, le code est adaptable afin de s’appliquer à l’interface d’administration aussi.

Connaître le temps passé sur une page

Pour que l’on sache si l’utilisateur doit être déconnecté, il faut savoir quel temps passe entre deux requêtes.

On défini donc un temps maximum d’inactivité.

Lorsque l’utilisateur se connecte, on enregistre le timestamp actuel en base de données.

A chaque changement de page, on compare le timetamp actuel avec celui prédécemment enregistré.

Si le delta de temps est plus petit que temps max. d’inactivité, on laisse l’utilisateur continuer et on enregistre le timestamp actuel à la place de l’ancien.

Si le delta est plus élevé, on déconnecte l’utilisateur et on le redirige vers la page d’accueil.

J’ajoute un paramètre show_login à l’url ce qui me permet de montrer une popup de login à l’utilisateur via JavaScript. Libre à vous de l’adapter ou l’enlever.

Refléter le temps d’inactivité en JavaScript

Comme l’inactivité est mesurée côté serveur, on n’a pas besoin de mesurer une réelle inactivité en JavaScript (genre, la souris ne bouge pas). Il suffit donc de rediriger l’utilisateur vers la page d’accueil au bout du temps maximum d’inactivité grâce à setTimeout.

J’ajoute 5 secondes au temps maximum d’inactivité juste pour être bien sûr d’être synchro avec le serveur.

Le code

Le code suivant est utilisable directement, vous pouvez le prendre et l’enregistrer dans le répertoire wp-content/mu-plugins de votre install WordPress.

Adaptez la constante MAX_INACTIVITY_DURATION au temps en secondes qui vous convient (10mn dans le code).

<?php
/*
Plugin Name: Logout Inactive Users
Description: Implements better security by logging out inactive users
Version: 0.1
*/

define('MAX_INACTIVITY_DURATION', 60*10); // duration in seconds

/**
 * Register the new time at login
 */
add_action('wp_login', function ($login) {
    // The user has just logged in, get its informations and set the new time in the database
    $user = get_userdatabylogin($login);
    update_user_meta($user->ID, 'last_interaction', time());
});

/**
 * Measure the amount of time between two requests
 * Logout if the time is too long
 */
add_action('wp_loaded', function () {
    // bail early if user is not logged in
    if(!is_user_logged_in()) {
        return false;
    }

    $user_ID = get_current_user_id();
    $last_interaction = get_user_meta($user_ID, 'last_interaction', true);

    if ((time() - $last_interaction) < MAX_INACTIVITY_DURATION) {
        // there is still time left, update the last_interaction time
        update_user_meta($user_ID, 'last_interaction', time());
        return;
    }

    // logout the user and redirect to homepage
    wp_logout();
    wp_redirect(add_query_arg('show_login', 'true', get_home_url()));
    exit;
});

/**
 * Add a JS timeout too
 */
add_action('wp_footer', function () {
    // bail early if user is not logged in
    if(!is_user_logged_in()) {
        return false;
    }

    echo '<script>
    setTimeout(function() {
        document.location.href = "'. add_query_arg('show_login', 'true', get_home_url()).'";
    }, '.(MAX_INACTIVITY_DURATION + 5).' * 1000);
    </script>';
});

Le filtre auth_cookie_expiration permet d’indiquer une durée de validité du cookie d’authentification WordPress en secondes.

Ce n’est pas exactement ce que nous cherchons à faire dans notre cas, puisque cela limiterait la durée totale de connection.

Dans notre cas, on serait connecté pour 10mn, peu importe notre activité sur le site.

Voir la documentation du filtre

Autres mesures de sécurité

D’autres articles sont à paraître dans le même thème. Voici ceux qui vont être publiés prochainement :

  • Supprimer le nom d’utilisateur du cookie d’authentification WordPress
  • Se protéger du click-jacking
Envie d'en parler ?

Ecrivez un email ou DM sur twitter