在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会话变量。