【问题标题】:secure sessions/cookies in phpphp 中的安全会话/cookie
【发布时间】:2011-04-08 04:53:14
【问题描述】:

我有一个关于会话的问题。你如何建立一个安全的登录会话/cookie。 我在看这个例子,他们将这个数组添加到会话中:

$data = array{

    username = $_POST['username'];
    is_logged = true;

}

我想知道这是否足够?不能将cookie中的用户名更改为任何人或任何人吗?有什么好的方法可以解决这个问题?

或者这是完全安全的,我错过了什么吗?

另外,你们如何看待在数据库中存储会话?我知道 CI 有一个内置功能可以做到这一点。这是否会导致性能方面的任何问题,还是值得启用?

【问题讨论】:

  • 我不明白你的代码 sn-p 你到底在做什么。
  • 我将 $data 数组传递给会话,以便它使用它创建一个 cookie。但这看起来不安全,我想知道如何使它安全......

标签: php session cookies


【解决方案1】:

我相信您误解了 PHP 会话应该如何工作。您可以安全地将用户名、登录状态和其他内容存储到 $_SESSION 数组中,因为它存储在服务器端。唯一发送到浏览器的是一个 cookie(命名为 PHPSESSID,除非你在 php.ini 中更改了它)包含会话 ID - 这是一个唯一的随机数。

一旦您的访问者在每次请求顶部有 session_start() 的页面时都有一个活动会话,session_start() 将查看对名为 PHPSESSID 的 cookie 的请求,读取服务器端会话文件(如果会话存在并且有效)并恢复归档的$_SESSION数组。这个数组永远不需要离开服务器。

会话 cookie 的设置没有过期日期(除非您弄乱了 php.ini 中的 session.cookie_lifetime 选项),因此浏览器会在关闭时将其删除。服务器上的会话文件本身有一个过期时间,由session.gc_maxlifetime 管理(以秒为单位)。

更安全的会话路径:

  • 确保仅使用 cookie 将会话 id 传递给浏览器设置 session.use_cookies=1session.use_only_cookies = 1session.use_trans_id = 0(备用语法的详细信息我就不多说了)
  • 防止会话劫持(即其他人伪造现有会话)将标识浏览器的内容存储到 $_SESSION 中 - 一种常见模式是存储浏览器的 User-Agent 标头、Accept 标头、远程 IP 的 md5()地址或这些地址的组合;检查它是否在每个具有现有会话 ID 的新请求中匹配
  • 如果您在共享服务器上,则确实应该将会话文件与服务器邻居的会话文件分开:将 session.save_path 设置为只有您和 PHP 可以访问的文件夹。

最后,您应该创建一个脚本来让用户退出会话(并鼓励他们使用它而不是简单地离开)。这是一个示例脚本:

<?php
  session_start();
  $params = session_get_cookie_params();
  setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
  session_regenerate_id(true);
  session_destroy();
  session_write_close();
  header('Location: your_login_page.php');
  exit;

【讨论】:

  • 谢谢,你说得对,我将会话与 cookie 混淆了!很清楚的解释!
【解决方案2】:

是的,这是一种非常不安全的方法,如果您想防止会话劫持,则不应在任何地方使用。

一种更可靠的方法是在用户登录时为用户生成一个唯一的会话 ID(例如哈希),并将会话与服务器端的此 ID 相关联。然后仅将 cookie 中的此会话 ID 发送回客户端。当客户端发送带有 cookie 的请求时,您会获取会话 ID 并恢复用户名和与之相关的任何其他信息以进行请求处理。

客户端可以访问 cookie 中的会话 ID,但该值对他来说毫无意义,因为他无法从中推断出任何信息,并且发送随机会话 ID 成功的机会很小。

【讨论】:

  • 您的意思是我应该在将用户ID 发送到cookie 时应用md5 函数,还是应该在生成哈希时使用某种密钥以便恢复用户ID?谢谢!
  • 您应该生成一些不可预测的东西,否则恶意用户可能会不断生成具有不同用户 ID 的值并对其进行哈希处理。您可以生成 [userID][some random data] 形式的字符串,然后对其进行哈希处理。可以使用 PHP 的 uniqid() 函数生成随机数据。这样你就很安全了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 2011-06-11
  • 2011-12-03
  • 2016-04-08
  • 2014-08-09
  • 2023-03-12
相关资源
最近更新 更多