浅谈登录页面该注意的问题(通过代码详解)
时间:2007-09-23
来源:互联网
完整版本:http://www.dophp.net/thread-432-1-1.html
我们知道,登录退出是PHP编程极其常见的一个问题,又是一个很容易忽略的问题,忽略的结果会产生
很多隐藏着的漏洞。通过一连串的漏洞,你的站点将很容易受到攻击。
现在我以代码为例来谈谈个人对登录中应该要注意的问题。
新手第一贴,有说错的地方请大家指导。
总登录表单接受页面,个人觉得应该分两块来思考。
1:登录验证
2:验证是否登录
先谈谈1登录录验证:在这一块中,首先应该准备两个表,一个是用户表,另外一个是SESSION表。用户表保存着登录的
用户的信息,session表记录着用户登录的SESSION,包括IP,上次激活时间等等。用户表的建立应该没问题,基本上都会考虑
到,但SESSION表可能有部分人会忽略掉,因为是否存在SESSION表对登录验证这一块似乎影响不大,但回过头来我们想想,当
登录的用户长时间不操作时?或者有人伪造SESSION?这些情况外面该如何处理呢?这个时候SESSION表就起作用了。
先看代码吧。
PHP代码:
//登录验证if($_POST['action']=="login")//表单的ACTION
{
global $DB,$db_prefix; //全局变量 $DB是数据库类的实例 $db_prefix数据库中表前缀
$query=$DB->query("select `userid`,`username`,`password`,`groupid` from {$db_prefix}users where groupid=1");
//这里很简单,到用户表中寻找用户组为1的用户。
while($info=$DB->fetch_array($query)) //遍历刚才搜寻的用户
{
if(($_POST['username']==$info['username'])&&(md5($_POST['password'])==$info['password']))//当表单传上来的用户名和密码分别和数据库中的用户名和密码相对时,执行以下操作。
{
setcookie('username',$info['username']);
setcookie('userid',$info['userid']);
setcookie('groupid',$info['groupid']);
setcookie('onlineip',$onlineip);//以上在COOKIE保存登录用户的一些信息,为在接下来验证用户是否登录时用到。有兴趣的朋友在这里可以考虑将COOKIE通过64加密的方式保存
$DB->query("DELETE FROM {$db_prefix}sessions WHERE username='".$info['username']."' OR lastactivity+1800<'$timestamp'");
//删除SESSION表中该登录用户以前登录的数据
$DB->query("INSERT INTO {$db_prefix}sessions (username,userid,groupid,ipaddress,lastactivity) VALUES ('".$info['username']."', '".$info['userid']."','".$info['groupid']."', '$onlineip', '$timestamp')");
//SESSION表中插入当前登录用户的信息
if($_SERVER['QUERY_STRING'])//假如URL 中第一个问号 ? 之后的内容存在
redirect('登录成功,请稍候...','admincp.php'.$_SERVER['QUERY_STRING']);
redirect('登录成功...','admincp.php');
exit;
}
else
{
redirect('登录失败,请稍候...','admincp.php'); //登录失败
exit;
}
}
}
这一块我们首先大局要分两个来讲,第一块是用户初次登录,第二块是用户已经登录。这第二块我是假设用户已经登录,或者其中存在用户
长时间不操作导致SESSION失效,或者用户是伪造SESSION来登录,其实在SESSION表中是没有这个用户的。那么我们大局上如何划分这两
块内容呢?还是从COOKIE上着手。目前还没有想到是否存在伪造COOKIE这个方式来骗取登录。所以只能假设不能伪造,能力有限之处,还
指教。先看代码。
PHP代码:
//判断用户是否登录$username= $_COOKIE['username'];
if($_COOKIE['username']&&$_COOKIE['userid']&&$_COOKIE['groupid']&&$_COOKIE['onlineip'])//第二块:用户已经登录,判断标准通过COOKIE的值,如有,执行以下操作。
{
$query=$DB->query("SELECT * FROM {$db_prefix}sessions WHERE username='$username' AND lastactivity+1800>'$timestamp'");
$session = $DB->fetch_one_array($query);
if (!$session) { //搜寻SESSION表,如果存在这样的用户名,且未操作时间已经大于某一个时间,则跳出登录页面
$DB->query("DELETE FROM {$db_prefix}sessions WHERE username='$username'");
loginpage();
}
$query=$DB->query("SELECT userid,username,password,logincount,groupid FROM {$db_prefix}users WHERE username='".$session['username']."'");
$userinfo = $DB->fetch_one_array($query);
if (!$userinfo) {//SESSION表验证是否存在这个用户,防止SESSION伪造。同时也巩固上面的COOKIE验证,即使上面的COOKIE伪造成功,同样这里也通不过验证。
loginpage();
}
$DB->query("UPDATE {$db_prefix}sessions SET lastactivity='$timestamp' WHERE username='$username'");
}
else //第一块:用户初次登录
{
loginpage(); //登录页面
}
又不清楚的地方可以和我联系。
QQ:178827700
MSN:[email protected]
PHP同盟会
作者: robin0421 发布时间: 2007-09-23
我学习中
作者: ejievod 发布时间: 2007-09-25
作者: chyoqin 发布时间: 2007-09-26
作者: samsung 发布时间: 2007-09-26
作者: yuanhui9 发布时间: 2007-09-28
作者: aboc 发布时间: 2007-09-29
作者: naodai 发布时间: 2007-09-30
作者: sentrychen 发布时间: 2007-09-30
作者: sun9110225 发布时间: 2007-09-30
作者: hotbone 发布时间: 2007-10-04
作者: ffffffff8 发布时间: 2007-10-09
作者: ak-1 发布时间: 2007-10-12
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28