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地址,但是要进行确认。

时间: 2024-11-03 13:19:50

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

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

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

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

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

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

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

javascript-怎么用js开发一个这样不规则图形的统计系统?

问题描述 怎么用js开发一个这样不规则图形的统计系统? 解决方案 完全按照高度做比例的话应该不难,白色最底层,红色地二层,黑色第三层,只需要设置红色的高度就可以了,红色的宽度可以和黑色的一样,变换红色的高度,看看这个思路行不? 解决方案二: 钻石是个图片么,钻石中间透明,改变红色高度就行 解决方案三: Echarts.js

【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现

在上一篇文章<调用网络API>中,我只讲述了如何直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用,当然本程序的实现也是借助于扇贝网的API接口文档http://www.shanbay.com/help/developer/api/. 由API文档可知,要想调用其API,必须先注册.因此,我就注册了,账户名为nineheadedbird, 密码为123456.显然,我们要查词,首先必须得登录该账户.如果用浏览器,那就很简单,只需单纯的输入用户名和密码就可以

如何开发一个完整的JavaScript组件

作为一名开发者,大家应该都知道在浏览器中存在一些内置的控件:Alert,Confirm等,但是这些控件通常根据浏览器产商的不同而形态各异,视觉效果往往达不到UI设计师的要求.更重要的是,这类内置控件的风格很难与形形色色的各种风格迥异的互联网产品的设计风格统一.因此,优秀的前端开发者们各自开发自己的个性化控件来替代浏览器内置的这些控件.当然,这类组件在网络上已经有不计其数相当优秀的,写这篇文章的目的不是为了说明我开发的这个组件有多优秀,也不是为了炫耀什么,只是希望通过这种方式,与更多的开发者互相交

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

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

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

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

全程记录开发一个完整的JavaScript组件教程

在浏览器中存在一些内置的控件 Alert,Confirm等,但是这些控件通常根据浏览器产商的不同而形态各异,视觉效果往往达不到UI设计师的要求.更重要的是,这类内置控件的风格很难与形形色色的各种风格迥异的互联网产品的设计风格统一. 因此,优秀的前端开发者们各自开发自己的个性化控件来替代浏览器内置的这些控件.当然,这类组件在网络上已经有不计其数相当优秀的,写这篇文章的目的是为了通过这种方式,与更多的开发者互相交流,互相学习,共同进步. 功能介绍     取代浏览器自带的Alert.Confirm控