Perl CGI ::用于登录安全的会话cookie

时间:2015-04-03 22:40:33

标签: perl security cookies login cgi

一旦密码匹配我在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, @_);

然后在每个其他脚本上,在检查该会话未过期或为空之后我确实提供访问权限并且我使用以下代码检查登录USERNAME:

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

然后$ loggd_user可以访问与其用户名相关的所有数据。但如果将厨师修改为另一个用户名,会发生什么?可能吗?是否可以访问其他人的数据?此代码的任何其他安全问题还是可以的?

1 个答案:

答案 0 :(得分:0)

对后端安全性的解释可以回答以下问题中的一些问题: https://metacpan.org/pod/CGI::Session::Tutorial#SECURITY

使用CGI :: Session来回传递的唯一内容是会话ID。有关会话的所有信息都保存在服务器上(无论您选择哪个位置 - 请将其放在Web服务器无法提供的位置!)。该数据的安全性取决于服务器的配置方式,您使用CGI :: Session等的选项。

目前尚不清楚您是否正在验证IP。如果您不是,并且任何人都获得了有效会话的会话ID,他们就可以劫持它并伪装成该人。伪造cookie是微不足道的,因为它们只是标题字段,可以明确设置。困难在于伪造cookie中的有效会话ID。

由于您正在为会话使用Cookie,因此浏览器会为客户端跟踪它们,并在您每次访问该页面时将其重新发送到服务器。如果您没有辅助方法来识别除cookie之外的客户端,这将为跨站点请求伪造打开大门。即使检查IP也不能防止CSRF。

您应该在某些时候使这些cookie过期,而我并不仅仅意味着在服务器端。 Cookie应该有一个到期日期,以便客户端删除它关于会话的cookie,这样它就会停止发送它。我不确定CGI :: Session是如何完成的,但我没有看到比教程更多的内容。

而且,如果您的服务器接受未加密的连接,以便在您发送密码时需要身份验证,或者当您来回传递会话令牌时,您就会乞求麻烦。

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