【问题标题】:cookies vs sessions for php applicationphp 应用程序的 cookie 与会话
【发布时间】:2011-04-25 02:33:02
【问题描述】:

在实现 php 登录系统会话或 cookie 时有什么更好的方法?

【问题讨论】:

  • 会话默认使用cookies。
  • Cookies/Sessions login system 的可能重复项
  • @Ghommey 那么我应该为我的博客使用网络服务器还是只使用一个网站?
  • @Xeoncross 网络服务器是托管网站的计算机。所以你需要一个网络服务器和一个网站才能拥有一个博客......
  • @jamone 大声笑,我赞成。 xD

标签: php


【解决方案1】:

浏览器 cookie:

  • 在客户端(浏览器)和服务器(PHP)之间共享
    • 除其他外,这意味着“用户可以直接读取/写入数据,您无法控制或限制这一点
  • 大小有限 (4K)
  • 在每个页面请求上都完整发送

PHP 会话:

  • 仅存储在服务器上
  • 可以比 cookie 大很多
  • 通过小cookie或请求参数访问

PHP 会话在后台创建一个 cookie(默认命名为 PHPSESSID,由 session_name() 配置),因此无论哪种方式您都在使用 cookie。会话可以是configured来使用 cookie,但是从 cookie 支持实际上是一个问题的时候,这是一个相当复杂的解决方法。它的作用:重写它可以在输出中找到的所有 URL,将?PHPSESSID=your_session_id 附加到它们后面。问题:它曾经错过一些 URL,而且 URL 看起来很丑(恕我直言)。我已经很久没有看到非 cookie 的 PHP 会话了(大约从 2002 年开始)。

PHP 会话与 cookie 不同,但是在默认配置中,它们使用 cookie 来存储会话数据的“索引”/“指针”。会话数据存储在 PHP 服务器上,当您有一个现有的会话 ID 时,脚本可以访问相应的数据;而对于纯 cookie,您必须将数据保存到 cookie 本身中。 Cookie 受大小限制,并且在每个页面请求时都会发送,因此只发送几个字节长的 cookie 并将数据存储在服务器上是有意义的。

例子:

$_COOKIE: {
    'PHPSESSID' => 'a123456ebdf123'
}

$_SESSION: {
     'user_name' => 'Piskvor',
     8 => 'sadfsadfsdf',
     'huge block of text' => '(a huge block of text could be here, 
          as PHP sessions can usually be bigger than the measly 4K 
          allowed for a cookie)'
}


/tmp/php_sessions/sess_a123456ebdf123 (a file on server, note the name):
(whatever you see in $_SESSION above, passed through serialize())

这也意味着您不应该永远将您不希望用户看到或修改的数据存储到 cookie 中 - 例如如果您的代码设置了 cookie logged-in-user: Piskvor,甚至是 is-admin: 1,那么您无法阻止用户使用内置浏览器工具执行相同操作。将其存储在会话变量中更安全,因为数据不会直接暴露给用户,除非您的代码允许 - 用户看到的只是会话 ID(会话 ID 也不完美 - 请参阅“会话劫持” - 但它们比 cookie 更安全)。

为 TL;DR 人群编辑:使用会话时,它们通常由 cookie 支持,但它们不是相同的东西。 我建议使用会话(出于上述原因;请注意,这通常意味着“通过 cookie”)。

【讨论】:

  • 所以它们基本上是一样的。
  • 不,它们根本不一样。 cookie 保存在用户端,而会话在用户端存储会话 cookie,但也将会话数据存储在服务器上,您可以在其中存储会话期间必须保存在内存中的数据。服务器使用会话 cookie 将客户端映射到正确的会话。
  • 它们实际上并不是一回事,因为这取决于 OP 计划在 cookie 中存储的内容。会话存储一个本地 cookie,从该 cookie 中引用一个远程 cookie。如果 OP 想要存储 - 例如 - 用户名/密码,那么从安全的角度来看,会话将是更可取的,因为这些数据不会存储在本地。显然不建议他们这样做:)
  • 我强烈建议不要将会话配置为不使用 cookie。因为会话 ID 放在 URL 中,所以它会打开每个会话以轻松劫持。
  • 这似乎没有回答这个问题。只是一条长切线。
【解决方案2】:

Cookie 存储在用户的浏览器中。会话存储在服务器端。

如果您有任何敏感信息,切勿将它们放在 cookie 中,因为用户(或有权访问其计算机的人)可以用它们做各种讨厌的事情。

如果您正在做出任何决定 - 例如决定某人是否已登录或具有管理员访问权限 - 您可以使用 cookie,然后将其映射到包含有趣/重要位的会话。

虽然您可以将 cookie 设置为过期,但由于它们存储在浏览器中,因此恶意用户始终可以对其进行调整。我之前已经调整了我自己的 cookie,因此不必再次登录。 ;) 由于会话是服务器端的 - 并且不必与用户共享 - 您可以确保会话在需要时过期。

虽然您需要注意会话固定或重放攻击.. 所以它们也不完美。

【讨论】:

  • 加上cookie的值在每个请求中以明文形式发送到服务器(除非通过ssl或值被加密),并且容易在途中被拦截
【解决方案3】:

保存在 cookie 中:

  1. $user_id
  2. $hash=hash('sha512',$salt.$ip.$user_id)

并且在验证时检查 user_id 的哈希值是否等于存储在 cookie 中的哈希值。这样,您不必在服务器端存储任何内容。

【讨论】:

    【解决方案4】:

    更好?也没有。

    HTTP 是一种无状态协议(无会话)来创建某种类型的会话,您可以使用 cookie(将值存储在 cookie 中的客户端并随每个请求一起传递)或将值作为 URL 参数传递(例如?sessionid=2358734578 }.

    PHP Sessions 只需为每个客户端分配一个 sessionid 并将其存储在 cookie 中,这充当客户端的标识符(您也可以将其配置为使用 URL 参数)。

    所以基本上,您可以使用原生 PHP 会话实现,它将所有内容存储在服务器端,为客户端提供一个通过 cookie 传递的 id,然后提供一种方法让您根据所述 id 检索该会话的数据(其中是通过 cookie 传递的)——或者你可以想出自己的系统(你称之为“使用 cookie”),但最终它不会更好~尽管作为一个副产品,你最终可能会理解 HTTP工作得更多:)

    另请参阅 CaseySoftware 关于安全考虑的回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2021-10-16
      • 2012-07-27
      • 1970-01-01
      相关资源
      最近更新 更多