热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP判断用户登录状态,效率并且安全的方案是什么?

本人比较菜,目前使用的方案是1.在客户端COOKIES中保存用户ID和一个加密码(规则只有我知道)2.如果程序检测到客户端保存的COOKIESID。就去跟数据库验证加密码,如果一致
文章目录[隐藏]
  • 回复内容:

本人比较菜,目前使用的方案是

1.在客户端COOKIES中保存用户ID和一个加密码(规则只有我知道)
2.如果程序检测到客户端保存的COOKIES ID。就去跟数据库验证加密码,如果一致则返回对应用户的登录信息,否则返回FALSE

感觉效率和安全性都不是很好

1.用户访问每个页面都要去跟数据库验证一遍
2.加密码虽然规则很复杂,但是保存在客户端依然存在被破解的可能性

回复内容:

本人比较菜,目前使用的方案是

1.在客户端COOKIES中保存用户ID和一个加密码(规则只有我知道)
2.如果程序检测到客户端保存的COOKIES ID。就去跟数据库验证加密码,如果一致则返回对应用户的登录信息,否则返回FALSE

感觉效率和安全性都不是很好

1.用户访问每个页面都要去跟数据库验证一遍
2.加密码虽然规则很复杂,但是保存在客户端依然存在被破解的可能性

“用户访问每个页面都要去跟数据库验证一遍” 这怎么会呢?

1,浏览器URL访问页面资源,
2,查看SESSION会话是否记录登陆状态,如“否”从3继续,如“是”则到5
3,获取浏览器客户端的COOKIE用户标识信息,如果存在用户信息则继续4,如“否”或者不符合既定原则 则到6
4,判断用户标识是否可信,比如将加密的字串解密,取出字串中的id和密码与数据库中信息对比是否匹配,如果匹配则到5,如果不匹配则6
5,验证登陆状态通过
6,验证登陆状态不通过

如此看怎么会老是读数据库呢?

分割线

一般常规“记住登陆”方法,可以将ID和密码组合成字符串再salt加密后存到浏览器客户端。每次和服务器端验证时,再解密分割取得ID和密码与数据库比对。如此安全性还是可以的。

比如这是存到客户端COOKIE

$data      = $id . "\t" . md5( $password . $slat); //$slat可以是硬编或者随机存在用户列的值$identity  = base64_encode( encrypt( $data , $key ) );//encrypt为自实现的加密函数或方法,$key 可以是硬编或者随机存在用户列的值setCOOKIE("testuser", $identity, time()+3600);

比如这是取

