这个PHP代码怎么了,继续得错误2?

时间:2009-08-11 07:10:46

标签: php security session

<?php 
session_start();
// After user logged in
session_regenerate_id();
$_SESSION['logged_in'] = 1;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];


// Session Checking 
function session_check(){
    if(isset($_SESSION['logged_in']) && !empty($_SESSION['logged_in'])){
         if(isset($_SESSION['ip']) && !empty($_SESSION['ip']) && ($_SESSION['ip'] == $_SERVER['REMOTE_ADDR'])){
            if(isset($_SESSION['agent']) && !empty($_SESSION['agent']) && ($_SESSION['agent'] == $_SERVER['HTTP_USER_AGENT'])){ 
                return true;
            } else {
                echo "Not allowed to view this page. Error no: 3. You will be redrected to login page in few seconds";
                header('Refresh: 3; url=./login.php');
            }   
        } else {
            echo "Not allowed to view this page. Error no: 2. You will be redirected to login page in few seconds";
            header('Refresh: 3; url=./login.php');
        }
    } else {
        echo "You are not allowed to view this page. Error no: 1. You will be redirected to login page in few seconds";
        header('Refresh: 3; url=./login.php');
        return false;
    }
}

当我跑步时,我一直收到错误2:

if(session_check()){ echo "something";}

是因为我使用的是动态IP吗?

我的代码是否足以保护会话劫持?

如果我排除($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']),则效果非常好。

重要问题:

你的反会话劫持方法是什么?可以和我们分享?使用IP检查,用户代理检查或可能还有其他方法??

5 个答案:

答案 0 :(得分:1)

是的,一旦您的IP地址发生变化,动态IP地址将导致您以该代码的用户身份注销。您不应使用IP地址来检查会话安全性。您已经拥有的用户代理检查应该足够了。

以下是关于会话安全性的精彩文章:http://phpsec.org/projects/guide/4.html。在底部附近,它显示了如何使用md5散列使用户代理检查更加安全。这里还有一个关于IP地址的摘录:

  

依赖TCP / IP级别的任何内容(例如IP地址)是不明智的,因为这些是较低级别的协议,不适用于在HTTP级别发生的活动。对于每个请求,单个用户可能具有不同的IP地址,并且多个用户可能具有相同的IP地址。

答案 1 :(得分:0)

我假设变量的设置和检查之间发生了更多的事情。这可能是造成问题的原因,但是当我们没有看到任何错误消息或可能导致它的任何代码时,我们很难说出可能导致它的原因。尝试回显一下会话[ip]实际上是什么并在此处发布。

答案 2 :(得分:0)

除非使用输出缓冲,否则在发出写入标头之前不能回显任何内容。我建议您返回状态代码,而不是将标头放在session_check函数中。毕竟,它被命名为session_check,而不是session_check_redirect():D

来自PHP manual on header()

  

请记住,必须调用header()   在发送任何实际输出之前,   通过普通的HTML标签,空白   文件中的行,或来自PHP。它是一个   用于读取代码的常见错误   include(),或require(),函数或   另一个文件访问功能,并有   输出的空格或空行   在调用header()之前。相同   使用单个时存在问题   PHP / HTML文件。

答案 3 :(得分:0)

我看不出你的代码有什么问题。如建议的那样,尝试在$_SERVER的开头var_dumping $_SESSIONsession_check()的内容,看看它们包含的内容。

即使您使用动态IP,也不应在两个请求之间进行更改(当您拔下网络电缆或断开wifi卡时,它通常会发生变化)。

您的方法可能有助于防止会话劫持,但是当攻击者与用户位于同一公共IP地址后面时,该方法无效。

我建议阅读OWASP有关网络安全最佳做法的建议。

答案 4 :(得分:0)

同意马吕斯,可能会有更多的事情发生 我冒昧地让你的if..else逻辑更具可读性:

function session_check(){
    if (empty($_SESSION['logged_in'])){
        echo "Error no: 1.";
        return false;
    } 
    if (empty($_SESSION['ip']) || ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])){
        echo "Error no: 2.";
        return false;
    }
    if (empty($_SESSION['agent']) || ($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT'])){ 
        echo "Error no: 3.";
        return false;
    }

    return true;
}