dav*_*ave 17 php forms login token
我是一名初学者,正在研究PHP中的登录脚本.这是我到目前为止的表单令牌语句:
$_SESSION["form_token"] = md5(rand(time (), true)) ;
Run Code Online (Sandbox Code Playgroud)
该声明是在用户表明他/她想要登录之后发出的.
我有限的理解是,令牌的目的是在唯一的时间点识别唯一用户并伪装表单令牌信息.
然后一切都变得模糊.以下是我的3个未解决的问题:
何时是出于安全目的"检查"表单令牌的最佳时间?
我该如何检查?
什么时候,如果有的话,我"破坏"表单令牌?(IOW,在用户退出之前,表单令牌会保持"活动"状态吗?
jsp*_*cal 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
hob*_*ave 13
没有必要做你正在尝试的事情.当您使用session_start()在PHP中启动会话时,已经为您生成了一个唯一的SESSIONID.你不应该把它放在表格上.它默认通过cookie处理.也没有必要检查SESSIONID,再次为您处理.
您负责对用户进行身份验证并存储其身份验证身份(例如,在会话中使用$ _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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我误解了原来的问题.我添加了上面的相关方法来生成和验证表单哈希;
请参阅以下资源: