下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

什么是一个完整、安全的用户登录系统

作者:课课家教育     来源: http://www.kokojia.com/点击数:1560发布时间: 2015-11-14 22:58:55

标签: 开发教程

大神带你学编程,欢迎选课

欢迎来到小编的文章进行学习阅读,想必大家又有很多问题吧,在这里会有你想要收获的答案,请大家慢慢学习吧。excel2010视频教程

在使用PHP编程的时候,我有一个习惯,不太喜欢使用现成的库文件,例如PHPLib或者其它类似的库,在这个系统中,我也打算自己写一个库文件,它需要处理认证、确认email,更新帐号(密码,email)等事情。
为了在保证该系统安全的同时,不会加重我现有数据库的负担。因此这个新的系统要依赖cookies。这确实是一个两难的选择,因为如果只是设置一个用户名的cookie,是很不安全的,这行不通,但从数据库的负担考虑,我也不能加入一个简单的无序码而交由我的数据库来进行验证。
解决的方法是同时设置两个cookie,一个是用户名的cookie,一个是无序码的cookie。这个无序码实际上是由用户名和一个超级密码(只有程序设计者知道)组合通过md5()函数运算产生的。由于md5()是一个单向的无序码,因此是不可以破解的。在用户更改email时,我也可以用该email和超级密码产生一个无序码,以让用户确认修改。这实际上是一个公匙/私匙类的系统。不明白?不要紧,下面再慢慢说明。
有趣的是,这个系统的扩展能力是可以达到无穷的,因为该系统的主要工作是计算md5()函数的值,而且由web服务器完成,在负载增加时,可以加入其它的服务器来分担负载,虽然认证系统不会拖跨一个数据库,但是这样做就让最终的瓶颈只能出现在数据库上。
以下是该库中的两个函数--记号产生和记号认证函数。excel2010教程

以下为引用的内容:
  <?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
    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);
       if (!$result || db_affected_rows($result) < 1) {
        $feedback .= ' ERROR - Incorrect User Name Or Password ';
        return false;
        } else {
         $feedback .= ' Confirmation Sent ';
         user_send_confirm_email($new_email,$hash);
         return true;
         }
       } else {
         $feedback .= ' New Email Address Appears Invalid ';
         return false;
        }
       }
    function user_confirm($hash,$email) {
      /*

well编程语言原本是被设计成专门使用在计算机上的,但它们也可以用来定义算法或者数据结构。正是因为如此,程序员才会试图使程序代码更容易阅读。[1]
编程语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为在当今所有的计算都需要程序设计语言才能完成。[1]
在过去的几十年间,大量的编程语言被发明、被取代、被修改或组合在一起。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而且有许多语言对新手来说太难学;还有,不同程序之间的运行成本(runtime cost)各不相同。[1]
有许多用于特殊用途的语言,只在特殊情况下使用。例如,PHP专门用来显示网页;Perl更适合文本处理;C语言被广泛用于操作系统和编译器的开发(所谓的系统编程)。[1]excel2010

用户点击认证email的相关连接时,连到一个确认的页面,该页面会调用这个函数

以下为引用的内容:
      */
     global $feedback,$hidden_hash_var;
      file://verify that they didn't tamper with the email address
      $new_hash=md5($email.$hidden_hash_var);
      if ($new_hash && ($new_hash==$hash)) {
        file://在数据库中找出这个记录
        $sql="SELECT * FROM user WHERE confirm_hash='$hash'";
        $result=db_query($sql);
        if (!$result || db_numrows($result) < 1) {
          $feedback .= ' ERROR - Hash Not Found ';
          return false;
        } else {
          file://确认email,并且设置帐号为已经激活
          $feedback .= ' User Account Updated - You Are Now Logged In ';
          user_set_tokens(db_result($result,0,'user_name'));
          $sql="UPDATE user SET email='$email',is_confirmed='1' WHERE confirm_hash='$hash'";
          $result=db_query($sql);
          return true;
         }
        } else {
         $feedback .= ' HASH INVALID - UPDATE FAILED ';
         return false;
        }
       }
    function user_send_confirm_email($email,$hash) {
      /*


这个函数在首次注册或者改变email地址时使用

以下为引用的内容:
      */
       $message = "Thank You For Registering at Company.com".
       "\\\\nSimply follow this link to confirm your registration: ".
       "\\\\n\\\\nhttp://www.company.com/account/confirm.php?hash=$hash&email=". urlencode($email). "\\\\n\\\\nOnce you confirm, you can use the services on PHPBuilder.";
mail ($email,'Registration Confirmation',$message,'From: noreply@company.com');
      }
    ?>


如果大家觉得收获很多,那就请大家去课课家官网一起走入知识的天堂。

赞(100)
踩(4)
分享到:
华为认证网络工程师 HCIE直播课视频教程