1

PHP初心者です。ダッシュボード パネルにつながるユーザー登録/サインアップ システムを作成することができました。ユーザーは、セッションを使用してログインします。

セッション時間のスクリプトを作成し、セッションが 30 分後に期限切れになるようにしました。しかし、私の質問は、ユーザーが非アクティブな場合にのみ期限切れにする方法と、突然ユーザーがアクティブになった場合に期限切れを防ぐ方法です。

これが私のログインコードとダッシュボードコードです。私を助けてください。コード化されたヘルプをいただければ幸いです。

ありがとうございました

# ログインコード

    $_SESSION['username'] = $username;  
    $_SESSION['emailAddress'] = $email;  
    $_SESSION['LoggedIn'] = 1; 
    $_SESSION['start'] = time(); // taking now logged in time
    $_SESSION['expire'] = $_SESSION['start'] + (1 * 10) ; 

   header('Location: ../dashboard/');

# ダッシュボード コード

session_start();



if(empty($_SESSION['LoggedIn']) && empty($_SESSION['username']))  
{  


          echo  "<script>location.href='session-expired.php'</script>";

}
     elseif(!isset($_SESSION['LoggedIn']) && !isset($_SESSION['username']))
{
    echo  "<script>location.href='session-expired.php'</script>";

}
else
{

    $now = time(); 

    if($now > $_SESSION['expire'])
    {
        session_destroy();
         echo  "<script>location.href='session-expired.php'</script>";
    }

    else
    { 


?>

<!-- After all the html codes --!>


<?php
}
}
?>
4

2 に答える 2

1

ユーザーがアクティブになると、そのユーザーは再びページにアクセスするため、セッションの有効期限を移動する必要があります。必要なページ (ヘッダー インクルードなど) で使用されるインクルード ファイルがある場合は、これらの行を配置できます。

$_SESSION['start'] = time(); // taking now logged in time
$_SESSION['expire'] = $_SESSION['start'] + (1 * 10) ;

そのインクルードに。

于 2013-03-12T01:20:20.693 に答える
0

この質問に対する優れた回答を読むことをお勧めします: How do I expire a PHP session after 30 minutes?

しかし、その質問のアイデアを要約すると(そして実際にあなたの質問に答えます):

PHP の ini 構成を信頼しないでください。自動有効期限はすべてのリクエストで実行されるわけではなく、実行したくありません (現在のセッションだけでなく、ディスク上のすべてのセッションで実行されます)。

$_SESSION['expire']開始時刻から値を更新しないでください。現在時刻から更新します。これにより、「x 休止期間」の実際の動作に近づけることができます。

コードが最後にある場合は、常にdieまたはいつでも実行する必要があります。exitリダイレクトを実行すると、現在のページが終了し、現在のリクエストを別のページに引き継ぐという決定が下されました。

<script>location.href=</script>リダイレクトには使用しないようにしてください。次のように、ログイン コードで使用するサーバー側のリダイレクトに固執する必要がありますheader('Location: ../dashboard/');。これにはいくつかの理由があります。

  • 出力を開始する前に、すべての準備作業 (セッション、リクエスト処理など) を実行するようにしてください。出力は、 、 、 、echoまたはタグprintdumps外側にあるものです。<?php ?>これらはすべてクライアントにデータを送信し、それが開始されると、サーバー上で特定のことを行うことができなくなります。これは、php 開発者が経験する非常に一般的な問題「ヘッダーは既に送信されています」につながります。
  • サーバー側のリダイレクトを使用すると、適切なHTTP 応答コードが設定されます。JavaScript を使用することはできません。すべてのブラウザは HTTP をサポートしていますが (これがブラウザと同じです)、すべてのブラウザが javascript をサポートしているわけではありません。さらに、ユーザーのブラウザーが JavaScript をサポートしている場合でも、ユーザーはあなたのサイトや不明なサイトで JavaScript を完全にブロックする可能性があります。Javascript はWeb サイトを強化する優れた方法ですが、重要な機能を Javascript に依存すると、脆弱性が発生し、ユーザーやサイトにさえ影響を与える可能性があります (JavaScript でサイトの内部動作を過度に公開する場合)。 、あなたが何をしても、クライアントは完全にアクセスできます...)。クライアントを信用しないでください。

[ のドキュメントには、次のsession_destroy][8]ように書かれています。

ユーザーをログアウトするなど、セッションを完全に強制終了するには、セッション ID も設定解除する必要があります。Cookie を使用してセッション ID を伝達する場合 (デフォルトの動作)、セッション Cookie を削除する必要があります。そのために setcookie() を使用できます。

セッションIDの設定を解除する方法について詳しく説明していませんが、次のようになります。

session_start();
session_unset();
session_destroy();
session_write_close();
// if using coookies
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);

だから私はあなたの# DASHBOARD CODEに対してこれを行います

session_start();
if(!isset($_SESSION['LoggedIn']) || empty($_SESSION['LoggedIn']) || !isset($_SESSION['username'] || empty($_SESSION['username']))  
{             
    header("Location: /session-expired.php");
    exit();
}
else
{
    $now = time();
    if($now > $_SESSION['expire'])
    {
        session_start();
        session_unset();
        session_destroy();
        session_write_close();
        // if using coookies
        setcookie(session_name(),'',0,'/');
        session_regenerate_id(true);
        header("Locaiton: /session-expired.php");
        exit();
    }
    else
    { 
        $_SESSION['expire'] = $now + 10;
    }
}

また、次の点に注意してください。

  • 最初は同じことを行うため、ログインしていないことの初期チェックをまとめることができます。
  • セッションの有効期限は 10 秒です。time()かなり低いですが、おそらくテスト目的でそれを行っているでしょうが、PHP を初めて使用すると言ったので、秒を使用していることを指摘したいと思います。
  • time()Unix エポックも扱っているため、2038 年に注意してください。
于 2013-03-12T02:00:38.193 に答える