如果人们共享同一个IP地址,Cookie不准确?

时间:2015-07-03 10:30:20

标签: perl cookies session-cookies

当用户 A 连接到我的网站时,我会在此用户的浏览器中设置一个Cookie,以识别他并跟踪他根据自己的行为提供内容的行为。

当用户 B 连接并来自相同的IP 地址时,用户 B 会获得用户 A的 Cookie反之亦然。看起来好像混淆了因为网络服务器看到一个用户而不是几个用户,因为有几个用户来自同一个IP。

只有使用同一ISP的一组用户才会出现此问题。该ISP为多个帐户/用户分配相同的IP地址(和主机名)。 (许多人共用一个IP)如果来自同一个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上。

为了解决问题,我做了以下工作:(问题发生的次数急剧减少) - 我做的最后一次改变 正在添加no-cache元标记到页面设置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://解决了它。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我意识到你通过Apache更新解决了这个问题,但我向你保证,这不是什么“修复”它。升级Apache刚刚导致配置发生一些变化,如果恢复原始配置,问题也会在新版本中重新出现。换句话说,这肯定不是你看到的Apache bug,而是你如何配置它的问题。

基本上看起来你有一种情况,Apache除了设置自己的缓存头之外,还要替换你通过Perl设置的缓存头。您可能是通过mod_headers或错误配置mod_expiresmod-cache

执行此操作的

答案 2 :(得分:-4)

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

我建议您的问题可能与您在Cookie中添加的内容有关,这完全取决于您和您的代码。

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

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