我编写了我的网页的登录/注销脚本,当用户登录时,我将$_SESSION
变量存储在用户代理中。现在,每次加载页面时,我都会检查用户是否已登录,如果已登录,请检查用户代理是否已更改,或者是否仍然相同以防止劫持。如果它已经改变,我会调用我的logOut()
函数:
function logOut($conn)
{
$sql = "UPDATE Users SET logged='no' WHERE username='" . $_SESSION['username'] ."'";
$conn->query($sql);
// Unset all session values
$_SESSION = array();
// get session parameters
$params = session_get_cookie_params();
// Delete the actual cookie.
setcookie(session_name(), '', time() - 42000,
$params["path"],
$params["domain"],
$params["secure"],
$params["httponly"]);
// Destroy session
session_destroy();
}
现在的问题是,正确的用户仍然可以登录我的网站,而我希望将其注销。可能是什么问题?
为了测试此代码,我使用Mozilla Firefox登录并在Chrome中复制了cookie的值并重新加载了主页,正如预期的那样我无法使用Chrome登录,但如果我在Mozilla中重新加载页面,它仍然是登录。
答案 0 :(得分:0)
最好使用unset()函数,而不是取消设置($ _ SESSION ['用户名'])
我也可以这么说,你的代码在这里有SQL注入漏洞
' $ sql ="更新用户SET已记录='否'用户名='" 。 $ _SESSION ['用户名']。"'&#34 ;; '
因为每个人都可以使用curl,将变量username修改为'或者' 1' =' 1并将其注入
您的网页并获取访问权限,因此您可以将此行修改为
$ sql ="更新用户SET已记录='否'用户名='" 。 stripslashes($ _ SESSION ['用户名'])。"'&#34 ;; '