【问题标题】:Cookies not accurate if people share the same IP address?如果人们共享相同的 IP 地址,Cookie 不准确?
【发布时间】:2018-07-27 00:47:00
【问题描述】:

当用户 A 连接到我的网站时,我在该用户的浏览器中设置了一个 cookie,以识别他并跟踪他正在做什么以根据他的行为提供内容。

当用户 B 连接并来自同一个 IP 地址时,用户 B 会获取用户 A 的 cookie 和反之亦然。似乎 cookie 混淆了,因为 Web 服务器看到的是一个用户而不是多个用户,因为多个用户来自同一个 IP。

只有一组使用相同 ISP 的用户才会出现此问题。该 ISP 将相同的 IP 地址(和主机名)分配给多个帐户/用户。 (许多人共享一个 IP)如果来自同一个 ISP 的两个(或更多)人在同一个 IP 上出现在我的网站上,那么 cookie 操作似乎在他们之间共享,这会导致问题。

当个人用户来自同一个 IP(共享一个 IP 地址)时,可以采取哪些措施来准确跟踪他们,因为在这种情况下 cookie 似乎无法正常工作?也许问题出在相关的 ISP 上?

SSL 会解决这个问题吗?也许这是我设置cookie的方式?

我在 Perl 中发布了一个关于如何设置 cookie 的示例:

use CGI;
$q = CGI->new;

### the routine &get_random_number used below is a unique random number 
### generator that also uses $ENV{HTTP_USER_AGENT} for entropy
### &get_random_number returns a unique number (session id)
$session_id = &get_random_number; 

$thecookie1 = $q->cookie(-name=>'something', -value=> $session_id );
print $q->header(-cookie => $thecookie1); 

这是读取cookie的代码:

use CGI;
$q = CGI->new;
$thecookie = $q->cookie('something');

这篇文章中解释的情况只发生在特定的 ISP 上(所有使用这个 ISP 的用户都来自同一个 IP 并且具有相同的主机名) - ISP 与许多用户共享一个 IP .该 ISP 为手机提供移动互联网。

更新 1:

我认为这一定与相关 ISP 实施的缓存代理服务器有关,因为这只发生在相关 ISP 上。

为了解决这个问题,我做了以下事情:(问题发生的次数急剧减少) - 我所做的最后一次更改 正在向设置 cookie 的页面添加无缓存元标记,我希望能完全解决它。时间可能会证明一切。

从页面设置 cookie 我执行以下操作:

print $q->header(-type=>'text/html',
-Pragma=>'no-cache',
-Cache_Control=> 'no-store,no-cache,must-revalidate,post-check=0,pre-check=0',
-expires=>'now -1d',
-cookie=> $cookie
); 

print qq[
<head>
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" /> 

etc... etc...
];

更新 3:

升级 Apache 似乎可以解决问题,但问题又回来了。我确实解决了它,但 我可以解决它的唯一方法是将所有内容移至 https://

迁移到 https:// 解决了这个问题。

【问题讨论】:

  • 我不确定这个问题是否真的可以回答。我们对您的环境的了解还不够,无法说出来。您如何设置cookies?可能是这样。可能是他们的 ISP 通过缓存和代理做脏事。
  • 不要根据 IP 地址设置 cookie - 在您使用的任何服务器环境中使用会话语义
  • “当用户 B 连接并来自同一个 IP 地址时,用户 B 会获取用户 A 的 cookie”——正如 Sobrique 所暗示的,这不是正常行为。
  • 这不是预期的行为,如果它是基于 cookie 的会话状态的基本概念根本就行不通;它确实如此。还有其他问题。
  • 在您的系统中,您是否假设 IP 唯一标识用户?

标签: perl cookies session-cookies


【解决方案1】:

我怀疑这些用户共享一个缓存代理。请务必禁用包含 Set-Cookie 标头的响应的缓存。我们通过如下方式输出 CGI 标头来做到这一点:

print header(-type=>'text/html', -expires=>'now -1d', -cookie=>\@cookies);

【讨论】:

  • 谢谢!我想我同意你的观点,因为这是唯一有意义的事情。您能否解释一下 -expires=>'now -1d' 的作用? (我需要 cookie 不会立即过期,因为我想跟踪用户未来的访问)
  • 那是 response 过期的时间,而不是 cookie。
【解决方案2】:

我知道您认为这个问题已通过 Apache 更新解决,但我向您保证,这不是“修复”它的原因。升级 Apache 刚刚导致您的配置发生了一些变化,如果您恢复原始配置,问题也会在新版本中再次出现。换句话说,这当然也不是您看到的 Apache 错误,而是您如何配置它的问题。

基本上,您似乎遇到了一种情况,即 Apache 除了或替换您通过 Perl 设置的缓存头之外,还设置了自己的缓存头。您可能通过mod_headers 或通过错误配置mod_expiresmod-cache 进行此操作

【讨论】:

    【解决方案3】:

    Cookie 与 IP 地址没有任何关系,它们是在客户端创建并链接到浏览器。例如,如果用户使用 Chrome 登录到您的网站,他们将拥有与在同一台计算机(和 IP 地址)上使用 IE 登录不同的 cookie 集。

    我认为您的问题可能与您在 cookie 中放入的内容有关,这完全取决于您和您的代码。

    您是否尝试过使用会话来代替?在 PHP 中,您只需要调用 session_start(),然后在 $_SESSION 变量中设置数据。

    如果你发布一些你正在做什么的示例代码,我可能会给你一个更具体的答案。

    【讨论】:

    • "您是否尝试过使用会话来代替?" — 会话通过……cookie 与浏览器相关联。
    • 是的,会话确实使用 cookie,但它们消除了您自己显式设置 cookie 的需要(至少在 PHP 中)。
    • Cookies 可以由客户端Javascript创建,它们可以在服务器上生成并通过Set-Cookie发送到客户端标题。无论哪种情况,浏览器的工作都是存储 cookie 并将其返回到后续请求的 Cookie 标头中。
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2012-08-21
    • 2018-10-29
    相关资源
    最近更新 更多