0

我正在使用 CGI.pm 来写出 cookie。现在在用户使用我的网站的过程中,其他 cookie 被添加到“test.com”cookie 集中,(如浏览器历史记录所示)

但现在我想注销用户,并“清理”PC。由于我不知道用户使用了哪些脚本,因此我无法预见 PC 上的 cookie 是什么。

简而言之,它有一种方法可以将“test.com”的所有 cookie 读回脚本中,这样我就可以在 1 秒内再次打印出来,(有效地“删除”它们)**我知道你可以阅读cookie 回到 $xyz=cookie('$name') ... 但是如何创建包含 $name 变量的数组以便循环遍历它?该脚本还将在“test.com”上运行,因此跨站点策略不是问题

+++++ brian d foy在下面添加了部分答案。所以这就是我设想的代码可能被串在一起的方式。

use CGI::Cookie;

%cookies = CGI::Cookie->fetch;
for (keys %cookies) {
$del_cookie.="cookie(-NAME=>'$cookies[$_]',-PATH=>'/',-EXPIRES=>'+1s');";
}
print header(-cookie=>[$del_cookie]);

我想知道脚本如何识别域。似乎该脚本足够智能,可以仅加载正在执行该脚本的域的 cookie。(现在我要找出为什么 Firefox 不删除过期的 cookie!刚刚在我的测试域中发现了一些在 1 月 29 日至 31 日过期的列表,起初我想知道为什么它们没有出现在我的 cookie 列表中! )

4

2 回答 2

0

如果您尝试从您的 CGI 脚本执行此操作,您将只能访问该域的 cookie。您可以获取该列表并通过给他们过去的时间来重置它们。

听起来你根本没有问 cookie 问题。你在问如何制作一个数组。CGI::Cookies(与CGI.pm一起提供)有一个示例来处理您在该域下可以访问的所有 cookie:

%cookies = CGI::Cookie->fetch;
for (keys %cookies) {
    do_something($cookies{$_});
    }
于 2014-02-01T14:12:34.630 回答
0

这就是我最终的结果:

use CGI::Cookies;
%cookies = CGI::Cookie->fetch;
@cookie  = keys %cookies;  
for($x=0; $x<@cookie; $x++){
my $c = CGI::Cookie->new(-name => $cookie[$x],-value => '-',-expires => '+1s');
print "Set-Cookie: $c\n";
}
print "content-type: text/html\n\n";

Firefox 仍然保持 cookie 完好无损,(显然这是一个“设计问题”而不是错误!!)但它们被重置为 void 值,并设置为在 1 秒内过期/变为冗余。另外,我不知道为什么在“content-type”标头之前发送的“print”语句不会导致服务器错误。好的,所以纯粹主义者可能会找到一个更简单的系统,并使用“foreach”而不是 for/next 循环......但我理解后者是如何工作的!

于 2014-02-02T12:31:06.557 回答