【问题标题】:PHP Sessions MixingPHP 会话混合
【发布时间】:2016-02-18 12:17:10
【问题描述】:

我设法让会话使用 PHP,但是,会话正在合并/混合。如果一个用户登录并访问某个页面,然后一个新用户访问同一页面,他们将跳转到第一个用户的会话。

我的代码如下:

session_start();
session_id();

$rainbow = mysqli_query($db, "SELECT * FROM Users WHERE ID='" . $client->ID . "'");
$rainbow = mysqli_fetch_object($rainbow);
$_SESSION['Username'] = $rainbow->Username;
$_SESSION['Password'] = $rainbow->Password; 

每次加载页面时,都会调用session_start()。我也在使用session_id(),所以我不确定会话合并的原因。

这正在成为一个大的安全问题。

此外,页面似乎与此问题一起被缓存,但这似乎不是由缓存引起的会话问题。如果您刷新页面,您将被放回正确的会话中并且页面将被更新,否则,它不会。

【问题讨论】:

  • 你能部分代码你是如何使用 session_id() 的吗?以及会议是如何开始的?看来你的问题在那里
  • session_start(); session_id();
  • $rainbow = mysqli_query($db, "SELECT * FROM Users WHERE ID='" . $client->ID . "'"); $rainbow = mysqli_fetch_object($rainbow); $_SESSION['用户名'] = $rainbow->用户名; $_SESSION['密码'] = $rainbow->密码;
  • 你不需要调用 session_id();它只是返回当前会话 ID。您可以尝试以下技巧以确保您的会话正常或不正常。 session_start(); var_dump($_SESSION['test_name']); $_SESSION['test_name'] = 55;
  • 删除 session_id() 后;你根本没有登录。

标签: php session


【解决方案1】:

您认为您的问题是会话已合并,但您误解了情况。会话正常工作,但您将相同的 usernamepassword 保存为会话变量。

您正在使用一个名为$client 的变量。您可以从中获得一个成员,名为 ID。我确定您在初始化$client 时遇到了问题。确保您正确初始化 $client,它为每个会话都具有正确的 ID,并且没有 SQL 注入的可能性。

【讨论】:

  • 我检查以确保客户端已正确初始化,并且确实如此。登录后,它仍会将您置于其他人的会话中,然后它会破坏您的会话并将您注销。
【解决方案2】:

试试这样的!

if($password === $password_from_database) {

    $_SESSION['email'] = $email;
    $_SESSION['okayToken'] = openssl_random_pseudo_bytes(40, "^!hknvkisQwf@#$m);
    $_SESSION['loginTime'] = time();

}

使用$_SESSION['okayToken'] 进行会话跟踪!
永远不要将passwords 传递给会话。甚至没有密码哈希。

【讨论】:

    【解决方案3】:

    我已经解决了这个问题,现在它正在工作。不过,以后它需要更加独特。

    目前,我已经为会话提供了一个 key,它只是当前的 UNIX 时间戳。

    这似乎使会话保持唯一性,但正如我所说,将来需要更加随机化,以防两个用户具有相同的时间戳,这将使我回到会话所在的合并问题感到困惑。

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多