为了防止会话劫持,我编写了以下三个函数。他们工作。我在脚本开头调用 set_auth_token 。然后在 html 表单中调用 get_auth_token。表格发布后,我调用 check_auth_token。但是,有时在用户填写表格后,如果填写错误,他们往往会按 F5/Refresh。这会导致页面“死亡”。在填写表格之前不会发生这种情况。
我可以做些什么来改进这些,以便他们不会在每次用户按下刷新时死掉?
function set_auth_token()
{
if (!isset($_SESSION['auth_token']))
{
$_SESSION['auth_token'] = hash('sha256',rand().time().$_SERVER['HTTP_USER_AGENT'].$_SERVER['REQUEST_URI']);
}
}
get_auth_token 总是在 set_auth_token 被调用后被调用,因此如果找不到授权令牌,它就会死掉:
function get_auth_token()
{
if (isset($_SESSION['auth_token']))
{
return $_SESSION['auth_token'];
}
else
{
die('"No auth token."');
}
}
导致页面死机的函数:
function check_auth_token()
{
if (array_key_exists('auth_token', $_SESSION) && array_key_exists('auth_token', $_POST))
{
if ($_SESSION['auth_token'] == $_POST['auth_token'])
{
$_SESSION['auth_token'] = hash('sha256', rand() . time() . $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REQUEST_URI']);
}
else
{
die('Woah! It seems like you pressed Refresh (or Back/Forward). Just click here to sort it out.'); # TODO: hyperlink silly
}
}
else
{
die('no auth token');
}
}
干杯。