web-dev-qa-db-fra.com

Limiter les sessions à une IP à la fois

Sur un site avec des abonnements de compte utilisateur premium, j'aimerais pouvoir limiter les connexions à un ordinateur à la fois. Le moyen le plus simple d'y parvenir serait de limiter par IP, mais je n'ai pas eu la chance de trouver un plugin pour y parvenir. Est-ce que quelqu'un en sait un que je peux utiliser pour obtenir cette fonctionnalité?

Lié: Question de sécurité de connexion - Est-ce que WP m'indique si je suis connecté depuis plusieurs endroits?

5
Gavin

Comme déjà suggéré dans un commentaire ci-dessus, techniquement, une session (basée sur les cookies) est limitée à une adresse IP à la fois en utilisant le Safer Cookies (plugin WordPress) .

Cela n'empêche pas une autre connexion avec le même nom d'utilisateur et le même mot de passe car c'est une fonctionnalité de WordPress qui vous permet de vous connecter plusieurs fois avec vos informations d'identification et donc avec plusieurs adresses IP.

Ce que vous souhaitez réaliser est d’empêcher l’ouverture de plusieurs connexions. Selon Otto , ce n'est pas trivial. Stacy écrit , que le Membre de la liste de souhaits (plug-in Wordpress) intègre une telle fonctionnalité: Protection de la connexion IP . Donc, probablement que ce plugin ou une partie de celui-ci est une solution à votre problème. IANAL , mais ce plugin viole la licence GPL car il vous empêche d’utiliser votre dérivé de wordpress . Je ne l'utiliserais pas.

Mais il y a probablement un autre plugin disponible, ou il est assez facile d'étendre Login LockDown (Plugin Wordpress) pour lier toute la session à la dernière adresse IP valide enregistrée.

5
hakre

L'utilisateur ne peut se connecter qu'à partir d'un ordinateur à la fois. Si l'utilisateur est inactif pendant 30 minutes, il peut se connecter depuis un autre ordinateur. Essayez dans différents navigateurs. Vous devez faire 2 étapes:

  1. Créez 2 colonnes (uni_hash, session_time) dans la table - wp_users, dans votre base de données.
 "ALTER TABLE` wp_users` ADD COLUMN `uni_hash` VARCHAR (80) NOT NULL"; 
 "ALTER TABLE` wp_users` ADD COLUMN `session_time` int (11) DEFAULT NULL"; 

2./Collez ce code dans function.php.

<?php
function myStartSession() {
    if(!session_id()) {
        session_start();}
}

function myEndSession() {
    session_unset();
    session_destroy(); 
}

if( !function_exists('single_user_login_uid_create')){
    function single_user_login_uid_create($ID){
            global $wpdb;
            $get_hash = $wpdb->get_results("SELECT uni_hash FROM `wp_users` WHERE user_login='".$ID."'");           
            if(isset($_COOKIE["user_uni_uid".$ID.""])){
                     $user_uni_uid = $_COOKIE["user_uni_uid".$ID.""];                    
                     if($get_hash[0]->uni_hash == ''){ $hash_result = $_COOKIE["user_uni_uid".$ID.""];}
                        else{$hash_result = $get_hash[0]->uni_hash; }   
                }else{
                     $user_uni_uid = 'hash';
                     if($get_hash[0]->uni_hash != ''){ $hash_result = $get_hash[0]->uni_hash;}
                        else{$hash_result = 'hash'; }               
                     }

                     $check_time = $wpdb->get_results("SELECT session_time FROM `wp_users` WHERE user_login='".$ID."'");            
                     if(!is_null($check_time)){$time_result = $check_time[0]->session_time;}
                     else{$time_result = time()-2000;}  

            if( (time() - $time_result < 1800)&&($hash_result != $user_uni_uid) ){
                     myEndSession();
                     wp_clearcookie();
                     wp_die('<h1>User is login! </h1>', '', array( 'back_link' => true ));                   
                     do_action('wp_logout');
                     nocache_headers();
                     $redirect_to = home_url();
                     wp_redirect($redirect_to);                  
                     exit();            
                }else{                                   
                     $_SESSION["LAST_ACTIVITY"] = time();
                     $new_time = $_SESSION["LAST_ACTIVITY"];
                     $randUID = md5(microtime().$_SERVER['REMOTE_ADD'] );
                     $sql = "UPDATE  `wp_users` set `uni_hash`='".$randUID."', `session_time`='".$new_time."' WHERE user_login='".$ID."'";
                     $wpdb->get_results($sql);
                     setcookie("user_uni_uid", $randUID, 9999999999);
                }       
            }
        } 

if( !function_exists('single_user_login_uid_check')){
    function single_user_login_uid_check(){
        global $wpdb;       
        $ID = wp_get_current_user();
        $logout_url = wp_logout_url(home_url());
        $user_uni_uid = $_COOKIE["user_uni_uid".$ID->user_login.""];
        $sql = "SELECT  uni_hash FROM  `wp_users` WHERE uni_hash='".$user_uni_uid."'";      
        $getinfo = $wpdb->get_results($sql); 
        $check_time = $wpdb->get_results("SELECT session_time FROM `wp_users` WHERE user_login='".$ID->user_login."'");         
        if(!is_null($check_time)){$time_result = $check_time[0]->session_time;}
        else{$time_result = time()-2000;}       

        if(($getinfo[0]->uni_hash != $user_uni_uid)&&(time() - $time_result < 1800)&&(is_user_logged_in()) ){
            wp_clearcookie();
            myEndSession();
            do_action('wp_logout');
            nocache_headers();
            $redirect_to = home_url();
            wp_redirect($redirect_to);
            exit();
        }else{
            myStartSession();
            if(!isset($_SESSION["LAST_ACTIVITY"])){$_SESSION["LAST_ACTIVITY"] = time(); }           
            elseif (time() - $_SESSION["LAST_ACTIVITY"] > 120) {
               $_SESSION["LAST_ACTIVITY"] = time();
            }              
               $new_time = $_SESSION["LAST_ACTIVITY"];
               $sql = "UPDATE  `wp_users` set `session_time`='".$new_time."' WHERE user_login='".$ID->user_login."'";
               $wpdb->get_results($sql);            
        }       
    }
}
add_action('wp_login', 'myStartSession', 1);
add_action('wp_login','single_user_login_uid_create');
add_action('wp_logout', 'myEndSession');
add_action('init','single_user_login_uid_check');
?>
0
vaofft