+ -
当前位置:首页 → 问答吧 → 浅谈登录页面该注意的问题(通过代码详解)

浅谈登录页面该注意的问题(通过代码详解)

时间: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内容到剪贴板
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内容到剪贴板
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

又学到新知识了,感谢LZ:)

作者: yuanhui9   发布时间: 2007-09-28

改天����

作者: aboc   发布时间: 2007-09-29

好复杂啊!!:L

作者: naodai   发布时间: 2007-09-30

个人理解:cookie可以伪造,session不行吧?如果人家能弄一个session文件放到你的服务器上去,还不如直接将你的php替换掉。

作者: sentrychen   发布时间: 2007-09-30

LS的有什么意见和理解 可以说出来或者贴自己代码上来共同学习

作者: sun9110225   发布时间: 2007-09-30

登陆页面是非常重要的一部分,凌晨了,先留个脚印找个头脑清醒的时候看。:lol

作者: hotbone   发布时间: 2007-10-04

学习,,:')

作者: ffffffff8   发布时间: 2007-10-09

留个脚印!

作者: ak-1   发布时间: 2007-10-12