首页 > 编程技术 > php

构建网站:用户的登入认证

发布时间:2016-11-25 16:32

前面已经介绍了几个 php 的功能技巧,从现在开始就来充分利用组合这些技巧来构建一个强大的网站,以后会陆续地介绍一些高级和基本的技巧如何在网站中应用.
建立一个好的网站,用户登认证功能是必不可少的,同样的在这儿我只是介绍思路和做法,并不会添鸭式地一步一步的列出步骤.
首先需要一个可用来记录用户资料的数据库,其内容应当至少包括姓名和密码,自然根据需要可在数据库增加相应的字段.
为了使数据库有资料,必须要有个注册程序,通过注册用户可将资料存进数据库,注册程序的实现非常地简单,仅仅是发出存入数据库的指令,在这里就不再描述了,这里要提出的是,出于对用户资料安全的考虑,最好为用户的密码加密,还有数据库不应出现相同的姓名,否则会乱套.
下面介绍的重点是用户登入和登出的实现,用户登入的功能用 session 和 cookie 都能完成,我在这儿要介绍的是如何用 cookie 来完成这个功能的.
其实用户登入的整个过程理解起来很简单,程序将用户输入的姓名和密码与数据库存储的资料进行对比,数据库有此用户的资料就通过,没有则拒绝该用户通过.
来看看登入程序 login.php 的工作流程:
用户提交资料到 login,php,login.php 就会经过如下处理:
$passwd=md5($passwd);
$result=mysql_query("select * from user where name='$name' and passwd='$passwd'");
之所以密码要经过 md5 处理,是因为数据库存储的是经过 md5 加密过的密码,判断有无此用户存在,不存在或密码错误则给出些告警给该用户,存在此用户的资料的话,就可以将该用户的资料设置为 cookie 值,如下:
setcookie("cookiename",$name,time()+18000,"","/");
setcookie("cookiepasswd",$passwd,time()+18000,"","/");
如果担心用户因忘记登出而造成安全问题的话,就把时间设置去除:
setcookie("cookiename",$name,"","/");
setcookie("cookiepasswd",$passwd,"","/");
这样当用户关闭浏览器时,cookie 的设置就失效了,也就是说用户下一次来的时候,必须重新登入!虽然有了这个关闭浏览器就让 cookie 失效的安全功能,但还是需要一个用户登出的功能以策安全,登出功能也就是让记载用户资料的 cookie 失效的功能,完成这个功能很简单,只需要将时间置为 -1,并把 cookie 变量置空就行了:
logout.php:
setcookie('cookiename',"",time()-1,'/',"");
setcookie('cookiepasswd',"",time()-1,'/',"");
$cookiename="";
$cookiepasswd="";
这样一个完整的用户认证功能就完成了.

