首页 文章

PHP session_start $ _SESSION值作为登录验证的安全性如何?

提问于
浏览
2

如果用户成功登录并通过安全检查(用户名,密码,2fa ......等等)和假设的PHP登录系统,则执行以下操作:

session_start();
$_SESSION['logged_in_userid'] = 1;

那么依赖于$ _SESSION值'logged_in_userid'的存在作为这个人真的确实以前通过完整安全检查的证据是多么安全?不是,我在想 .

如果通过XSS有人确定PHPSESSID,并手动将其添加到他们自己的本地cookie . 当他们访问同一系统时,他们是否会自动被假定为登录?

如果是这样 - 解决方案是在登录时记录还是在_SESSION中记录:REMOTE_ADDR,HTTP_USER_AGENT和X_FORWARDED_FOR并在每个请求时间比较_SESSION logged_in_userid以及_SESSION REMOTE_ADDR等与当前_SERVER中找到的那些瓦尔?

或者那也是有缺陷的吗?

2 回答

  • -1

    它实际上是安全的 but 你需要做一些额外的事情,以确保有人可以通过XSS劫持'会话,例如你提到的:

    static protected function preventHijacking()
    {
        if(!isset($_SESSION['IPaddress']) || !isset($_SESSION['userAgent']))
            return false;
    
        if ($_SESSION['IPaddress'] != $_SERVER['REMOTE_ADDR'])
            return false;
    
        if( $_SESSION['userAgent'] != $_SERVER['HTTP_USER_AGENT'])
            return false;
    
        return true;
    }
    

    上面的函数检查IP地址以查看它是否与原始用户有关,而不是由其他人 .

  • 2

    OWASP有一个很好的指导如何处理会话管理(和身份验证) . 实际上,您必须在客户端存储会话ID,并在每个请求中验证会话:

    https://www.owasp.org/index.php/Session_Management_Cheat_Sheet

    您正在谈论的内容也包含在:会话固定中

相关问题