我刚刚学习CGI而且我不知道为什么它不能正常工作而被困在这个小程序上。如果我不检查是否设置了用户名,那么该程序会运行,但如果我这样做则不会。我打算在打印之前检查用户名是否已设置。我在线检查并找到了一个链接,解释了如何检查是否在CGI how to check if variable is set中设置了某些内容,我在这里也是这样做的。我也尝试了if($username)
,但没有成功。我的代码在下面,我一直盯着它,似乎我正在做的一切正确。有人可以指出我的错误吗?
#!/usr/bin/perl -wT
use strict;
use CGI qw(:standard);
my $cgi = CGI->new;
my $username = $cgi->param("username");
my $password = $cgi->param("password");
if (defined $username)
print "username: $username";
print header,
start_html,
start_form,
"Username: ",
textfield(name=>"username"),p,
password_field(name=>"password"),
submit,
hr, end_html;
答案 0 :(得分:0)
你缺少一对花括号。这样:
if (defined $username)
print "username: $username";
应该是:
if (defined $username) {
print "username: $username";
}
由于if
块中只有一个语句,您也可以这样写:
print "username: $username" if defined $username;
您可以使用模块CGI::Carp
通过启用fatalsToBrowser
来更轻松地调试CGI程序:
use CGI::Carp qw(fatalsToBrowser);
这会导致致命错误显示在浏览器中,因此您无需查看Web服务器的错误日志。仅在开发代码中使用此功能,或者您可以向潜在的攻击者透露程序的内部工作方式。
正如RobEarl在评论中指出的那样,您还试图在打印HTTP标头之前打印用户名。这会混淆浏览器,因为而不是默认的
Content-Type: text/html; charset=ISO-8859-1
您将发送类似
的内容username: fooContent-Type: text/html; charset=ISO-8859-1
作为旁注,请确保在对其进行任何操作之前清理所有用户输入。