我需要通过登录名和密码保护我网站上的所有网页。我有一个入口点,所以它不会那么难。它现在正在运行,但我想改进授权系统(是的它可行,但我希望它能正常工作)。
检查登录名和密码的代码如下:
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
?
答案 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 name
,path
和存储方法(使用默认值即可实现)。