一个完整、安全的PHP用户登录系统

在使用PHP编制程序的时候,笔者有二个习感觉常,不太中意使用现存的库文件,举例PHPLib可能其余相似的库,在此个体系中,小编也筹算本身写叁个库文件,它要求管理认证、确认email,更新帐号等职业。

在运用PHP
编制程序的时候,作者有二个习感觉常,不太钟爱使用现有的库文件,举个例子PHPLib或许其余近似的库,在这里个种类中,作者也希图自身写四个库文件,它须求处理认证、确认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==$hashState of Qatar卡塔尔(قطر‎ { file://在数据库中搜索这一个记录
$sql=SELECT * FROM user WHERE confirm_hash=”$hash”;
$result=db_query($sql); if (!$result || db_numrows($result卡塔尔 1State of Qatar {
$feedback .= ” ELacrosseROOdyssey – 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);

   
为了在作保该连串安全的相同的时候,不会强化作者现存数据库的担任。由此那几个新的系统要注重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: “.
      
       “nn”.
urlencode($email). “nnOnce you confirm, you can use the services on
PHPBuilder.”;

        mail ($email,’Registration Confirmation’,$message,’From:
noreply@company.com’);

      }

    ?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注