IT技术江湖   操作系统   安全技术   平面设计   Web开发   数据库   互联网   搜索引擎   网络广告   
引擎技术江湖  BLOG  合作联系
本站
Google
IT技术江湖
首页>Web开发>php> PHP开发一个完整、安全的用户登录系统
  • IT技术江湖
  • PHP开发一个完整、安全的用户登录系统
    http://www.hack1st.com 来源: 2008-03-19 阅读: 评论

     在使用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);
         }
       ?>
      再来看另一段有趣的代码,用户怎样才能安全地改变他们的email地址呢?他们可以在任何时候改变email地址,但是要进行确认。

    上一篇:提升PHP速度全攻略  
    下一篇:php命令行参数详解及应用

    ·网友互动--用户名: (新注册) 密码: 匿名评论 [所有评论]
    评论内容:(用户发表意见仅代表其个人意见,评论内容与本站立场无关,请自觉遵守互联网相关政策法规)
    关注此文读者还看过
    • ·PHP实例:实现文件上传的程序源码
      ·在PHP中使用ASP.NET AJAX
      ·PHP 5.0中多态性的实现方案浅析
      ·大型系统上PHP令人不爽的九大原因
      ·初学入门 PHP 和 MySQL
      ·用Suhosin加强PHP脚本语言安全性
      ·完全讲解PHP+MySQL的分页显示示例分析
      ·PHP程序加速探索之服务器负载测试
      ·PHP5手动最简安装方法
      ·用SSH与PHP相连接 确保数据传输的安全性
    最新更新
    • ·PHP实例:实现文件上传的程序源码
      ·在PHP中使用ASP.NET AJAX
      ·PHP 5.0中多态性的实现方案浅析
      ·大型系统上PHP令人不爽的九大原因
      ·用Suhosin加强PHP脚本语言安全性
      ·完全讲解PHP+MySQL的分页显示示例分析
      ·PHP程序加速探索之服务器负载测试
      ·PHP5手动最简安装方法
      ·用SSH与PHP相连接 确保数据传输的安全性
      ·Apache+PHP+MySQL建立数据库驱动的动态网站
    文章关注度排行
    ·PHP开发一个完整、安全的用户登录系统
    ·PHP入门的学习方法
    ·PHP空白页面常见原因及解决方法
    ·Apache+PHP+MySQL建立数据库驱动的动态网站
    ·PHP常用正则表达式收集
    ·PHP学习入门的一些基础知识
    ·php命令行参数详解及应用
    ·提升PHP速度全攻略
    热点推荐
    PHP开发一个完整、安全的用户登录系统
    PHP开发一个完整、安全
    PHP入门的学习方法
    PHP入门的学习方法
    提升PHP速度全攻略
    提升PHP速度全攻略
    频道推荐
    • ·PHP开发一个完整、安全的用户登录系统
    • ·PHP入门的学习方法
    • ·PHP学习入门的一些基础知识
    • ·提升PHP速度全攻略
    本站精华
    PHP入门的学习方法
    PHP入门的学
    提升PHP速度全攻略
    提升PHP速度
    PHP开发一个完整、安全的用户登录系统
    PHP开发一个
    • ·PHP开发一个完整、安全的用户
    • ·提升PHP速度全攻略
    • ·PHP入门的学习方法
    • ·PHP学习入门的一些基础知识
    • | 网站导航 | 联系QQ | 编辑邮箱 | RSS订阅 | 友情链接 | 官方blog
    • 版权所有:IT技术江湖 @2007-2008
    • powered by www.hack1st.com online services. all rights reserved.京ICP备07005766号