岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Linux频道 >> Linux编程 >> PHP >> Linux频道正文
一个完整、安全的PHP用户登录系统
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-12-18 18:17:31

    在使用PHP 编程的时候,我有一个习惯,不太喜欢使用现成的库文件,例如PHPLib或者其它类似的库,在这个系统中,我也打算自己写一个库文件,它需要处理认证、确认email ,更新帐号(密码,email )等事情。

    为了在保证该系统安全的同时,不会加重我现有数据库的负担。因此这个新的系统要依赖cookies.这确实是一个两难的选择,因为如果只是设置一个用户名的cookie,是很不安全的,这行不通,但从数据库的负担考虑,我也不能加入一个简单的无序码而交由我的数据库来进行验证。

    解决的方法是同时设置两个cookie,一个是用户名的cookie,一个是无序码的cookie. 这个无序码实际上是由用户名和一个超级密码(只有程序设计者知道)组合通过md5 ()函数运算产生的。由于md5 ()是一个单向的无序码,因此是不可以破解的。在用户更改email 时,我也可以用该email 和超级密码产生一个无序码,以让用户确认修改。这实际上是一个公匙/ 私匙类的系统。不明白?不要紧,下面再慢慢说明。

    有趣的是,这个系统的扩展能力是可以达到无穷的,因为该系统的主要工作是计算md5 ()函数的值,而且由web 服务器完成,在负载增加时,可以加入其它的服务器来分担负载,虽然认证系统不会拖跨一个数据库,但是这样做就让最终的瓶颈只能出现在数据库上。

    以下是该库中的两个函数——记号产生和记号认证函数。
   
    <?php

   $hidden_hash_var='your_secret_password_here';

   $LOGGED_IN=false;
   
      unset($LOGGED_IN);

   function user_isloggedin() {
   
     global $user_name,$id_hash,$hidden_hash_var,$LOGGED_IN;
 
   file://已经进行无序码的检测了吗

   file://如果是的话,返回该变量

   if ( isset($LOGGED_IN) ) {

   return $LOGGED_IN;

   }

   file://are both cookies present?

   if ($user_name && $id_hash) {

   /*
       
      由cookies中得来的用户名和系统超级密码产生一个认证用的无序码如果该无序码与cookie中的无序码一样,则cookies中的变量是可信的,用户已经登录

   */

   $hash=md5($user_name.$hidden_hash_var);

   if ($hash == $id_hash) {

   file://无序码符合,设置一个全局变量,这样我们在再次调用该函数的时候,

   file://就无需再次进行md5()运算

   $LOGGED_IN=true;

   return true;

   } else {

   file://两个无序码不符合,没有登录

   $LOGGED_IN=false;

   return false;

   }

   } else {

    $LOGGED_IN=false;

    return false;

   }

    }

   function user_set_tokens($user_name_in) {

   /*

   一旦用户名和密码通过验证,就调用这个函数

   */

   global $hidden_hash_var,$user_name,$id_hash;

   if (!$user_name_in) {

   $feedback .= ' ERROR - User Name Missing When Setting Tokens ';

   return false;

   }

   $user_name=strtolower($user_name_in);

   file://使用用户名和超级密码创建一个无序码,作判断是否已经登录用

   $id_hash= md5($user_name.$hidden_hash_var);

   file://设置cookies的有效期为一个月,可设置为任何的值

   setcookie('user_name',$user_name,(time()+2592000),'/','',0);

   setcookie('id_hash',$id_hash,(time()+2592000),'/','',0);

   }

   ?>

[1] [2] 下一页  

     再来看另一段有趣的代码,用户怎样才能安全地改变他们的email地址呢?他们可以在任何时候改变email地址,但是要进行确认。

   <?php

   function user_change_email ($password1,$new_email,$user_name) {

   global $feedback,$hidden_hash_var;

   if (validate_email($new_email)) {

   $hash=md5($new_email.$hidden_hash_var);

   file://改变数据库中确认用的无序码值,但不改变email

    file://发出一个带有新认证码的确认email

   $user_name=strtolower($user_name);

   $password1=strtolower($password1);

   $sql="UPDATE user SET confirm_hash='$hash' WHERE user_name='$user_name' AND password='". md5($password1) ."'";

   $result=db_query($sql);

[1] [2] 下一页


  • 上一个Linux频道:
  • 下一个Linux频道: 没有了
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:WebSyue@163.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    魔域私服 魔域私服 传奇世界私服 345天龙发布网 传奇世界私服 传奇世界私服 新开传世私服 完美世界私服 征途私服 bet365 征途私服 劲舞团私服 征途私服发布网 传世私服 传奇世界私服