我是使用PHP登录脚本的初学者。到目前为止,这是表单令牌语句:
$_SESSION["form_token"] = md5(rand(time (), true)) ;
在用户指示他/她想要登录后立即发出该声明。
我有限的理解是令牌的目的是在唯一的时间点识别唯一的用户并掩盖表单令牌信息。
然后,一切变得模糊。这是我的3个未解决问题:
为了安全起见,什么时候才是“检查”表单令牌的最佳时间?
我该如何检查?
什么时候(如果有的话)我“销毁”表单令牌?(IOW,表单令牌会在用户注销之前保持“活动”状态吗?
无需做您正在尝试的事情。当您使用session_start()在PHP中启动会话时,已经为您生成了一个唯一的SESSIONID。你应该 不 被把这个形式。默认情况下,它通过cookie处理。也无需检查SESSIONID,也可以再次为您处理。
您负责验证用户身份并存储其验证身份(例如,SESSION中的$ _SESSION [‘user_id’] = $ userId)。如果用户注销,则使用session_destroy销毁其会话。
您应该确保session_start()是站点中所有页面的 首要 任务之一。
这是一个基本示例:
<?php session_start(); // starts new or resumes existing session session_regenerate_id(true); // regenerates SESSIONID to prevent hijacking function login($username, $password) { $user = new User(); if ($user->login($username, $password)) { $_SESSION['user_id'] = $user->getId(); return true; } return false; } function logout() { session_destroy(); } function isLoggedIn() { return isset($_SESSION['user_id']); } function generateFormHash($salt) { $hash = md5(mt_rand(1,1000000) . $salt); $_SESSION['csrf_hash'] = $hash return $hash; } function isValidFormHash($hash) { return $_SESSION['csrf_hash'] === $hash; }
编辑:我误解了原来的问题。我在上面添加了用于生成和验证表单哈希的相关方法;