所以我有一个登录系统,为每个尝试登录生成一个随机令牌并将其保存在$_session['loginToken']
中,并在发布表格后检查会话值是否等于发布的输入。
我还发现在此处的某段时间后手动设置超时:How do I expire a PHP session after 30 minutes?
问题是在第一次登录尝试时或在会话销毁(超时)之后$ _SESSION是一个空数组并且没有设置任何东西但是在第二次尝试之后它工作正常。
<?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>
答案 0 :(得分:2)
我不确定(现在无法测试),但
if(!isset($_SESSION))
session_start();
似乎永远不会发生,因为$ _SESSION总是被设置。如果没有,请尝试:
session_start();
并且不要
$_SESSION = array();
因为这是不好的做法。
答案 1 :(得分:2)