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

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











해시 연산 //해시 테이블의 필드에 값을 할당합니다. 성공하면 1을, 실패하면 0을 반환합니다. 해시 테이블이 없으면 테이블이 먼저 생성된 후 값이 할당됩니다. 필드가 이미 있으면 이전 값을 덮어씁니다. $ret=$redis->hSet('user','realname','jetwu');//해시 테이블에서 지정된 필드의 값을 가져옵니다. 해시 테이블이 없으면 false를 반환합니다. $ret=$redis->hGet('사용자','지역

Laravel은 현재 가장 인기 있는 PHP 웹 프레임워크 중 하나이며 개발자에게 많은 강력한 기능과 구성 요소를 제공하며 LaravelHash도 그 중 하나입니다. LaravelHash는 비밀번호를 안전하게 유지하고 애플리케이션의 사용자 데이터를 더욱 안전하게 만드는 데 사용할 수 있는 비밀번호 해싱용 PHP 라이브러리입니다. 이 글에서는 LaravelHash의 작동 방식과 이를 사용하여 비밀번호를 해시하고 확인하는 방법을 알아봅니다. 라라 학습을 위한 필수 지식

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

Docker에서 탑재 디렉터리의 권한 문제는 일반적으로 탑재 디렉터리를 지정하기 위해 -v 매개 변수를 사용할 때 권한 관련 옵션을 추가하는 방법으로 해결됩니다. 마운트된 디렉토리 뒤에 ro 또는 :rw를 추가하여 마운트된 디렉토리의 권한을 지정할 수 있습니다. 이는 각각 읽기 전용 및 읽기-쓰기 권한을 나타냅니다. 예: dockerrun-v/host/path:/container/path:roimage_name 컨테이너 내부 작업이 권한 요구 사항을 준수하는지 확인하기 위해 컨테이너에서 실행 중인 사용자를 지정하려면 Dockerfile에서 USER 지시어를 정의하세요. 예: FROMimage_name#CreateanewuserRUNuseradd-ms/bin/

Redis 데이터 유형 Hash의 일반적인 작업 Redis의 Hash는 문자열 유형 필드와 값의 매핑 테이블입니다. 특히 객체 저장에 적합한 각 해시는 40억 개 이상의 키-값 쌍을 저장할 수 있습니다. 파이썬에 익숙한 어린이 신발은 사전적 딕셔너리라고 생각하시면 됩니다. 이전 데이터 유형 저장소는 k-v이고 해시 저장소는 k-dict이며 dict는 자체 k-v를 갖습니다. 1. hset은 해시 테이블의 필드에 값을 할당합니다. 해시 테이블이 없으면 새 해시 테이블을 생성하고 hset 작업을 수행합니다. 해당 필드가 해시 테이블에 이미 존재하는 경우 이전 값을 덮어씁니다. hsetmyhashk1v1 2, h

1. 해싱 알고리즘이란 무엇입니까? 해싱과 해싱은 모두 해시라는 단어에서 유래되었습니다. 전자는 음역이고 후자는 자유 번역입니다. 임의 길이의 이진 값을 고정 길이 이진 값으로 매핑할 수 있는 알고리즘입니다. 매핑된 고정 길이 이진 값을 해시 값이라고 합니다. 우수한 해시 알고리즘은 다음 요구 사항을 충족해야 합니다. 해시 값에서 원본 데이터를 역으로 추론할 수 없으며 입력 데이터에 매우 민감하며 다른 비트로 인해 해시 값이 매우 달라집니다. 충돌이 매우 작아야 하며 해시 알고리즘의 계산 프로세스는 충분히 간단하고 효율적이어야 하며 원본 데이터가 매우 길더라도 해시 값을 빠르게 얻을 수 있습니다. 2. 해시 알고리즘의 사용 시나리오 2.1 안전한 암호화 일반적인 해시 암호화 알고리즘에는 MD5(MD5 Message-Dige)가 포함됩니다.

양식 요소의 이름과 ID 값이 다르면 브라우저가 이를 인식할 수 없기 때문에 PHP는 이름을 얻을 수 없습니다. 해결 방법: 1. 일부 양식 요소와 프레임 요소가 이름을 사용하는지 확인하십시오. 2. 이름을 사용할 수 있는 요소만 확인하십시오. ID는 할당되지만 이름은 할당되지 않습니다. 3. 다중 선택 상자 확인란의 경우 "join(',', $__POST['name'])"을 사용하여 데이터를 구성할 수 있습니다.

Vue3에서 이름의 용도는 무엇입니까? 1. 재귀 컴포넌트를 만들 때 이름을 정의해야 합니다. 2. keep-aliveincludeexclude를 사용하여 해당 컴포넌트를 캐시할 수 있습니다. 3. Vue가 오류를 보고하거나 디버깅할 때 해당 컴포넌트의 이름을 정의하는 것을 볼 수 있습니다. 스크립트에서 설정 구문 설탕 모드가 켜져 있는 한 자동으로 생성됩니다. 단일 파일 구성 요소 해당 이름 옵션은 예를 들어 Tree.vue에 따라 자동으로 생성되며 해당 이름은 Tree에 의해 자동으로 생성됩니다. 이는 단점이 있는데, 이름을 수정하려면 컴포넌트 이름을 수정해야 합니다. 2. 이름을 정의하는 스크립트를 엽니다.
