我编写了网页的登录/注销脚本,当用户登录时,我将用户代理存储在$_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 中重新加载页面,它仍然登录。
最好使用 unset() 函数,而不是 unset($_SESSION['用户名'])
我也可以说你,你的代码在这里有sql注入漏洞
' $sql = "更新用户设置日志='否' 其中用户名='" . $_SESSION['用户名'] ."'";'
因为每个人都可以使用 curl ,将变量用户名修改为 ' 或 '1'='1 并将其注入到
您的网页并获得访问权限,因此您可以将此行修改为
$sql = "更新用户设置日志='否' 其中用户名='" . 条形斜杠($_SESSION['用户名']) ."'";'