【问题标题】:Perl CGI::Cookie not setting in SafariPerl CGI::Cookie 未在 Safari 中设置
【发布时间】:2026-02-01 19:55:02
【问题描述】:

我对 perl 很陌生。我制作了一个简单的登录脚本,它应该在重定向到我的表单页面之前设置一个 cookie。我已经尝试了我能想到的一切,但 Safari 中没有设置 cookie。有几篇文章略有不同,我都试过了。

我的代码:

my $userQuery = "SELECT user_name , password FROM egi_users WHERE user_name = '$username' AND password = '$cryptword'";
my $result = $dbh->prepare($userQuery);
$result->execute()or die "MYSQL ERROR : $DBI::errstr\n";

my $rows = $result->rows;

if($rows == 1){

    #login is valid. Create cookie and send to patient_data page.                                                                                          
    #print("success\n");                                                                                                                                   

    my $c = CGI::Cookie->new(-name=>'login_access',
                             -value=>$username,
                             -expires=>'+1h');

    print $q->redirect(-uri=>'http://mytestserver.com/cgi/patient_data.pl' , -status => '301' , -cookie => $c);


}else{

    print $q->redirect(-uri=>'http://mytestserver.com/);
}

我已经实现了 CGI 所需的所有功能;

使用 CGI; 使用 CGI::鲤鱼... 使用 CG::Session; 使用 CGI::Cookie;

脚本正确验证和重定向,但没有设置任何 cookie。 我不确定我在做什么。如果您有更好的方法建议, 那也太好了。

感谢收看

【问题讨论】:

  • 为什么要打印自己的标题而不是使用 CGI 模块?为什么要使用 JavaScript 重定向而不是 HTTP 重定向?
  • 我尝试过使用 http 重定向,并且在打印标题后它们似乎不起作用,所以如果在页面中间需要重定向,我发现 JS 方法是唯一的选择。至于用 CGI 打印标题,我昨天才第一次看到。
  • 一个HTTP重定向一个标头。
  • 好吧,这很酷。我创建了一个重定向标头并将 cookie 和所有内容放入其中。它仍然没有设置,但它清理了我的代码。谢谢

标签: perl cookies cgi


【解决方案1】:

状态 301 是永久重定向。您正在检查用户是否登录,然后如果他们提供正确的用户名/密码,则给他们一个永久重定向?他们如何注销或以其他人身份登录?这是不可能的。

为此,您需要清除 Safari 缓存并使用状态 303,“查看其他”。

此外,您的代码容易受到 SQL 注入攻击。试试:

my $userQuery = "SELECT user_name , password FROM egi_users WHERE user_name = ? AND password = ?";
my $result = $dbh->prepare($userQuery);
$result->execute($username, $cryptword)or die "MYSQL ERROR : $DBI::errstr\n";

此外,似乎有人可以通过制作一个包含其用户名的 cookie 来登录您的应用程序。谁需要密码...

【讨论】: