2009-08-11 62 views
0
<?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; 
    } 
} 

而且我不断收到错误NO2当我运行:这个php代码有什么问题,继续收到错误没有2?

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

难道是因为我使用动态IP?

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

如果我排除($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']),它可以很好地工作。

重要的问题:

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

+0

还有一个缺失?>。它在你的实际代码中吗? – Extrakun 2009-08-11 07:13:39

+0

一般来说:如果你打算使用'empty()',你可以省略'isset()'。 'empty()'不会抱怨不存在的变量。 – deceze 2009-08-11 07:14:12

+0

@extrakun:如果我失踪?>,它不会是“错误no2”..我已经包括?>。 @deceze:谢谢你的提示。我不知道。我的代码有什么问题吗? – bbtang 2009-08-11 07:15:41

回答

1

是的,一个动态的IP地址会导致你获得注销,因为这代码的用户,只要您的IP地址发生变化。您不应该使用IP地址来检查会话安全性。用户代理检查你已经有足够的自己。

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

是不明智的依赖于TCP/IP的水平,如IP地址什么,因为这些不打算以适应正在发生的活动下层协议HTTP级别。单个用户可能对每个请求具有不同的IP地址,并且多个用户可能具有相同的IP地址。

+0

有人说检查用户代理只是不够安全,所以我包括了我所拥有的一切..也许我应该排除IP检查,如果我真的不能找到答案在这里:( – bbtang 2009-08-11 07:33:51

+0

是的,你应该排除IP检查,这是我想在我的回答中说什么。 – 2009-08-11 07:35:26

+0

你能读一读吗?http://stackoverflow.com/questions/1221447/what-do-i-need-to-store-in-the-php-session-when用户登录 查找linead答案。 – bbtang 2009-08-11 07:49:01

0

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

0

除非使用输出缓冲,否则在发出写入标头之前不能回显任何内容。我建议你改为返回一个状态码,而不是把头放在session_check函数中。毕竟,这是session_check命名,不session_check_redirect():d

PHP manual on header()

请记住,标题()必须被调用 任何实际的输出被发送之前, 无论是普通的HTML标签,空白 文件中的行或来自PHP的行。在调用header()之前,包含()或require()函数或 另一个文件访问函数,并且有 空格或空行输出 是一个 非常常见的错误。使用单个 PHP/HTML文件时存在相同的 问题。

+0

好吧,其实并没有真正的回声。在执行session_check()之后,我将继续处理其他内容,例如查看配置​​文件,更新配置文件等。嗯,我会尝试将头部放在session_check函数之外。尽快回复你 – bbtang 2009-08-11 07:23:18

+0

你的header()之前有一个echo语句。尝试删除回声,看看它是否工作。 – Extrakun 2009-08-11 07:24:15

+0

我拿出了标题完全,但它没有工作.. – bbtang 2009-08-11 07:34:49

0

我看不出你的代码有什么问题。如所建议的,尝试在session_check()的开始处var_dumping $_SERVER$_SESSION的内容以查看它们包含的内容。

即使您使用动态IP,它也不应该在两个请求之间改变(当您拔下网线或断开WiFi卡时,它通常会发生变化)。

您的方法可能有助于防止会话劫持,但在攻击者位于与用户相同的公共IP地址后面时不起作用。

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

0

与Marius一致,可能会有更多的事情发生。
我已经采取了让您的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; 
} 
+0

好吧,我试过使用我们的代码。看起来像得到相同的错误,“错误号:2”。其余的都很好。太奇怪了。如果我排除($ _SESSION ['ip']!= $ _SERVER ['REMOTE_ADDR']),它工作正常 – bbtang 2009-08-11 07:30:30

+0

您检查了变量吗?把这个放在IP检查前面:'echo $ _SESSION ['ip']。“==”。$ _ SERVER ['REMOTE_ADDR'];' – deceze 2009-08-11 07:38:42

+0

尝试过,但仍然失败。我输出2个变量,它们是相同的。那么nvr介意。我会排除这个检查,就像杰里米鲁顿所建议的那样。 – bbtang 2009-08-11 07:45:27