登录成功后,创建token,记录在mysql中。创建的令牌通过会话进一步传递。
首先,受密码保护的页面检查会话令牌是否与 mysql 中的令牌相同。
其他受密码保护的页面只能通过第一页(例如,称为菜单)获得。
在第一个受密码保护的页面中创建额外的令牌,称为 page_token(也记录在 mysql 中?;没有 mysql 是否有更好/更快的方法?;可能是这样的:
(isset($_SESSION) == $_SESSION['page_token']))
会话令牌保持不变,page_token 在每次页面重新加载后都会更改。
在所有其他页面上检查会话令牌和 page_token 是否与 mysql 中的令牌相同。
这样的方法好吗?可能存在更好的方法(一些链接)?
谢谢
更新
网上搜的。理解上述方法是不合理的。足以检查会话登录。
但要尽可能确定特定密码保护页面的访问者与输入正确用户名和密码的访问者相同。
所以接下来的问题
1) 你觉得这个教程怎么样http://wblinks.com/notes/secure-session-management-tips
2)你对代码有什么看法?普通用户可以在一个会话期间更改任何以下 HTTP 吗?
if( $_SESSION['loggedin'] != 1 or $_SESSION['time_when_form_submitted'] > date("Y-m-d H:i:s")
or
$_SESSION['_USER_LOOSE_IP'] != long2ip(ip2long($_SERVER['REMOTE_ADDR']) & ip2long("255.255.0.0"))
or
$_SESSION['HTTP_USER_AGENT'] != $_SERVER['HTTP_USER_AGENT']
or
$_SESSION['HTTP_ACCEPT_LANGUAGE'] != $_SERVER['HTTP_ACCEPT_LANGUAGE']
or
$_SESSION['HTTP_ACCEPT'] != $_SERVER['HTTP_ACCEPT']
or
$_SESSION['HTTP_ACCEPT_ENCODING'] != $_SERVER['HTTP_ACCEPT_ENCODING']
) {
header('Refresh: 0; URL=http://www.domain.com/login.php');
}