<?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检查,用户代理检查或可能还有其他方法??
答案 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
请记住,必须调用header() 在发送任何实际输出之前, 通过普通的HTML标签,空白 文件中的行,或来自PHP。它是一个 用于读取代码的常见错误 include(),或require(),函数或 另一个文件访问功能,并有 输出的空格或空行 在调用header()之前。相同 使用单个时存在问题 PHP / HTML文件。
答案 3 :(得分:0)
我看不出你的代码有什么问题。如建议的那样,尝试在$_SERVER
的开头var_dumping $_SESSION
和session_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;
}