一个完整、安全的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: ".
      
       "nnhttp://www.company.com/account/confirm.php?hash=$hash&email=". urlencode($email). "nnOnce you confirm, you can use the services on PHPBuilder.";

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

      }

    ?>

时间: 2024-10-14 15:20:12

一个完整、安全的PHP用户登录系统的相关文章

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

在使用PHP编程的时候,我有一个习惯,不太喜欢使用现成的库文件,例如PHPLib或者其它类似的库,在这个系统中,我也打算自己写一个库文件,它需要处理认证.确认email,更新帐号(密码,email)等事情. 为了在保证该系统安全的同时,不会加重我现有数据库的负担.因此这个新的系统要依赖cookies.这确实是一个两难的选择,因为如果只是设置一个用户名的cookie,是很不安全的,这行不通,但从数据库的负担考虑,我也不能加入一个简单的无序码而交由我的数据库来进行验证. 解决的方法是同时设置两个co

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

在使用PHP编程的时候,我有一个习惯,不太喜欢使用现成的库文件,例如PHPLib或者其它类似的库,在这个系统中,我也打算自己写一个库文件,它需要处理认证.确认email,更新帐号(密码,email)等事情. 为了在保证该系统安全的同时,不会加重我现有数据库的负担.因此这个新的系统要依赖cookies.这确实是一个两难的选择,因为如果只是设置一个用户名的cookie,是很不安全的,这行不通,但从数据库的负担考虑,我也不能加入一个简单的无序码而交由我的数据库来进行验证. 解决的方法是同时设置两个co

限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中,出于安全性考虑,经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制.具体一点就是:    1.在同一台电脑上一次只允许有一个用户登录系统,2.一个用户在同一时间只允许在一个客户端登录.     我最近做的一个系统就遇到了这样的问题,本来系统已经开发完成了,但是安全测评没有通过,就是因为没有做这两个限制.怎么来做这样的限制呢?我在网上找了很久,发现问这个问题的人很多,但是没有找到特别清楚的答案.后来自己摸索着,看了一些书,终于找到解决办法了.     要解

技术-怎样实现一个用户登录系统呢?

问题描述 怎样实现一个用户登录系统呢? 我想实现一个用户登录页面已经实现了用户的注册了也写进了mysql中我也知道用户登陆的时候要去数据库里面查看有没有登录页面中输入的账号密码信息如果和数据库中的一致就进入成功的页面如果不符就进入错误页面.可是就是不知道怎么写应该用到什么技术呢? 解决方案 设计一个可扩展的用户登录系统设计一个可扩展的用户登录系统 解决方案二: http://www.51testing.com/html/88/377588-814420.html 解决方案三: 没什么技术吧获取输

用户权限-用户登录系统时其权限可以用SESSION去验证吗??

问题描述 用户登录系统时其权限可以用SESSION去验证吗?? 最近尝试用java web做一个教师评价系统,需要多角色进行评论和查询,但其内容因角色而定,我上网查了下,貌似还要在数据库中建表,问题如下: 1.怎么才能让用户角色与其权限(是这个用户应该看到的页面)进行连接呢?? 2.可以用SESSION 吗?如果可以,能给我个例子吗,能看懂流程就行. 3.各位有什么好办法解决这样的问题?? 我是初入门,知道不懂的地方很多,希望大家能帮助一下,欢迎大家直言相告... 解决方案 用session保存

JS中 用户登录系统的解决办法_基础知识

当用户输入 pwd 密码是 123 就跳到第二个页面,4秒后,自动跳转到第三个页面login.html 复制代码 代码如下: <html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><script type="text/javascript">     //进行检查    function check

win7系统禁止显示用户登录信息的设置方法

  win7系统功能强大,有着xp系统不可比拟的其他功能,不过有些功能虽然强大,但为了保障系统安全信息,最好还是禁用掉为好.比如当用户登录系统桌面时,可以查看上次具体登录情况,包括时间和使用账号.虽然此功能可以方便查看上次登录的具体信息,但为了防止信息泄露,保障系统安全信息,我们可以把显示用户登录信息的功能禁用掉,那么应该如何禁用掉呢?下面就跟小编一起来了解下吧! 方法如下: 1.按"win+r"组合键打开"运行"选项,输入"gpedit.msc"

php注册登录系统简化版_php技巧

登录注册系统是日常上网最普通的操作,我设了一个分类一步步完善注册登录系统,若哪里有误,请见谅. 所用语言:php 数据库 :mysql 本次实现功能: 1.用户注册 2.用户登录 主要文件: 完整代码 1 sql 在已有的数据库里创建user表,id,username,password三个字段 复制代码 代码如下: create table user(id int(10) not null auto_increment,username varchar(30),password varchar(

教你用PHP写MySQL数据库用户认证系统

这两天受朋友的托付,要我帮他写一个使用MySQL数据库的用户认证系统.我当然不好推脱的,只得耗费了一晚上的休息时间,写了个很简单的PHP程序. 用户认证的原理很简单:首先需要用户在页面上填入用户名和密码,当然没注册的用户需要先注册.然后调用数据库搜索是否有相应的用户.如果有就确认,没有则提醒用户先注册.使用PHP来完成这一切很简单,但需要注意的是如果想在以后的页面中都能确认用户身份,使用PHP3我只能想出使用cookie的方法.要想使用session,就只能等待PHP4正式版的发布了! 第一步是