【发布时间】:2011-11-20 01:50:08
【问题描述】:
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
}
【问题讨论】: