0

そのため、ログイン試行ごとにランダムなトークンを生成し、$_session['loginToken']ポストフォームチェック後に保存するログインシステムを使用して、セッション値がポストされた入力と等しいかどうかを確認します。ここで特定の時間後に手動でタイムアウトを設定することも見つけました: How do I expire a PHP session after 30 minutes?

問題は、最初のログイン試行時またはセッションの破棄後 (タイムアウト) $_SESSION が空の配列であり、何も設定されていませんが、2 回目の試行後には正常に動作します。

<?php
if(!isset($_SESSION))
    session_start();

print_r($_SESSION);
/*
first try output : Array ( )
second try output : Array ( [LAST_ACTIVITY] => 1345402023 [loginToken] => e3d997090751883feadfed3ae4d8b63e )
*/
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 10)) {
    session_destroy();
    $_SESSION = array();
}

$_SESSION['LAST_ACTIVITY'] = time();
$token = $_SESSION['loginToken'] = md5(uniqid(mt_rand(), true));
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<form method="post" action="<?=$_SERVER['PHP_SELF'];?>">
    <input type="hidden" name="token" value="<?=$token;?>" />
    <button type="submit" value="login" id="login" name="login">Click</button>
</form>
<body>
</body>
</html>
4

2 に答える 2

2

重要なヒントは、次のドキュメントにありますsession_destroy()

セッション変数を再度使用するには、session_start() を呼び出す必要があります。

セッションを破棄するとセッションも閉じられるため、変数を割り当てる前に、まず新しいセッションを再度開く必要があります。

于 2012-08-19T19:33:57.410 に答える
2

よくわかりません(そして今はテストできません)が、

if(!isset($_SESSION))
    session_start();

$_SESSION が常に設定されているため、決して起こらないようです。次の場合なしで試してください:

session_start();

そしてしないでください

$_SESSION = array();

それは悪い習慣だからです。

于 2012-08-19T19:21:41.660 に答える