使用cookie认证
希望更多地控制用户登录过程,如提供你自己的登录表单。
将认证状态存储在一个cookie中,或者存储为会话的一部分。用户成功登录时,将他的用户名(或另一个唯一值)放在一个cookie中。另外还要包含用户名的一个散列值和一个密语,使用户无法仅由用户名建立认证cookie:
$secret_word = 'if i ate spinach';
if(validate($_POST['username'],$_POST['password'])){
setcookie('login',$_POST['username'].','.md5($_POST['username'].$secret_word));
}
function validate($user, $pass){
/可以替换为适当的用户名和密码检查,如检查一个数据库/
$users = array('david'=>'fadj&32',
'admin'=>'aadmin');
if(isset($users[$user])&&($users[$user] === $pass)){
echo $user;
echo '
';
echo $pass;
return true;
}else{
return false;
}
}
示例cookie认证登录表单
用户登录,页面只需要验证已发送一个合法的登录cookie,从而可以为这个登录用户完成一些特殊的工作。
验证一个登录cookie
unset($username);
if(isset($_COOKIE['login'])){
list($c_username, $cookie_hash) = explode(',', $_COOKIE['login']);
if(md5($c_username.$secret_word) == $cookie_hash){
$username = $c_username;
}else {
print "You have sent a bad cookie.";
}
}
if(isset($username)){
print "Welcome, $username.";
} else {
print "Welcome, anonymous user.";
}
如果使用内置的会话支持,可以将用户名和散列值增加到会话,而不用发送一个单独的cookie。有人登录时,在会话中设置一个额外的变量,而不是发送一个cookie。
开始会话管理,使用$_SESSION变量之前必须session_start();
在会话中存储登录信息
if(validate($_POST['username'],$_POST['password'])){
$_SESSION['login'] = $_POST['username'].','.md5($_POST['username'].$secret_word);
}
验证会话信息
unset($username);
if(isset($_SESSION['login'])){
list($c_username, $cookie_hash) = explode(',', $_SESSION['login']);
if(md5($c_username.$secret_word) == $cookie_hash){
$username = $c_username;
}else {
print "You have tampered with your session.";
}
}
连接注销和登录信息
if(validate($_POST['username'],$_POST['password'])){
$_SESSION['login'] = $_POST['username'].','.md5($_POST['username'].$secret_word);
error_log('Session id '.session_id().' log in as '.$_POST['username']);
}
使用会话ID的一个危险是会话可能被劫持。会话模块有两个可选的配置指令,可以建立更难猜的会话ID。session.entropy_file指令包含一个生成随机结果的设备或文件的路径,如/dev/random或/dev/urandom。
session.entropy_length指令包含创建会话ID时从信息熵文件读取的字节数。不论会话ID多难猜,如果在服务器和用户的浏览器之间用明文发送,仍然会被窃取。
HTTP基本认证也存在这个问题。可以使用SSL来防范网络窃听。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战