防止PHP中的会话劫持

时间:2014-12-13 20:47:37

标签: php session

我编写了我的网页的登录/注销脚本,当用户登录时,我将$_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中重新加载页面,它仍然是登录。

1 个答案:

答案 0 :(得分:0)

最好使用unset()函数,而不是取消设置($ _ SESSION ['用户名'])

我也可以这么说,你的代码在这里有SQL注入漏洞

' $ sql ="更新用户SET已记录='否'用户名='" 。 $ _SESSION ['用户名']。"'&#34 ;; '

因为每个人都可以使用curl,将变量username修改为'或者' 1' =' 1并将其注入

您的网页并获取访问权限,因此您可以将此行修改为

$ sql ="更新用户SET已记录='否'用户名='" 。 stripslashes($ _ SESSION ['用户名'])。"'&#34 ;; '