Rumah >pembangunan bahagian belakang >tutorial php >mysql - PHP验证登录状态的效率和安全性问题
在用PHP做验证登录时遇到了一些问题。我的验证方法是:
想问一下这样做能否确保安全性?md5是否可靠?还有私钥有没有必要设置成与user_id相关的随机字串?
另外,一般网站在登录后都会在每个页面(通常是右上角)显示用户昵称或者用户名,甚至用户的头像,这些数据是存放在数据库中的,如果每个页面都要根据user_id来读取数据库,会不会造成效率下降?如果会,是否要把这些信息存放到cookies或者sessions中?或者是否要对读取数据库的方法进行优化?
在用PHP做验证登录时遇到了一些问题。我的验证方法是:
想问一下这样做能否确保安全性?md5是否可靠?还有私钥有没有必要设置成与user_id相关的随机字串?
另外,一般网站在登录后都会在每个页面(通常是右上角)显示用户昵称或者用户名,甚至用户的头像,这些数据是存放在数据库中的,如果每个页面都要根据user_id来读取数据库,会不会造成效率下降?如果会,是否要把这些信息存放到cookies或者sessions中?或者是否要对读取数据库的方法进行优化?
在使用了salt string之后,md5其实足够可靠
固定的私钥来做salt其实不好,一旦私钥泄漏之后就很麻烦,而且最痛苦的其实是你不知道你到底有没有泄漏
用户的密码字符串作为salt是更好的办法
签名字符串:
<code>$sign = md5('$user_id+$user+_password[+浏览器UA[+IP地址[...]]]'); </code>
里面爱加什么你可以自己发挥
存储到cookie里面的字符串为
<code>$token = $user_id.','.$sign; </code>
然后你需要对用户记录做一个服务器端的缓存,缓存通过用户编号查询,里面至少要包含用户的密码
每次用户请求时,都会从缓存里面去拿他的密码来重新计算数字签名做比对
这样的好处有:
在此基础上还可以有其它的发挥,比如用户记录设计专门的一个字段:salt,每次用户登录成功时就生成一个随机字符串更新到salt内,数字签名计算用
<code>// 记得把$user_salt也放到缓存里 $sign = md5('$user_id+$user_password+$user_salt+...'); </code>
这样一来,每次用户重新登录之后,之前的$token一定会失效,不但安全性更高,而且还实现了每次只允许一个人登录使用
最后,记得在用户修改密码之后更新你的缓存
PS:
我自己的系统除了使用用户密码来计算数字签名之外,还使用了浏览器UA加固定私钥的方式对$token做了一次对称加密才放到cookie内,算是又多一层保护
目前我这么干:
一个数组:
<code class="lang-php">$cookie = array(); $cookie['username'] = ''; $cookie['nickname'] = ''; $cookie['email'] = ''; $cookie['userid'] = ''; $cookie['security_token'] = ''; $cookie = serialize($cookie); $seCookie = AES::encode(SYSTEM_AUTH_KEY,$cookie); Cookie::set('__token',$seCookie); Cookie::set('__security_token',$security_token); /** * cookie中还有会话id可以和security_token进行绑定验证 */ </code>
其他页面的验证就看着办好了。此外还可绑定IP、UserAgent等参数。security_token