【发布时间】: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