正确使用CGI :: Session,Perl

时间:2014-01-18 18:39:35

标签: perl session authorization

我需要通过登录名和密码保护我网站上的所有网页。我有一个入口点,所以它不会那么难。它现在正在运行,但我想改进授权系统(是的它可行,但我希望它能正常工作)。

检查登录名和密码的代码如下:

my $sth = $dbh->prepare(qq{select count(*) from admin where login = '$input_login' and password = '$input_password_hash'});
$sth->execute();
($count) = $sth->fetchrow_array();
$sth->finish();
if ($count eq 1) 
{
    $session->param("user_logged_in", 'true');
    print '<META http-equiv="refresh" content="0;URL=/">';
}

关于它的2个问题: 1)它是否正确? 2)最终用户的脚本行为是这样的:用户写入他的登录名和密码,表单正在发送,登录页面再次加载,然后(重定向到带有空白字段的登录页面并显示1秒钟)出现受保护的数据。如何删除显示登录空白表单并立即登录?输入登录名和密码,发送表格和数据立即显示,而不是在显示空白登录1秒后显示。我认为这是关于元重定向。你怎么看?这是第2个问题。

  

当用户点击其他链接或在一段时间后重新访问该网站时,我们是否应该再次创建新会话?绝对不是。

引自CGI::Session CGI::Session Tutorial的文档。

它说,我应首先检查用户会话是否存在,如果不存在,则会创建新会话。代码应如此:

$cgi = new CGI;
$sid = $cgi->cookie("CGISESSID") || undef;
$session = new CGI::Session(undef, $sid, {Directory=>'../tmp'});

但对我来说,这段代码工作正常(我可以访问会话变量):

$session = new CGI::Session(undef, undef, {Directory=>'../tmp'});

3)你能解释一下为什么这段代码有效吗?第一个代码也有效。但是第二个代码(没有$ sid作为第二个参数)不能工作(但它可以工作)。

关于从会话访问数据的问题:

$authorised = $session->param("user_logged_in");

4)以这种方式访问​​会话变量是否正确?
5)如果我需要访问其他脚本上的$session该怎么办?我应该如何访问$session

1 个答案:

答案 0 :(得分:2)

<强>(1)

对于初学者,您有一个SQL注入漏洞:

改变这个:

my $sth = $dbh->prepare(qq{
   select count(*) from admin 
   where login = '$input_login' and password = '$input_password_hash';
});
$sth->execute();

到此:

my $sth = $dbh->prepare(qq{
   select count(*) from admin 
   where login = ? and password = ?;
});
$sth->execute($input_login, $input_password_hash);

(2)

不是从HTML进行客户端(META-EQUIV)重定向,而是执行服务器启动的客户端重定向(HTTP)。

更改:

print '<META http-equiv="refresh" content="0;URL=/">';

要:

print $cgi->header('Redirect: /');

<强>(3)

我最近没有像这样直接使用过CGI :: Session,但我猜它的设计是在默认情况下为你调用new CGI()

我不这样做;我直接打电话给new CGI()编辑:示例:

my $sparams = { name => 'MY_APP' };
my $cgi     = CGI::Simple->new;
my $session = CGI::Session->new(undef, $cgi, {}, $sparams);

# use $cgi for GET/POST params
# use $session for header & session storage.

print $session->header;
my $sval = $session->param('some-session-var');
my $opt1 = $cgi->param('some-get-var');

<强>(4)

是的,没关系。

<强>(5)

然后在其他脚本中实例化会话。您需要匹配Cookie namepath和存储方法(使用默认值即可实现)。