我有一些基本代码,我放在每个页面的标题上以确保用户已登录。我希望有人可以看看它并给我一些建议:
if ($_SESSION['logged_in'] == 1) {
$handle = dbconnect::init;
$result = $handle->select()->from('session_id')
->where('session_id=?', $_SESSION['SID'])
->columns('ip');
$check = $result->fetchAll();
if ($check[0]->ip != $_SERVER['REMOTE_ADDR']) { //user has changed networks
// or someone is trying
// to switch cookies on us
return false;
}
} else {
return false;
}
谢谢!
答案 0 :(得分:1)
function checkLoggedIn () {
// Return early if we are not logged in. Also, by using empty we
// avoid warnings of the 'undefined index' kind.
if (empty($_SESSION['logged_in'])) {
return false;
}
$handle = YourDbClass::getConnection();
$result = $handle->select()->from('session_id')
->where('session_id=?', $_SESSION['SID'])
->columns('ip');
$check = $result->fetchAll();
if ($check[0]->ip != $_SERVER['REMOTE_ADDR']) { //user has changed networks
// or someone is trying
// to switch cookies on us
return false;
}
return true;
}
您的代码对我来说非常好。我将它包装在一个函数中,因此您不需要在每个页面上复制它,只需要您的util.php或您想要调用函数库的任何内容。然后只需调用checkLoggedIn()。如果它返回false,则用户未登录,您可能会发送错误页面,退出或其他任何内容。如果返回true,则可以继续。
答案 1 :(得分:1)
您是否特别需要从数据库中提取远程IP?在_SESSION中存储远程IP会更容易,而不是用另一个查询来打扰数据库 您可能希望为用户提供禁用此功能的选项,因为他们可能必须通过更改IP地址的透明代理连接到您的服务器,例如, http://webmaster.info.aol.com/proxyinfo.html说:
AOL会员对互联网对象的请求通常由AOL代理系统处理。当成员为多个URL请求多个文档时,每个请求可能来自不同的代理服务器。由于一个代理服务器可以有多个成员进入一个站点,因此网站管理员在设计网站时不应对成员与代理服务器之间的关系做出假设。
挑剔:在尝试访问之前,您应首先测试是否至少有一条记录。可能类似于:
if ( !isset($check[0]) || $check[0]->ip!=$_SERVER['REMOTE_ADDR'] )