这是一种验证会话的安全方法吗?

时间:2013-01-10 16:06:20

标签: php content-management-system

我正在为网站构建一个管理面板,我已经编写了我的身份验证代码,但我不确定它有多安全。

这不是登录脚本,但会使用登录脚本设置的一些会话变量。

无论如何,在这里,希望你能为我检查一下(:

if (isset($_SESSION['logged_in'])) {    
//Prevent hijacking of the session
    $recreatesignature = $_SESSION['signature']; //signature (old)
    $recreatessalt = $_SESSION['salt']; //session salt (old)
    $useragent = $_SERVER['HTTP_USER_AGENT']; //useragent (new)
    $ip = $_SERVER['REMOTE_ADDR']; //ip (new)

    $signature = $salt.sha1($ip.$recreatessalt.$useragent); //signature (hash)

    //Compare signatures
    if (!($recreatesignature==$signature)) {
        header(sprintf("Location: %s", $domain));   
        exit();
    }

//Session timeout
    if ((isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] >     $sessiontimeout)))  {
        //destroy session
        session_destroy();   
        session_unset();  
        //redirect to home page
        header(sprintf("Location: %s", $domain));
    }
    $_SESSION['LAST_ACTIVITY'] = time(); 

//Generate new session id to make hijacking harder
    session_regenerate_id(TRUE);
}

2 个答案:

答案 0 :(得分:0)

看起来很完美,但它需要https来防止数据包嗅探以获得完整的“安全”

至于Adder关于其IP的前两个子网的想法,如果数据非常敏感,您可以考虑做一个基本的geo2ip以进一步验证。

答案 1 :(得分:0)

看起来很不错。但是用户代理和IP很容易被欺骗,因此在签名方面将所有内容都留给了盐。我推荐一种相当大的盐。正如其他人所指出的那样,必须使用HTTPS - 然后你还需要确保使用的证书没有受到损害(显然far too easy)。