【问题标题】:Is there a way to invalidate user's cookie?有没有办法使用户的 cookie 无效?
【发布时间】:2012-03-04 02:04:08
【问题描述】:

有没有办法使用户的 cookie 失效?

场景:

  1. 用户访问我的网站(我可以获得任何我想要的数据);
  2. 用户离开页面;
  3. 一段时间后,来自另一台服务器的回调带有用户 ID。此时,我需要使用户会话和 cookie 无效。

对于会话,这很简单:

session_id($user['session_id']);
session_destroy();

如何使用 cookie 实现相同的功能?

请参阅此帖子下的 cmets 了解更多详细信息以及它与 Facebook 的关系。

简单的解决方案是替换 PHP-SDK 将用户信息从 cookie 存储到会话的位,但转到包文件总是一个坏主意。

【问题讨论】:

  • “来自另一台服务器的回调带有用户 ID”到底是什么意思?
  • 您并没有“使 cookie 无效”,而是使 cookie 数据扩展到与请求一起使用它的任何人的权限无效。一,你怎么知道它来自不同的服务器?第二,如果您可以确定一个请求是不合法的,那么无论您的服务器上的 cookie 数据引用以授予其代表用户执行操作的权限,都需要被删除,即,指示的任何会话,或其他任何内容。但是,cookie 只是该数据的传输。
  • @JaredFarrish 仅接受来自 Facebook 服务器的请求。问题是 Facebook SDK 使用 cookie 来获取有关用户的一些数据(用户 ID,[..])。现在,系统设计逻辑是这样的:如果 FB PHP-SDK 告诉我存在用户 ID,则表示该用户已通过身份验证 -> 继续检查用户是否在 DB 中。如果没有,请获取有关用户的信息。这是引发异常的地方,因为实际上应用程序不再有权访问此信息。所以我需要想出一种方法来删除 PHP-SDK 用来存储这些信息的 cookie。
  • 这就是问题的所有相关信息,Guy。就目前而言,您的问题并未说明您的实际问题是什么。我会编辑您的问题,添加该描述,并为其添加 facebook 和/或 facebook-api 标签。
  • @Guy - 我试图用更多关于 cookie 本质的上下文来更新我的答案,尽管我知道它不会帮助你解决困境。但我认为理解 cookie 的字面意义会有所帮助,它只是包含在客户端/服务器之间的标头请求或响应中的文本字符串。

标签: php facebook cookies session-cookies


【解决方案1】:

编辑

您的其他 cmets 表示您并不真正了解 cookie 的字面意思,所以如果您已经理解我要解释的内容,我提前道歉。

虽然我怀疑您需要一些 Facebook 特定的帮助来回答或解决您的实际问题,但我想指出 cookie 的真正含义:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT

http://en.wikipedia.org/wiki/HTTP_cookie#Setting_a_cookie

这就是 cookie 在客户端和服务器(请求者/响应者)之间传输的方式。您可以使用 Firebug 或 Chrome 控制台中的“网络”选项卡来亲自查看请求是如何发出的以及来回发送哪些数据。它们本质上不是系统地“记录”的,本身也不是有限的“事物”,而只是包含在请求和响应数据包中的标头的一部分,类似于电子邮件标头中的 CC/BCC 字段:伪- 短暂但具有描述性。

要实现 Cookie 在使用前验证的效果,您需要确定如何将参考 ID 附加到 cookie,或者(或者)使用计算代码检测特定 cookie,该代码必须在请求中提交其他数据时出现。 Jan's answer 中描述了另一种方法。

但是,通常不会以这种方式处理 Cookie。它们只是运输工具,意味着结束,填补了 GET 和 POST 之间的空白。


您并没有“使 cookie 无效”,而是使 cookie 数据扩展到与请求一起使用它的任何人的权限无效。

一,你怎么知道它来自不同的服务器?第二,如果您可以确定请求不合法,则无论您的服务器上的 cookie 数据引用以授予其代表用户执行操作的权限,都需要删除,即,指示的任何会话都已结束/销毁,或其他任何别的。

不过,cookie 只是该数据的传输。您必须能够拦截、检测和阻止它为其持有者提供的任何访问权限,以使其“无用”。

如果您要问一些具体的问题,请提供更多信息。但从本质上讲,您似乎需要做的就是忽略 cookie,这些 cookie 包含您已确定为无效或不真实的数据或提供不正确的访问权限(对冒名顶替者)。

【讨论】:

    【解决方案2】:

    您不能为未直接向您的服务器发出请求的用户设置(取消设置/无效)cookie。你将不得不做更多的工作。

    我会这样做:

    在某处(db、redis 等)存储您为用户设置的 cookie。这样您就可以知道用户拥有哪些 cookie。然后,当请求无效时,将存储中该用户的 cookie 标记为已删除(或类似的东西)。然后,每次用户请求您的页面时,检查他是否在您的存储中删除了任何 cookie。如果他破坏了他的会话并在那里使他的 cookie 无效(例如将它们设置在过去)。

    【讨论】:

      【解决方案3】:

      Cookie 存在于客户端,您无法在服务器端对其进行任何操作。 但是,如果您的“一段时间后”意味着 cookie 应该在一段时间后过期,您应该在设置 cookie 时设置过期时间。您不必担心用户是否还在他的页面上,因为如果他离开并在一段时间后再次访问,浏览器会为您处理。

      例如,下面的代码显示了如何设置一个 cookie 应该在 1 小时后过期。

      $value = 'something from somewhere';
      
      setcookie("TestCookie", $value);
      setcookie("TestCookie", $value, time()+3600);  /* expire in 1 hour */
      setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1);
      

      【讨论】:

      • 这没有意义。在使用 cookie 服务器端之前,系统上必须有某种参考 ID 来批准它。
      • @Guy - Cookie 本质上没有参考 ID。它们实际上只是用于传输(在大多数情况下)作为客户端和服务器之间标头的一部分的短 sn-ps 数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多