PHP验证登录状态和安全性

固定的私钥来做salt其实不好,一旦私钥泄漏之后就很麻烦,而且最痛苦的其实是你不知道你到底有没有泄漏

用户的密码字符串作为salt是更好的办法

签名字符串:

$sign = md5('$user_id+$user+_password[+浏览器UA[+IP地址[...]]]');

里面爱加什么你可以自己发挥

存储到cookie里面的字符串为

$token = $user_id.','.$sign;

然后你需要对用户记录做一个服务器端的缓存,缓存通过用户编号查询,里面至少要包含用户的密码

每次用户请求时,都会从缓存里面去拿他的密码来重新计算数字签名做比对

这样的好处有:

  1. 不存在私钥泄漏的问题,即使出问题也不会影响所有用户
  2. slat字符串泄漏就等同于用户的密码泄漏,逻辑上是严密的
  3. 即使有人持有$token字符串,只要用户一修改密码,老的$token就马上失效了

在此基础上还可以有其它的发挥,比如用户记录设计专门的一个字段:salt,每次用户登录成功时就生成一个随机字符串更新到salt内,数字签名计算用

  1. // 记得把 $user_salt也放到缓存里
  2. $sign = md5( '$user_id+$user_password+$user_salt+...');

这样一来,每次用户重新登录之后,之前的$token一定会失效,不但安全性更高,而且还实现了每次只允许一个人登录使用

最后,记得在用户修改密码之后更新你的缓存

PS:

我自己的系统除了使用用户密码来计算数字签名之外,还使用了浏览器UA加固定私钥的方式对$token做了一次对称加密才放到cookie内,算是又多一层保护

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

目前我这么干:

一个数组:

  1. $cookie = array();
  2. $cookie[ 'username'] = '';
  3. $cookie[ 'nickname'] = '';
  4. $cookie[ 'email'] = '';
  5. $cookie[ 'userid'] = '';
  6. $cookie[ 'security_token'] = '';
  7. $cookie = serialize( $cookie);
  8. $seCookie = AES::encode(SYSTEM_AUTH_KEY, $cookie);
  9. Cookie:: set( '__token', $seCookie);
  10. Cookie:: set( '__security_token', $security_token);
  11. /**
  12. * cookie中还有会话id可以和security_token进行绑定验证
  13. */

其他页面的验证就看着办好了。此外还可绑定IP、UserAgent等参数。security_token

猜你喜欢

转载自blog.csdn.net/wei349914638/article/details/80893685