【发布时间】:2014-01-22 15:12:48
【问题描述】:
我需要通过登录名和密码保护我网站上的所有页面。我有一个入口点,所以它不会那么难。它现在正在运行,但我想改进授权系统(是的,它可以工作,但我希望它能够正常工作)。
检查登录名和密码的代码是这样的:
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::SessionCGI::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?
【问题讨论】:
标签: perl session authorization