if(isset($_COOKIE['testuser'])){    $iden来&源gao@dai!ma.com搞$代^码%网搞gaodaima代码tity = $_COOKIE['testuser'];    list($id, $password) = explode("\t", decrypt( base64_decode( $identity ) ,  $key));//decrypt为自实现的解密函数或方法,$key 可以是硬编或者随机存在用户列的值        //todo  与数据库列值比对    //...}

将用户信息保存至COOKIES中。
用户信息包括:UID,USERNAME,EMAIL,PASSWORD。
其中 EMAIL,PASSWORD进行可逆加密。
每次登录只须将COOKIES进行一次可逆加密和你数据库对比一次若相等则登录,否则进行正常的登录操作。

===============

PS

======================

关于COOKIEs中是否可以存放用户信息,一直都是业界存在争议的一点。
目前我的解决方法是:
COOKIEs中存放有关于邮箱、QQ号码、用户密码、用户名等信息均需要进行可逆加密。
如有用户信息:

array("uid"=>1,"username"=>"b","password"=>"1234567","email"=>"abc@abc.com");

那么,我将uid,username,password,email等信息分别存放与COOKIEs中,并且将username,password,email通过key(key只能自己知道和设置)进行可逆加密。当每一次需要操作的时候,我只需要$_COOKIE[‘password’]然后将其解密还原为原始的1234567即可,然后将其进行查询匹配。若查询相同则认为该COOKIES有效,若不匹配则删除COOKIEs。

那么,解密之后查询认证有两种方法:

1.直接连接数据库进行SQL查询,这是一种消耗性能的低效方法。

select username,uid,password from xxxx where uid='xxxx',username='xxxxx' LIMIT 1;

这种方法没操作一次需要进行一次SQL查询,将大大增加性能开销。

2.将用户第一次登录查询出来的信息加密保存在COOKIEs的同时,copy保存一份至memcached内存中,并增加标识 uid_status(可自取) 为 1 (登录状态),每一个用户拥有一个唯一的uid_status,并且设置为长期有效。

判断是否登录的过程则更加高效和快速。

将COOKIEs中的信息解密之后,查看uid_status的状态,若为1,直接认定该用户处于登录状态,不删除COOKIEs信息。若为0,非登录状态,则将COOKIEs和memcached中的用户信息进行匹配。匹配包括:password,uid,username。若其中一项不正确则删除COOKIEs,更新uid_status状态。

以上就是我判断用户是否登录过程。

========

P.S

===========

DISCUZ!系列是采用COOKIEs加密后直接查询数据库进行COOKIEs有效判断的。

uc_home核心代码是:

query("SELECT * FROM ".tname('session')." WHERE uid='$_SGLOBAL[supe_uid]'");			if($member = $_SGLOBAL['db']->fetch_array($query)) {				if($member['password'] == $password) {					$_SGLOBAL['supe_username'] = addslashes($member['username']);					$_SGLOBAL['session'] = $member;				} else {					$_SGLOBAL['supe_uid'] = 0;				}			} else {				$query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('member')." WHERE uid='$_SGLOBAL[supe_uid]'");				if($member = $_SGLOBAL['db']->fetch_array($query)) {					if($member['password'] == $password) {						$_SGLOBAL['supe_username'] = addslashes($member['username']);						$session = array('uid' => $_SGLOBAL['supe_uid'], 'username' => $_SGLOBAL['supe_username'], 'password' => $password);						include_once(S_ROOT.'./source/function_space.php');						insertsession($session);//登录					} else {						$_SGLOBAL['supe_uid'] = 0;					}				} else {					$_SGLOBAL['supe_uid'] = 0;				}			}		}	}	if(empty($_SGLOBAL['supe_uid'])) {		clearCOOKIE();	} else {		$_SGLOBAL['username'] = $member['username'];		if($_SGLOBAL['connect']) {			cloud_token();		}	}}?>

COOKIE中怎么能够保存密码呢?

你的做法已经可以了,不过有如下几点建议:
1. 客户端可以保存两种数据,一种是原数据(比如user_id),一种是对所有原数据的签名(你所说的加密码)
2. 原数据的保存可以看具体情况保存原字符串或者可逆加密算法加密后的字符串
3. 针对所有的原数据的签名的算法,最好是不可逆的
4. 服务器端只要获取到原数据,重新计算签名,比如和COOKIE中的签名是否一致即可。

最简单的COOKIE的样子:
A=uid=123&sign=xxxxxxxx

COOKIE生成方法:
sign = md5(secure_key + uid);
COOKIE = ‘uid=’ + uid + ‘&sign=’ + sign
secure_key 是一个私有的串,谁也不能告诉哦。

COOKIE校验的方法:
获取到uid和sign之后
sign == md5(secure_key + uid)

当然如果觉得md5不可靠的话,可以选择更好的算法。

一般这样的不是用$_SESSION变量的么,COOKIES肯定不能保存密码额。我一般是这样用的,用$_SESSION保存登陆状态,用$_COOKIES保存一个用户ID什么的。

只在session中存放UID行不行?

每个页面判断是否存在UID,该UID只有在登录页面才会被添加进session,在登出的时候清空该session



推荐阅读
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • 深入浅出解析HTTP协议的核心功能与应用
    前言——协议是指预先设定的通信规则,确保双方能够按照既定标准进行有效沟通,从而实现准确的信息交换。例如,驯兽师通过拍手使动物坐下,这实际上是一种预设的协议。本文将详细探讨HTTP协议的核心功能及其广泛应用,解析其在现代网络通信中的重要作用。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 深入解析HTTPS:保障Web安全的加密协议
    本文详细探讨了HTTPS协议在保障Web安全中的重要作用。首先分析了HTTP协议的不足之处,包括数据传输过程中的安全性问题和内容加密的缺失。接着介绍了HTTPS如何通过使用公钥和私钥的非对称加密技术以及混合加密机制,确保数据的完整性和机密性。最后强调了HTTPS的安全性和可靠性,为现代网络通信提供了坚实的基础。 ... [详细]
  • 如何在MySQL中选择合适的表空间以优化性能和管理效率
    在MySQL中,合理选择表空间对于提升表的管理和访问性能至关重要。表空间作为MySQL中用于组织和管理数据的一种机制,能够显著影响数据库的运行效率和维护便利性。通过科学地配置和使用表空间,可以优化存储结构,提高查询速度,简化数据管理流程,从而全面提升系统的整体性能。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 本文详细探讨了MySQL并发参数的优化与调整方法,旨在帮助读者深入了解如何通过合理配置这些参数来提升数据库性能。文章不仅介绍了常见的并发参数及其作用,还提供了实际操作中的调整策略和最佳实践,适合希望提高数据库管理技能的技术人员阅读。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 1、sqlite3_open打开数据库函数,若数据库不存在,则创建打开数据库m_db数据库句柄db_filename数据库位置sqlite3 ... [详细]
author-avatar
看吧看吧说你你不信
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有