All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
PHP代码:从数组里塞选出重复的数据_php资料_编程技术
判断浏览器是否支持javascript和Cookies_JavaScript技术_编程技术
用PHP打造超酷的数据饼图_php资料_编程技术
新版FreeTextBox(版本3.1.6)在ASP.Net,2.0中使用简解_[Asp.Net教程]
SQL,Server,全局变量_mssql学习_编程技术
Sql,server,CLR自定义类型存储对象_[SQL,Server教程]
asp.net2.0内置Application对象的应用
PHP网站开发中关于包含路径问题的解决方案_php资料_编程技术
PHP解析XML,元素结构范例_php资料_编程技术
javascript操纵GridView中CheckBox_[Asp.Net教程]
Reading number is top 10 pictures
From China fortress sora aoi5
29 the belle stars after bath figure4
Is said to be a Chinese female artist fame explicit pictures before1
Photographed the passion of the clients and prostitutes in the sex trade picture2
接财神,大吉大利,财源滚滚来
Startling Russian girl blind date scene1
Black and white also sexy--YanLiu2
美女浴室写真3
Chinese paper-cut grilles art appreciation5
In the world the most mysterious 21 place landscape2
Download software ranking
美女写真2
Unix video tutorial20
变速齿轮3.26
Boxer's Top ten classic battle3
传奇私服架设教程
Unix video tutorial17
Tram sex maniac 2 (H) rar bag13
WebService在.NET中的实战应用教学视频 → 第3集
金山office2007
Proficient in Eclipse
归海一刀 published in(发表于) 2014/2/10 6:51:20 Edit(编辑)
一个完整、安全的用户登录系统_[PHP教程]

一个完整、安全的用户登录系统_[PHP教程]

一个完整、安全的用户登录系统_[PHP教程]

在使用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

    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等方式,不过这篇文章在如何进行加密和确认方面,还是对我们有所启发的。





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.