Perl:我如何测试URL(https)接受GET请求,使用;“登录”;参数
我有一个CGI服务器端脚本,它接受GET和POST以及登录参数。 我想测试它以确保它不易受攻击。因此,计划是使用Perl LWP,在GET和POST中发送登录参数,并比较结果。界面已经更改,因此只有在POST中,我们才能在会话cookie中发送用户名和密码(不确定这是否是一个好主意),所以我如何测试它?以下是我到目前为止的情况:Perl:我如何测试URL(https)接受GET请求,使用;“登录”;参数,perl,security,http,Perl,Security,Http,我有一个CGI服务器端脚本,它接受GET和POST以及登录参数。 我想测试它以确保它不易受攻击。因此,计划是使用Perl LWP,在GET和POST中发送登录参数,并比较结果。界面已经更改,因此只有在POST中,我们才能在会话cookie中发送用户名和密码(不确定这是否是一个好主意),所以我如何测试它?以下是我到目前为止的情况: #!/usr/bin/perl use LWP; print "This is libwww-perl-$LWP::VERSION\n"; # Create a use
#!/usr/bin/perl
use LWP;
print "This is libwww-perl-$LWP::VERSION\n";
# Create a user agent object
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->agent("MyApp/0.1 ");
# Create a request
#my $req = HTTP::Request->new(POST => 'http://search.cpan.org/search');
#my $req = HTTP::Request->new(GET => 'https://qa.co.net:443/cgi-bin/n-cu.cgi');
my $req = HTTP::Request->new(GET => 'https://qa.co.net:443/cgi-bin/n-cu.cgi?mode=frameset&JScript=1&remote_user&login=foo&password=foo HTTP/1.1');
$req->content_type('application/x-www-form-urlencoded');
$req->content('query=libwww-perl&mode=dist');
# Pass request to the user agent and get a response back
my $res = $ua->request($req);
# Check the outcome of the response
if ($res->is_success) {
print $res->content;
#print $res->code;
#print $res->message;
}
else {
print $res->status_line, "\n";
}
这是不行的,因为它没有会话cookie的东西。但这可能是一个好的开始。这是测试GET和POST的正确方法吗
以下是cgi中实现的内容:
#cr_login for POST && login for GET -- leave GET param as it used to be.
if ($m eq 'GET' && defined($req->param('login'))) {
$msg = 'parameter "login" is invalid for this request type.';
+ my $seclog = $event_logging_directory . '/invalid_request.log';
+ open(S, ">>$seclog") or die $!;
+ my $logmsg = sprintf("%4d-%02d-%02d %02d:%02d:%02d",Today_and_Now())
+ . "|mode:" . $req->param('mode')
+ . "|login:" . $req->param('login')
+ . "|remote_addr:" . $ENV{REMOTE_ADDR}
+ . "|$msg\n";
+ print S $logmsg;
以及:
我们是这样做的:
- 使会话cookie和上下文保持活动状态: 我的$browser=LWP::UserAgent->new(keep_alive=>10); $browser->cookie_jar({}); $browser->agent('Mozilla/8.0'); #$browser->ssl_opts({verify_hostname=>0}); $browser->显示进度(1)
print "Cookies:\n", Dumper($browser->cookie_jar()), "\n\n";
my $content = $response->as_string;
print "$content\n";
在cookie中发送密码?没有 不允许获取/登录 通过SSL将用户名和密码发布到/login
在中,GET/POST通过REQUEST\u METHOD环境变量指示 您无法阻止已确定的人员向您的服务器发出GET请求,但您可以拒绝这样处理它(未测试的代码-您必须填写详细信息): 大多数人不使用自己的身份验证或会话处理。他们大多使用来自CPAN的一个,或者包含在更大的应用程序框架中的一个。如果您正在进行CGI,那么可以使用CGI::Session 你可以给它和/或它的后代看一眼。这些作者已经解决了你们所遇到的一系列问题
print "Cookies:\n", Dumper($browser->cookie_jar()), "\n\n";
my $content = $response->as_string;
print "$content\n";
if ($ENV{REQUEST_METHOD} ne 'POST') {
# issue a redirect to a suitable error page, then return.
}
my $q = CGI->new();
my $user = $q->params('username');
my $password = $q->params('password');
my $encrypted_password = my_password_encryptor($password);
unless ( can_log_in($user, $encrypted_password) ) {
# issue an error message - redirect&return or fall-through...
}
else {
$session->set_user_logged_in();
}