2

ユーザーがサイトで正常に認証されると、ユーザー ID をセッションに保存します。$_SESSION['user_id']

次に、これをサイト全体で使用して、ユーザーが特定のアクションを実行できるかどうかを確認します。例えば

if(isset($_SESSION['user_id'])){
    //User is logged in, allow the following.
    ...
}

...

if ( $_SESSION['user_id'] == $comment_user ) {
    //User owns the comment, go ahead and delete it.
    ...
}

ただし、サインインしたユーザーが悪意のある目的を持っていることを発見した場合、これらの安全なアクションを実行できないようにするにはどうすればログイン セッションを強制終了できますか?

ユーザーをブロックするには、データベースでログインの詳細を無効にするか、認証時にチェックされるブロックリストに追加して、認証できないようにします。ただし、これは次回のログイン試行時にのみ有効です。現在のセッションがアクティブなままであり、ユーザー ID がセッションに保存されている限り、認証されたと見なされます。

  1. ログアウトを強制して、特定のセッションの設定を解除する方法はありますか? どのように?
  2. そうでない場合、ブロックされたユーザーが引き続きサイトの安全な領域にアクセスできないようにする最善の方法は何ですか? たとえば、私の唯一のアイデアは、単にチェックするのではなくif(isset($_SESSION['user_id']))、追加のチェックを追加して、user_id がデータベースの「ブロックされたユーザー」リストに追加されていないことを確認することです。ユーザーが何らかのアクションを実行するたびに、ユーザーがブロックされたリストにアクセスしたかどうかを確認するために別の db リクエストが行われるのが好きではありません。特に、ユーザーをブロックすることはめったにないためです。データベースにアクセスせずにユーザーがブロックされているかどうかを確認する方法はありますか?

ありがとう!

編集

これまでのほとんどの回答は、セッションの設定を解除/破棄する方法、またはユーザーが次のログイン試行をブロックする方法に対処しています。残っている唯一の質問は、現在ログインしているユーザーがブロックされているかどうかを確認する方法だと思います。ユーザーが実行するたびに「ブロックされたユーザー」リストを確認するためにDBに行かずにこれを行う方法はありますか?行動。これは、上記の太字のイタリック体である私の主な問題に関連しています。ユーザーがブロックされている場合は、すぐにセッションを破棄して (ログアウトを強制する)、再度認証することもできなくなります。

4

5 に答える 5

0

DB を使用し、そこにセッション ID を保存し、将来のログインを禁止すると仮定すると、これを達成する最も簡単な方法は、ファイル システムからセッション ファイルを追加で削除することです。


セッションファイルの検索

PHP セッションは、多くの場合、/tempまたは/tmpまたは/var/lib/php5/ディレクトリに保存されます (場所によって異なります)。デフォルト session.save_pathは に設定されていますが""、次を使用して場所を設定できます。

session_save_path('/path/to/session/dir');

またはあなたの.htaccessファイルでも:

php_value session.save_path /path/to/session/dir/


セッションファイルの保存方法

セッション ファイルはsess_、ファイル システム内で接頭辞として次のように付けられます。

-rw-------  1 www-data www-data    0 2013-04-19 05:39 sess_141d2215ce74452ea6b1f69eea228159

上記の例には、次のものが含まれています。

AutoLogout|s:4:"3600";FirstName|s:4:"John";Lang|s:2:"en";LastLogin|s:19:"2013-04-19 17:26:18";LastName|s:8:"Smith";RegDate|s:19:"2012-11-12 17:18:13";TimeOut|i:1366421178;UserEmail|s:22:"johnsmith@domain.com";UserId|s:1:"3";authenticatedUser|s:22:"johnsmith@domain.com";year|s:4:"2013";

ID の記録がある限り (DB を想定)、プログラムで削除できます。


PHPを使用してセッションファイルを即座に削除する

PHP は を使用してファイルを削除する機能を提供するunlink()ため、ユーザーを禁止して (将来) ログインを禁止する場合、このようなものを禁止関数に追加するか、インスタントキック関数を作成することで、即座に禁止することもできます。 、次のようなものを使用:

$sessionID = 'sess_'.$sessionIdFromDB;
$sessionDir = '/path/to/session/dir'; // Wherever your sessions are stored
unlink($sessionDir."/".$sessionID); 

ただし、この手法は、問題のセッション ファイルを削除する権限があることを前提としています。そうでない場合は、ファイルのアクセス許可を調整するか、chown()および/またはchmod()ファイル システムでそれらを変更する必要があります。


手動削除

ターミナルを使用して手動でセッション ファイルを削除することもできます。これは無意味に思えるかもしれませんが、ビジネス固有の何かを行う前に、すべてのユーザーを即座に追い出すために過去に使用されたのを見てきました。

//SSH
cd /path/to/session/dir
rm -rf sess_*

一度実行すると、すべてのユーザー セッションが無効になります。

于 2013-03-20T02:03:27.580 に答える
0

認証にセッションを使用する場合、従来はユーザー名と、セッション変数として保存されたある種のハッシュ化されたパスワードを使用して行われていました。これに関する良いリソースは次のとおりです。ログインフォームでユーザーを認証するためのphpセッション

ユーザーのセッションを終了するには:

セットアップでは、ユーザーがセッションを終了するためにセッション変数を削除するだけです

unset($_SESSION['user_id']);

または、次のようにセッションを終了することもできます。

session_destroy();
于 2013-03-20T01:47:35.150 に答える
0

私はセッションテーブルに自爆を入れる傾向があります。次回のログイン時に、アプリはこれをチェックします。

if (!!$_SESSION['data']['self_destruct'])
{
    session_destroy();
    header('Location:/');
    exit;
}
于 2013-03-20T02:00:02.970 に答える
0

ユーザー ID がわかっている場合は、いつでも次のようなことができます。

$maliciousUsers = array(1,3,19,24);

if(in_array($_SESSION['user_id'], $maliciousUsers)){
    @session_destroy();
}

$maliciousUsersデータベース内のテーブルとして配列を作成します。このようにして、何かが起こっているのを見つけたら、その ID をテーブルに放り込むと、それが反映されます。それらが認証され、then を受信できる場合$_SESSION['user_id']、これはそれを破棄します。

于 2013-03-20T01:52:38.060 に答える
-1

ログアウトを強制して、特定のセッションの設定を解除する方法はありますか? どのように?

クイックログアウトを実行することをお勧めします

May be late but commented

//適宜変更!

function doLogout()
{
        //clear session from globals
        $_SESSION = array();
        //clear session from disk
        session_destroy();
        //delete the session cookie using setcookie.
        $cookieParams = session_get_cookie_params();
        setcookie(session_name(), '', 0, $cookieParams['path'], $cookieParams['domain'], $cookieParams['secure'], $cookieParams['httponly']);
        //unset the session variable
        unset($_SESSION);
        doBlock();   

}

    function doBlock()
        {               

     //Start and Set Blocking session ,presence of it must be 
    //validated at first on any secure Areas Entrance   , 
   //it may not be secure if Session is Cleared by end Mal User) ,
  // if extreme   security is needed  then
 //Ugly block Remote IP is needed //(12-24 hr) Block

 }

クエストが重複している可能性があります:セッションを完全に破棄する最良の方法 - ブラウザが閉じていなくても
PHP セッション配列から変数を削除する方法

于 2013-03-20T02:32:09.623 に答える