仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 893|回复: 19
打印 上一主题 下一主题

[学习教程] PHP教程之一个完全、平安的用户登录体系

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:58:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。     在利用PHP编程的时分,我有一个习气,不太喜好利用现成的库文件,例如PHPLib或其它相似的库,在这个体系中,我也盘算本人写一个库文件,它需求处置认证、确认email,更新帐号(暗码,email)等工作。
为了在包管该体系平安的同时,不会减轻我现无数据库的承当。因而这个新的体系要依附cookies。这的确是一个两难的选择,由于假如只是设置一个用户名的cookie,是很不平安的,这行欠亨,但从数据库的承当思索,我也不克不及到场一个复杂的无序码而交由我的数据库来停止验证。
  处理的办法是同时设置两个cookie,一个是用户名的cookie,一个是无序码的cookie。这个无序码实践上是由用户名和一个超等暗码(只要法式设计者晓得)组合经由过程md5()函数运算发生的。因为md5()是一个单向的无序码,因而是不成以破解的。在用户更改email时,我也能够用该email和超等暗码发生一个无序码,以让用户确认修正。这实践上是一个公匙/私匙类的体系。不分明?没关系,上面再渐渐申明。
  风趣的是,这个体系的扩大才能是可以到达无量的,由于该体系的次要任务是盘算md5()函数的值,并且由web办事器完成,在负载增添时,可以到场其它的办事器来分管负载,固然认证体系不会拖跨一个数据库,然而如许做就让终究的瓶颈只能呈现在数据库上。
<P>  以下是该库中的两个函数--记号发生和记号认证函数。

  <?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);

    }

  ?>
<P>再来看另外一段风趣的代码,用户如何才干平安地改动他们的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) {

      /*

       用户点击认证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');

      }

    ?>

  评论:也许咱们在用户认证方面不是采取这类办法,而是采取session等体例,不外这篇文章在若何停止加密和确认方面,仍是对咱们有所启示的。
在学习中,我也一直这样要求着自己。
只想知道 该用户已被删除
沙发
发表于 2015-2-4 07:46:56 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
深爱那片海 该用户已被删除
板凳
发表于 2015-2-7 03:00:21 | 只看该作者
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
再现理想 该用户已被删除
地板
发表于 2015-2-8 06:15:30 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
柔情似水 该用户已被删除
5#
发表于 2015-2-18 13:15:06 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
山那边是海 该用户已被删除
6#
发表于 2015-3-9 23:53:31 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
分手快乐 该用户已被删除
7#
发表于 2015-3-11 06:28:32 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
爱飞 该用户已被删除
8#
发表于 2015-3-17 01:09:13 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
第二个灵魂 该用户已被删除
9#
发表于 2015-3-23 09:07:03 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
10#
发表于 2015-3-25 19:09:53 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
精灵巫婆 该用户已被删除
11#
发表于 2015-4-1 15:11:05 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
海妖 该用户已被删除
12#
发表于 2015-4-3 21:35:40 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
小魔女 该用户已被删除
13#
发表于 2015-4-6 16:06:41 | 只看该作者
当然这种网站的会员费就几十块钱。
莫相离 该用户已被删除
14#
发表于 2015-4-6 20:10:12 | 只看该作者
实践是检验自己会不会的真理。
金色的骷髅 该用户已被删除
15#
发表于 2015-4-8 14:42:33 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
简单生活 该用户已被删除
16#
发表于 2015-4-10 19:48:25 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
小妖女 该用户已被删除
17#
发表于 2015-4-26 20:31:06 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
灵魂腐蚀 该用户已被删除
18#
发表于 2015-5-11 10:54:38 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
因胸联盟 该用户已被删除
19#
发表于 2015-6-8 15:43:55 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
小女巫 该用户已被删除
20#
发表于 2015-6-23 17:59:05 | 只看该作者
做为1门年轻的语言,php一直很努力。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-10 23:18

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表