0

我想创建一个简单的会话管理脚本并知道您对此有何看法?逻辑上正确吗?

我读到如果 https 不可用,那么每次加载时的 session_regenerate_id 可能是一个解决方案,对吧?

if($_SESSION["user"]["logged"] && is_numeric($_SESSION["user"]["id"])){    
    $id = $_SESSION["user"]["id"];  
    $sid = file_get_contents($id);  // read from db the previous key 
    if($sid == $_SESSION["user"]["key"]){  
        echo "<p><a href='?logout'>logout</a></p>";  
        echo "<p><a href='/login.php'>refresh</a></p>";  
        session_destroy();  
        session_start();  
        session_regenerate_id(true);  
        $_SESSION["user"]["logged"] = true;  
        $_SESSION["user"]["id"] = $id;  
        $_SESSION["user"]["key"] = uniqid();  
        file_put_contents($id, $_SESSION["user"]["key"]);  // write to db the new key 

    }  
    else {
        // logout
    }  
}  

先感谢您!

4

1 回答 1

0

我读到如果 https 不可用,那么每次加载时的 session_regenerate_id 可能是一个解决方案,对吧?

什么的解决方案?SSL/TLS 提供传输级别的安全性,保护您在与用户之间传输的数据。在每个请求上重新生成会话 ID 与传输安全无关。的确,没有人能够在运输途中抓住您的 cookie,但这并不是 somoene 能够拿到这个 cookie 的唯一方法。即,如果您的页面容易受到 XSS 攻击,那么在社会工程方面稍有帮助的人就可以窃取您的 cookie。

重新生成可以提高端点(用户)的安全性(尽管这是有争议的),因为如果有人会窃取用户会话 ID cookie,但速度不够快,无法向它发出请求,那么用户将无法使用被盗的值(这不太可能是他不会那么快)。

所以总的来说,如果你不想这样,你的方案是好的,它不是 SSL/TLs 的替代品。登录后重新生成应该是必须的,每个请求的重新生成都是一个补充。

于 2012-11-30T10:18:41.157 回答