首頁 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/

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

一、什麼是雜湊演算法雜湊和雜湊都來自單字hash,前者是音譯,後者是意譯。是一種可以將任意長度的二進位值映射為固定長度二進位值的演算法,映射後固定長度的二進位值稱為雜湊值。一個優秀的雜湊演算法需要滿足以下幾點要求:不能從雜湊值反向推導出原始資料;對輸入資料非常敏感,一個bit不同就會導致雜湊值非常不一樣;雜湊衝突的機率要很小;哈希演算法的計算過程要夠簡單高效,即使原始資料很長,也能很快得到哈希值;二、雜湊演算法的使用場景2.1 安全加密比較常見的雜湊加密演算法有MD5( MD5 Message-Dige

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

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