在开始这篇文章时,作者假设读者已能够写出一个用户的登入认证程序.
----------------------------------------------------------
记数器可完成访问 web 页的总次数,但却不能得知一个时段中访问量的动态记载,下面就来介绍如何写一个各个时段动态显示访问量的方法.
要记载访问量,首先就要在 mysql 内建立一个数据库,姑且给这个数据库取名为 line,同时建立一个名为 line 的数据表,表内的字段分别为"用户名(name varchar(20)),时间(time datetime)".当然读者也可根据需要增加数据表的字段.
建立好数据库后,就可以开始设计程序了,现在先理清一下思路,要想显示访问量,当然数据库就必须要有记录,我已假设读者有能力写一个用户登入程序了,所以向数据库添加纪录可在登入程序假设为 login.php 里添加:
先给现在时间付值:$time=date('Y-m-d H:i:s');
mysql_select_db(line);
mysql_query("insert into line (name,time) values('$name','$time')");
好了,现在每一位登入的用户在数据库里都有了一个记录,下面就来完成用户在线显示的程序 line.php:
<?
mysql_connect("local","","");
mysql_select_db(line);
$result=mysql_query("select * from line");
$num=mysql_numrows($result);
if (!empty($num)) {
echo "<table><tr><td>";
echo "现在在线人数为:$num";
echo "</td></tr>";
for($i=0;$i<$num;$i++){
$name=mysql_result($result,$i,"name");
echo "<tr><td>用户:$name</td></tr>";
}
}
?>
上面这段程序已能显示所有在线的用户人数及各用户名,当然这个程序还很不完善.如果其中一个用户登出离开后,数据库就不应该有此用户的记录所以,还得在登出程序假设为 logout.php 内加上删除功能:
mysql_select_db(line);
mysql_query("delete from line where name='$name'");
这时一个基本的用户在线功能已经完成,接下来继续在 line.php 内增加代码使功能更加完善,首先我们得规定用户在多长时间没继续浏览 line.php 时就认为该用户已经离开,这里给定一个时间限制为 5 分钟,也就是说程序将显示从现在开始的前 5 分钟的用户情况,所以必须 line.php 内设置一个现在时间告知程序从这个时间开始执行,然后实现程序执行时把数据库内记录的时间减去现在时间大于 5 分钟的所有记录删除,这样任何用户在执行 line.php 时,都能看到 5 分钟内的所有在线的用户,完成这个功能需要以下这个数据库语句:
数组在 php 里的运用至少比 C 来的简单,在一般的 php 程序里很少用到数组这个概念,用的较多的是判断,循环和 cookie,但是掌握数组的运用技巧却是很重要,因为它能够使程序的功能更加自动化,让客户在功能强大但操作性能差和功能小巧玲珑但操作性非常方便的程序里选择,我想客户会选择后者.
在介绍数组运用之前,我得在这声明,我在这只是介绍运用数组的思路,即在什么情况下可以运用数组来简化完成任务,其中举的例子也只是提供一个思路,不会面面俱到.
什么时候使用数组,一般在碰到大范围变量传送和处理的情况下考虑用数组来完成.
我用数组完成任务的一个实例:
有一次我为客户写了一个后台管理程序,程序完成后,客户很满意,但过了不久客户就来找我了,并对我说:"我发现里面有很多垃圾信息,我不想保留它们,在删除时,我遇到麻烦了,我不得不每次点'删除'去删除每一条信息你能不能帮我设计一个一次过把全部垃圾删除的功能...";当然我接受了这个任务,因为客户就是上帝.
在开始加入这个功能进管理程序的时候,我考虑用数组来完成它,于是就写了一个流程图:
查找垃圾信息唯一识别字 id -->数组-->对应数组内的 id 删除数据库记录
好了由这个流程图,就可以开始设计程序了,为了使用数组成功传递变量,我使用了提交表挡的 checkbox,具体的写法:
echo "<input type=checkbox name=delete[$id] value='y'>";
这样我就将垃圾信息的 id 与数组下标对应的空间附值,这样就可以对数据库进行实质操作了,下面来看看数组被传到删除功能块时是如何完成任务的;
//首先查找数据库所有记录的 id:
.....
for ($i=0;$i<$num;$i++) {
$id=mysql_result($result,$i,"id");
//判断数组
if (!empty($delete[$id])) {
//执行删除命令
mysql_query("delete from table where id=$id");
}
}
......
一个自动化的删除功能完成了,用数组还可完成很多不同的任务如:随机更新图片,对比等等...
活用数组可以完成一些看上去很难完成的任务
现在我们有了需要通过$REMOTE_ADDR变量来交叉引用的文件,这样我们可以区分出想要发贴的用户是否已经被扁或没有被扁。很简单:
<?php
for ($counter=0;$counter<sizeof($banned_array);$counter++) {
   if ($banned_array[$counter] == $REMOTE_ADDR) {
   print("<font color="red" face="arial" align="center">".
   "You have been banned from this chat</font>");
   exit;
   }
}
?>
  exit命令将立即停止脚本的执行。在开始对传递过来的变量执行处理之前,插入对被扁用户的检查,这样被扁用户就不能使用聊天室了。
  比较好的解决在某些情况下动态IP地址的问题的一个意见就是,检查IP地址块的所属范围。一个简单的函数可以容易地实现它。
<?php
function makeMask($ip) {
   // remember to escape the . so PHP doesn't think it's a concatenation
   $ip_array = explode(".", $ip);
   $ip_mask = "$ip_array[0].$ip_array[1].$ip_array[2]";
   return $ip_mask;
}
?>
  然后我们把循环中的if替换成
<?php
for ($counter=0;$counter<sizeof($banned_array);$counter++) {
   if (makeMask($REMOTE_ADDR) == makeMask($banned_array[$counter])) {
   print("<font color="red" face="arial" align="center">".
   "You have been banned from this chat</font>");
   exit;
   }
}
?>
  我们有了针对动态IP地址的保护措施。
  最后我们需要一种方法最先得到惹麻烦的IP。我的实现是将$name和$REMOTE_ADDR记录到一个名为
iplist.html的文件中。对于一个分离的,秘密的URL,我可以在浏览消息的同时监控IP地址。这可以增加一些意外的好处,就是能够发现假冒者--在这些地方最常犯的“罪”。
  iplist.html与messages.html的创建方法基本上一样。首先将当前的值从iplist.html中取出来,我们剥离掉头信息,脚标和旧的IP记录,然后创建一个新的记录,新的头信息,新的脚标。为了让布局更清楚,我使用了表格。
现在我们终于有了写新文件所需的所有东西了:
<?php
// 打开文件,并且将文件长度截为0
$open_file = fopen("messages.html", "w");
// 写入文件的头信息
fputs($open_file, $header);
// 新的一行
// (使用stripSlashes,因为我们不想让所有的转义字符出现在消息文件中)
fputs($open_file, stripslashes($new_message));
// 旧的行
fputs($open_file, $old_messages);
// 脚标
fputs($open_file, $footer);
// 关闭文件
fclose($open_file);
?>
摘自:http://www.9headbird.com/detail.php3?id=8970

标签:[!--infotagslink--]

您可能感兴趣的文章: