我有一个网站,有时用户会在那里获得不正确的会话数据。我一直在测试它与两个不同的用户快速登录。我发现,当用户A获取用户B的会话数据时,session_id()中的phpsession与浏览器中的PHPSSID cookie不相等。
代码是这样的:
login.php
if(isset($_POST['uname']) && isset($_POST['password'])){
$logged = login($_POST['uname'],$_POST['password']);
if($logged){
header( 'Location: index.php' ) ;
exit();
}
}
function login($uname,$password){
$user = check_db_user($uname,$password)
if($user){
session_regenerate_id(TRUE);
$_SESSION["name"] = $user->name;
...
return true;
}else{
return false;
}
}
登录操作正常。在index.php中,我看到了错误会话数据的问题。如果发生这种情况,我只需要重新加载页面,它就会呈现正确的会话数据。所以,我认为问题是重定向到index.php没有发送正确的php会话id。我已经尝试添加
header("Set-Cookie: PHPSESSID=" . session_id() . "; path=/");
在重定向之前,但它仍然不起作用。
注销.php
session_start();
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,$params["path"],
$params["domain"],$params["secure"], $params["httponly"]);
}
session_destroy();
session_regenerate_id(TRUE);
header('location:login.php');
我认为您的身份验证有几个漏洞。
- 我没有看到session_start();在您的登录处理部分
- 应该对表单传递的参数进行筛选
- 我认为您在未编码的情况下将用户名存储在$_SESSION中。这也是一个安全风险
这是我以前用的代码。很抱歉,如果存在复制/剪切/粘贴错误。注意:我在调用login()之前验证我的输入。
<?php
define("YOUR_COOKIE,", 'your_bakery' );
define("HASH_SALT", 'your_salt' );
function login( $uname, $passwd ) {
$loginIsOK = FALSE;
$this->userInfo = dbUser( $uname );
if ( ! empty( $this->userInfo ) &&
( $this->userInfo['pwd'] == sha1( $passwd.HASH_SALT ) ) ) {
$this->userInfo['hashedUsername'] = sha1( $uname.HASH_SALT );
$ses_id = session_id();
$hour = time() + 46000; //1hour = 3600
setcookie( YOUR_COOKIE, $this->userInfo['hashedUsername'], $hour );
$xtd=getdate();
$this->userInfo['lastLogin'] = date('Y-M-d H:i:s',$xtd[0]);
$this->userInfo['loginCount'] = $this->userInfo['loginCount'] + 1;
$this->userInfo['sessionId'] = $ses_id;
dbUserUpdate( $this->userInfo );
$loginIsOK = TRUE;
}
return( $loginIsOK );
}
// for the login check:
function isLogedIn() {
if ( empty( $this->userInfo ) )
return false;
$ses_id = session_id();
if ( empty( $this->userInfo['sessionId']) ) {
return false;
}
else if ( $ses_id != $this->userInfo['sessionId'] ) {
$xLoginColision = $this->userInfo['sessionIdCollisions'] + 1;
$this->userInfo['sessionIdCollisions'] = $xLoginColision;
dbUserUpdate( $this->userInfo );
return false;
}
else
return true;
}
// Then for logout the only thing needed is:
$past = time() - 100; //this makes the time in the past to destroy the cookie
setcookie( YOUR_COOKIE, $past );
//you can also change the session id.
我希望这能有所帮助。