搜索
首页php教程php手册PHP开发一个完整、安全的用户登录系统

  在使用PHP编程的时候,我有一个习惯,不太喜欢使用现成的库文件,例如PHPLib或者其它类似的库,在这个系统中,我也打算自己写一个库文件,它需要处理认证、确认email,更新帐号(密码,email)等事情。

  为了在保证该系统安全的同时,不会加重我现有数据库的负担。因此这个新的系统要依赖cookies。这确实是一个两难的选择,因为如果只是设置一个用户名的cookie,是很不安全的,这行不通,但从数据库的负担考虑,我也不能加入一个简单的无序码而交由我的数据库来进行验证。

  解决的方法是同时设置两个cookie,一个是用户名的cookie,一个是无序码的cookie。这个无序码实际上是由用户名和一个超级密码(只有程序设计者知道)组合通过md5()函数运算产生的。由于md5()是一个单向的无序码,因此是不可以破解的。在用户更改email时,我也可以用该email和超级密码产生一个无序码,以让用户确认修改。这实际上是一个公匙/私匙类的系统。不明白?不要紧,下面再慢慢说明。

  有趣的是,这个系统的扩展能力是可以达到无穷的,因为该系统的主要工作是计算md5()函数的值,而且由web服务器完成,在负载增加时,可以加入其它的服务器来分担负载,虽然认证系统不会拖跨一个数据库,但是这样做就让最终的瓶颈只能出现在数据库上。

  以下是该库中的两个函数--记号产生和记号认证函数。

  <?php<br>    $hidden_hash_var='your_secret_password_here';<br>    $LOGGED_IN=false;<br>    unset($LOGGED_IN);<br>    function user_isloggedin() {<br>     global $user_name,$id_hash,$hidden_hash_var,$LOGGED_IN;<br>     file://已经进行无序码的检测了吗<br>     file://如果是的话,返回该变量<br>     if ( isset($LOGGED_IN) ) {<br>      return $LOGGED_IN;<br>      }<br>     file://are both cookies present?<br>     if ($user_name && $id_hash) {<br>     /*<br>      由cookies中得来的用户名和系统超级密码产生一个认证用的无序码如果该无序码与cookie中的无序码一样,则cookies中的变量是可信的,用户已经登录<br>     */<br>      $hash=md5($user_name.$hidden_hash_var);<br>      if ($hash == $id_hash) {<br>       file://无序码符合,设置一个全局变量,这样我们在再次调用该函数的时候,<br>       file://就无需再次进行md5()运算<br>       $LOGGED_IN=true;<br>       return true;<br>      } else {<br>       file://两个无序码不符合,没有登录<br>       $LOGGED_IN=false;<br>       return false;<br>      }<br>      } else {<br>       $LOGGED_IN=false;<br>       return false;<br>       }<br>      }<br>    function user_set_tokens($user_name_in) {<br>     /*<br>      一旦用户名和密码通过验证,就调用这个函数<br>     */<br>     global $hidden_hash_var,$user_name,$id_hash;<br>      if (!$user_name_in) {<br>       $feedback .= ' ERROR - User Name Missing When Setting Tokens ';<br>       return false;<br>       }<br>     $user_name=strtolower($user_name_in);<br>      file://使用用户名和超级密码创建一个无序码,作判断是否已经登录用<br>      $id_hash= md5($user_name.$hidden_hash_var);<br>      file://设置cookies的有效期为一个月,可设置为任何的值<br>      setcookie('user_name',$user_name,(time()+2592000),'/','',0);<br>      setcookie('id_hash',$id_hash,(time()+2592000),'/','',0);<br>     }<br>   ?>

  再来看另一段有趣的代码,用户怎样才能安全地改变他们的email地址呢?他们可以在任何时候改变email地址,但是要进行确认。



声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具