class userSessionManager
{
public $_uname;
private $_pword;
private $_userDB_Accessor;
function __construct($userAccessor)
{
$this->_userDB_Accessor = $userAccessor;
}
function tryLogin()
{
// get user information
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// get username and pasword from POST data and make it safe for database
$this->_uname = quote_smart(htmlspecialchars($_POST['userName']));
$this->_pword = quote_smart(htmlspecialchars($_POST['password']));
}
else // username and password were not set
{
return false;
}
$loginPassed = $this->_userDB_Accessor->login($this->_uname, $this->_pword);
if($loginPassed == true)
{
$this->makeSession();
}
return $loginPassed;
}
private function makeSession()
{
session_start();
$_SESSION['userName'] = $this->_uname;
}
function userHasSession()
{
session_start();
if(! isset($_SESSION['userName'])) // session not properly created
{
return false;
}
$this->_uname = $_SESSION['userName']; //save username to object
//destroy and recreate session for security reasons
session_destroy();
$this->makeSession();
return true;
}
}
因此,我阅读了this有关某人如何使用会话ID号访问帐户的文章。列出的一个解决方案是每次加载页面时重置会话ID号。这会是这个想法的安全实现吗?
谢谢大家的建议,这就是我使用它们所做的:
private function makeSession()
{
session_start();
session_regenerate_id(); // reset session id for securty
$_SESSION['userName'] = $this->_uname;
$_SESSION['userIP'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['userBrowser'] = $_SERVER['HTTP_USER_AGENT'];
}
function userHasSession()
{
session_start();
if(!isset($_SESSION['userName']) || // check for a created user
$_SESSION['userIP'] != $_SERVER['REMOTE_ADDR'] || // check for the same IP address
$_SESSION['userBrowser'] != $_SERVER['HTTP_USER_AGENT'] //check for same Browser and OS
)
{
session_regenerate_id();
session_unset();
session_destroy();
return false;
}
return true; // legit user
}
答案 0 :(得分:3)
Massable overkill ... session_destroy不会删除会话cookie,它基本上就是
$ _ SESSION = array()
并删除服务器端会话数据。为防止窃取会话cookie,您必须使用session_regenerate_id()
生成新的会话ID。
答案 1 :(得分:1)
您应该同时使用[session_unset()][1]
和[session_destroy()][2]
。请注意,session_destroy()
仅在重新加载页面或重定向到其他页面时清空变量。只要它是同一页面,变量在调用[session_destroy()][3]
后仍然可用,因此最好在[session_unset()][5]
之前使用[session_destroy()][4]
。
答案 2 :(得分:1)
如果每次特权级别发生更改时都会重新生成会话标识符, 实际上消除了会话固定的风险:
<?php
$_SESSION['logged_in'] = FALSE;
if (check_login())
{
session_regenerate_id();
$_SESSION['logged_in'] = TRUE;
}
?>
我不建议在每个页面上重新生成会话标识符。 虽然这似乎是一种安全的方法 - 而且它不再提供 保护,而不是每当有重新生成会话标识符 特权级别的变化。更重要的是,它可能会产生不利影响 影响您的合法用户,尤其是会话标识符 在URL中传播。用户可能会使用浏览器的历史记录 返回上一页的机制,以及该页面上的链接 将引用不再存在的会话标识符。如果你 只有在更改时才重新生成会话标识符 特权级别,同样的情况是可能的,但是用户是谁 返回到权限级别更改之前的页面 失去会话和这种情况不太可能感到惊讶 也不常见。
有关详细信息,请查看http://phpsecurity.org/ch04.pdf。
答案 3 :(得分:0)
我会将IP地址添加到会话中并检查用户的每个请求。