防止 PHP 中的会话劫持


Prevent session hijacking in PHP

我编写了网页的登录/注销脚本,当用户登录时,我将用户代理存储在$_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['用户名']) ."'";'