检查变量是否已设置会破坏Perl中的程序

时间:2014-08-25 05:34:46

标签: perl cgi

我刚刚学习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;

1 个答案:

答案 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

作为旁注,请确保在对其进行任何操作之前清理所有用户输入。