我是一名初学者,正在研究PHP中的登录脚本.这是我到目前为止的表单令牌语句:
$_SESSION["form_token"] = md5(rand(time (), true)) ;
该声明是在用户表明他/她想要登录之后发出的.
我有限的理解是,令牌的目的是在唯一的时间点识别唯一用户并伪装表单令牌信息.
然后一切都变得模糊.以下是我的3个未解决的问题:
何时是出于安全目的"检查"表单令牌的最佳时间?
我该如何检查?
什么时候,如果有的话,我"破坏"表单令牌?(IOW,在用户退出之前,表单令牌会保持"活动"状态吗?
jspcal.. 19
这是为了防止CSRF攻击
http://en.wikipedia.org/wiki/Cross-site_request_forgery
从理论上讲,恶意网站可以显示一个发布到您的应用程序的表单.表单可能包含导致数据泄露或某些不需要的操作的说明.用户可能会被欺骗提交应用程序可以接受的表单,因为用户已经登录.表单令牌确保表单是由您的站点而不是其他站点创建的.
检查HTTP_REFERER通常是足够好的,但不是完整的解决方案(例如https不会发送引用字符串).
如果你真的想要使用令牌保护所有表单,你可以创建一些便利函数,如emitToken()和checkToken(),它将使它在站点范围内工作.
一些例子:
http://phpsec.org/projects/guide/2.html
http://www.rodsdot.com/php/CSRF_Form_Protection.php
这是为了防止CSRF攻击
http://en.wikipedia.org/wiki/Cross-site_request_forgery
从理论上讲,恶意网站可以显示一个发布到您的应用程序的表单.表单可能包含导致数据泄露或某些不需要的操作的说明.用户可能会被欺骗提交应用程序可以接受的表单,因为用户已经登录.表单令牌确保表单是由您的站点而不是其他站点创建的.
检查HTTP_REFERER通常是足够好的,但不是完整的解决方案(例如https不会发送引用字符串).
如果你真的想要使用令牌保护所有表单,你可以创建一些便利函数,如emitToken()和checkToken(),它将使它在站点范围内工作.
一些例子:
http://phpsec.org/projects/guide/2.html
http://www.rodsdot.com/php/CSRF_Form_Protection.php
没有必要做你正在尝试的事情.当您使用session_start()在PHP中启动会话时,已经为您生成了一个唯一的SESSIONID.你不应该把它放在表格上.它默认通过cookie处理.也没有必要检查SESSIONID,再次为您处理.
您负责对用户进行身份验证并存储其身份验证身份(例如,在会话中使用$ _SESSION ['user_id'] = $ userId.如果用户注销,则使用session_destroy销毁其会话.
您应该确保session_start()是您网站中所有网页的首要内容之一.
这是一个基本的例子:
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; }
编辑:我误解了原来的问题.我添加了上面的相关方法来生成和验证表单哈希;
请参阅以下资源:
PHP会话处理
在session_start()
session_destroy()