在PHP中防止会话劫持
我编写了网页的登录/注销脚本,当用户登录时,我将用户代理存储在$会话变量中。现在,每次加载页面时,我都会检查用户是否已登录,如果已登录,我会检查用户代理是否已更改或仍然相同,以防止劫持。如果已更改,我将调用我的注销功能:在PHP中防止会话劫持,php,session,Php,Session,我编写了网页的登录/注销脚本,当用户登录时,我将用户代理存储在$会话变量中。现在,每次加载页面时,我都会检查用户是否已登录,如果已登录,我会检查用户代理是否已更改或仍然相同,以防止劫持。如果已更改,我将调用我的注销功能: function logOut($conn) { $sql = "UPDATE Users SET logged='no' WHERE username='" . $_SESSION['username'] ."'"; $conn->query($sql
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$\u会话['username'] 我还可以说,您的代码在这里有sql注入漏洞 “$sql=UPDATE Users SET logged='no'其中username=”$_会话['username']。;' 因为每个人都可以使用curl,所以将变量username修改为'or'1'='1并将其注入到 您的网页并获得访问权限,因此您可以将此行修改为 $sql=UPDATE Users SET logged='no',其中username='。stripslashes$_会话['username'].;' $\会话=数组;不删除任何内容。它仅取消设置$\u会话变量。