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

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

Jun 21, 2016 am 08:57 AM
hash name user

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

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

php如何实现Redis的Hash操作 php如何实现Redis的Hash操作 May 30, 2023 am 08:58 AM

Hash操作//为hash表中的字段赋值。成功返回1,失败返回0。若hash表不存在会先创建表再赋值,若字段已存在会覆盖旧值。$ret=$redis->hSet('user','realname','jetwu');//获取hash表中指定字段的值。若hash表不存在则返回false。$ret=$redis->hGet('user','rea

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Laravel开发:如何使用Laravel Hash生成密码散列? Laravel开发:如何使用Laravel Hash生成密码散列? Jun 17, 2023 am 10:59 AM

Laravel是目前最为流行的PHPweb框架之一,为开发人员提供了许多强大的功能和组件,其中LaravelHash也是其中之一。LaravelHash是一个用于密码散列的PHP库,其可以用于保护密码的安全,并使应用程序的用户数据更加安全。在本文中,我们将了解LaravelHash的工作原理以及如何使用它来对密码进行散列和验证。前置知识在学习Lara

docker挂载目录权限问题怎么解决 docker挂载目录权限问题怎么解决 Feb 29, 2024 am 10:04 AM

在Docker中,挂载目录的权限问题通常可以通过以下方法解决:使用-v参数指定挂载目录时添加权限相关的选项。可以通过在挂载的目录后面添加:ro或:rw来指定挂载目录的权限,分别表示只读和读写权限。例如:dockerrun-v/host/path:/container/path:roimage_name在Dockerfile中定义USER指令来指定容器中运行的用户,以确保容器内部的操作符合权限要求。例如:FROMimage_name#CreateanewuserRUNuseradd-ms/bin/

Redis基本数据类型哈希Hash常用操作实例分析 Redis基本数据类型哈希Hash常用操作实例分析 May 31, 2023 am 10:43 AM

Redis数据类型Hash常用操作redis里的hash是一个string类型的field(字段)和value(值)的映射表。特别适合用于存储对象,每个hash可以存储40多亿键值对。熟悉python的童鞋可以想象成字典dict。之前的数据类型存储都是k-v这样,而hash的存储就是k-dict,dict里又会有属于自己的k-v。一、hset为哈希表中的字段赋值,如果哈希表不存在,创建一个新的哈希表被并进行hset操作。如果字段已经存在于哈希表中,旧值将被覆盖。hsetmyhashk1v1二、h

一文搞懂Hash算法以及应用场景 一文搞懂Hash算法以及应用场景 Apr 13, 2023 am 11:55 AM

一、什么是哈希算法哈希和散列都来源于单词hash,前者是音译,后者是意译。是一种可以将任意长度的二进制值映射为固定长度二进制值的算法,映射后固定长度的二进制值被称为哈希值。一个优秀的哈希算法需要满足以下几点要求:不能从哈希值反向推导出原始数据;对输入数据非常敏感,一个bit不同就会导致哈希值非常不一样;散列冲突的概率要很小;哈希算法的计算过程要足够简单高效,即使原始数据很长,也能很快得到哈希值;二、哈希算法的使用场景2.1 安全加密比较常见的哈希加密算法有MD5(MD5 Message-Dige

php拿不到name怎么办 php拿不到name怎么办 Nov 24, 2022 am 09:56 AM

php拿不到name是因为当表单元素的name和id的值不一样的时候,浏览器是不能识别的,其解决办法:1、检查部分表单元素和框架元素是否用了name;2、检查只能赋ID不能赋name的元素;3、针对多选框checkbox,可使用“join(',', $__POST['name'])”组成数据。

Vue3中setup怎么添加name Vue3中setup怎么添加name May 13, 2023 am 09:40 AM

Vue3中name有什么用呢?1.在递归组件的时候需要定义name2.配合keep-aliveincludeexclude可以缓存组件3.在Vue有报错或者调试的时候可以看到组件的nameVue3定义name1.自动生成只要在script开启setup语法糖模式单文件组件会自动根据文件名生成对应的name选项例如Tree.vue那他的name就是Tree自动生成,这样做有一个弊端如果想修改name需要修改组件名称如果有地方import该组件需要一并修改。2.在开启一个script用来定义name

See all articles