用于登录安全的 Perl CGI::Session cookie

Perl CGI::Session cookie for login safety

一旦密码与我在 Apache 上的登录脚本相匹配,就打印这个厨师:

my $session = new CGI::Session();
$session->param("~user", $user_name);
my $cookie = CGI::Cookie->new(-name=>$session->name, -value=>$session->id, -domain=>'');
print $session->header(-cookie=>$cookie, @_);

然后在每个其他脚本上,在检查会话未过期或为空后,我确实授予访问权限,并使用以下代码检查登录用户名:

my $session = CGI::Session->load();
$loggd_user = $session->param("~user");  

然后 $loggd_user 可以访问与他的用户名相关的所有数据。但是,如果将厨师修改为另一个用户名会怎样?可能吗?一个人可以访问其他人的数据吗?此代码是否存在其他安全问题或是否正常?

后端有安全性说明,可以回答其中一些问题: https://metacpan.org/pod/CGI::Session::Tutorial#SECURITY

唯一与 CGI::Session 来回传递的是 session ID。关于 session 的所有信息都保存在服务器上(无论您选择什么地方——请将其保存在网络服务器无法提供服务的地方!)。该数据的安全性取决于服务器的配置方式、您在 CGI::Session 中使用的选项等。

不清楚您是否在验证IP。如果您不是,并且任何人都掌握了有效 session 的 session ID,他们就可以劫持它并假装是那个人。伪造 cookie 很简单,因为它们只是 header 字段,可以明确设置。困难在于在 cookie 中伪造一个有效的 session ID。

由于您为 session 使用 cookie,浏览器会在您每次访问该页面时为客户端和 re-sends 服务器跟踪它们。如果您没有除 cookie 之外的识别客户端的辅助方法,这就为跨站点请求伪造打开了大门。即使检查 IP 也不能防止 CSRF。

您应该在某个时候使这些 cookie 过期,我不仅仅指在服务器端。 cookie 应该有一个到期日期,以便客户端删除它关于 session 的 cookie,这样它将停止发送它。我不确定 CGI::Session 中是如何完成的,但我只看了教程。

而且,如果您的服务器接受未加密的连接,需要在您发送密码时进行身份验证,或者当您来回传递 session 令牌时,您就是在自找麻烦。

这不能解释为使用此方法的潜在安全问题的完整列表。