开发者社区> 问答> 正文

PHP判断用户登录状态,有没有更好的方案?

本人比较菜,目前使用的方案是
1.在客户端COOKIES中保存用户ID和一个加密码(规则只有我知道)
2.如果程序检测到客户端保存的COOKIES ID。就去跟数据库验证加密码,如果一致则返回对应用户的登录信息,否则返回FALSE
感觉效率和安全性都不是很好
1.用户访问每个页面都要去跟数据库验证一遍
2.加密码虽然规则很复杂,但是保存在客户端依然存在被破解的可能性

展开
收起
落地花开啦 2016-06-13 15:55:26 2147 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    “用户访问每个页面都要去跟数据库验证一遍” 这怎么会呢?
    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']))
    {
        $identity = $_COOKIE['testuser'];
        list($id, $password) = explode("\t", decrypt( base64_decode( $identity ) ,  $key));//decrypt为自实现的解密函数或方法,$key 可以是硬编或者随机存在用户列的值
        
        //todo  与数据库列值比对
        //...
    }
    2019-07-17 19:36:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载