web-dev-qa-db-ja.com

一度に1つのIPにセッションを制限する

プレミアムユーザーアカウントを購読しているサイトでは、一度に1台のコンピュータにログインを制限できるようにしたいです。これを達成するための最も簡単な方法はIPで制限することですが、私はこれを達成するためのプラグインを見つけることができませんでした。誰かが私がこの機能を手に入れるのに使えるものを知っていますか?

関連: ログインのセキュリティに関する質問 - 複数の場所からログインしている場合、WPに表示されますか。

5
Gavin

私の上記のコメントですでに示唆したように、技術的には( - クッキーベースの)セッションは より安全なクッキー(WordPressプラグイン) を使用することによって一度に一つのIPに制限されます。

これは、同じユーザー名とパスワードを使用した別のログインを妨げることはありません。これは、自分の資格情報、つまり複数のIPを使用して複数回ログインできるようにするWordPressの機能だからです。

あなたが達成したいことは、その時はまったく複数のログインを防ぐことです。 Ottoによれば 、これは些細なことではない。 ステイシーはウィッシュリストメンバー(Wordpress Plugin) にはそのような機能が組み込まれていると考えています: IPログイン保護 。だから、おそらくそのプラグインまたはその一部はあなたの問題に対する解決策です。 _ ianal _ しかし、そのプラグインはGPLライセンスに違反しているため、 ワードプレスの派生物を利用することが制限されています 。私はそれを使わないでしょう。

しかし、おそらく利用可能な別のプラグインがあるか、または Login LockDown(Wordpress Plugin) セッション全体を最後に記録された有効なIPにバインドすることは非常に簡単です。

5
hakre

ユーザーは一度に1台のコンピューターからのみログインできます。ユーザーが30分アクティブでない場合、彼は他のコンピュータからログインできます。別のブラウザで試してください。あなたは2つのステップを踏まなければなりません:

  1. あなたのデータベースのtable - wp_usersに2つのカラム(uni_hash、session_time)を作成します。
 "ALTER TABLE` wp_users` ADD COLUMN `uni_hash` VARCHAR(80)NOT NULL"; 
 "ALTER TABLE` wp_users`追加カラム `session_time` int(11)DEFAULT NULL ____。]

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