【问题标题】:Session, cookies and ids会话、cookie 和 ID
【发布时间】:2015-07-17 10:02:22
【问题描述】:

有人建议我使用会话进行跨页面存储,并通过将会话 ID 存储在 GET 参数或 cookie 中来维护会话 ID。

将数据保存到会话中并使其永久存在(如登录信息)的最安全方法是什么?

【问题讨论】:

  • 延长会话时间不安全
  • 要回答您的问题,必须使用 both 会话和 cookie,每件事都有其用途。 不要仅仅因为无知而试图从另一个中做出一个。
  • 会话根据定义是有限的。所以一个永远持续的会话不是一个会话。

标签: php session cookies login


【解决方案1】:

会话是 PHP 中的标准功能。从this page 开始阅读有关如何在 PHP 中处理会话的一些详细信息。无论如何,请注意,即使会话也不是 100% 安全的。甚至关于会话也存在许多安全问题(您可以阅读有关 session securitySession FixationSession Poisoning 的内容以了解会话的安全含义)。

【讨论】:

  • 网络上没有任何东西是 100% 安全的,永远!所以基本上你想说的是:RTFM?
  • 不,我只是说您必须评估风险。在某些情况下,高度加密的 cookie 可能比普通会话更安全。你会在我链接的页面上找到详细的讨论
【解决方案2】:

不确定我是否完全理解您的问题,但您可能混淆了两件事。 sid GET 参数在禁用 cookie 时用作备用会话 ID。 GET 参数和 cookie 做同样的事情,但是在 cookie 中存储会话 ID 不会使 URL 混乱,这就是为什么这是首选方法。

当您在 PHP 中使用 $_SESSION 存储会话数据时,数据会在内部存储。它不会传输到用户的浏览器。只有包含会话 ID 的 cookie(或 sid)才会离开服务器。

【讨论】:

  • 我没有投反对票,但您不理解我的问题。我不想使用 cookie,因为它们不安全(它们很容易被编辑),所以我想(在内部)存储我的变量,但让会话持续超过一个独特的用途。
  • @Charlie 但这正是会话的用途。 cookie 只是用来告诉哪个会话属于哪个用户。 cookie 是不安全的,但这没关系。您不会在其中存储任何敏感数据。
  • 能举例说明吗?
  • @Charlie not 您可以假设,如果您遵循 PHP 的标准会话处理实践,其背后的基本机制(与 cookie 或 sid 参数中的会话 ID 一起使用)是合理的 i> 安全。有一些陷阱(在 SO 上有关于它们的讨论,@ass3mbler 链接到其中一些)但会话处理(可能与 SSL 连接一起)通常是标准方法。
  • @Charlie:会话使用 cookie 从所有当前会话中识别您的会话。这样会话就不会发生冲突。他们将会话 ID 存储在 cookie 中,当您请求网页时,他们会通过存储在浏览器上的会话 ID 读取您当前的会话数据
【解决方案3】:

cookie 和 session 的主要区别在于 session 数据存储在服务器端,而 cookie 数据存储在客户端。但由于在服务器和客户端之间发送敏感数据意味着重大的安全问题(数据篡改、窃听等),因此数据应该存储在服务器端。

但是要将客户端与会话相关联,您需要某种标识符。这就是会话 ID 开始使用的地方。因为由于 HTTP 是 stateless(即每个请求都是一个独立的事务,与任何先前的请求无关),所以没有本地方法可以仅通过请求来识别客户端。

因此,您无需将数据存储在客户端的 cookie 中并随每个请求发回,您只需将会话 ID 存储在客户端并随每个请求发回即可。这更加安全,因为敏感数据不会通过网络发送。发送的只是会话 ID(在这里您也可以使用 URL 或 cookie)。

但现在,由于会话 ID 是将客户端与会话相关联的唯一信息,因此会话 ID 已成为某种需要保护的敏感数据。在这里你需要某种session authentication and management 来避免对会话的攻击。

【讨论】:

    【解决方案4】:

    想象一个社区,用户发布链接和外部图片。

    为了使会话保持活动状态,页面使用 GET 而不是 cookie。

    所以:用户观看外部图片或点击外部链接。 外部资源的所有者现在可以读取 REFERER,通过它他可以看到会话 ID 并劫持会话。

    这就是为什么大多数社区和类似页面在页面和外部资源之间放置一个代理,如果 SESSION-ID 是通过 GET 存储的,它们会剥离它。<edited/>

    【讨论】:

    • 嗯,没有。我将检索会话 ID 并使其仅可供首先必须登录的相关用户使用。会话仅用于登录...我可能误解了您的答案。
    • 但要保持会话活动(让用户保持登录状态),您需要通过 URL 传输会话 ID,这就是问题所在。如果用户访问包含外部内容的页面,则可以在外部服务器上检索会话 ID,因为通常请求 URL 在那里作为 HTTP_REFERER 可用。如果有人伪造 cookie 也没问题,如果他不知道有效的 session-ID,什么都不会发生。问题是他是否知道有效的会话 ID,如果您使用 GET 而不是 cookie,这将容易得多。
    • “页面和外部资源之间的代理”?你在说什么?有这样一个社区的例子吗?
    • vbulletin 例如在他们使用安全令牌重建会话管理之前就已经完成了。
    • 做了什么?假设我已经下载了 vbulletin 代码并运行它。该代理的位置在哪里?
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2023-04-05
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多