![]() |
[Inhalt] -> [CGI] |
[info] |
|
Zum sicheren Anlegen des CGI-Objektes sollte der folgende Code verwendet werden:
#!/usr/bin/perl -wT
use strict;
use CGI;
BEGIN {
## error handling
sub _error {
my $error = shift;
# print error message
# take this as an example
print "Content-Type: text/html\n\n";
print $error;
# exit
exit 0;
}
$SIG{__DIE__} = \&_error;
## cgi security and others
$CGI::DISABLE_UPLOADS = 1; ## disable uploads
$CGI::POST_MAX = 1_024 * 1_024; ## max post size
$CGI::HEADERS_ONCE = 1; ## ignore multiple headers
## taint mode
$ENV{PATH} = "/bin:/usr/bin"; ## restrict path
delete @ENV{ qw(IFS CDPATH ENV BASH_ENV) };
}
my $q = CGI->new;
$q->cgi_error and die "Problem detected: Possibly file upload too large";
print $q->header;
....
Die Methode param() des Moduls CGI liefert die an das Skript per GET oder POST übergebenen Parameter zurück:
use CGI;
my $q = CGI->new;
# direct
my $type = $q->param("type");
my @checkbox = $q->param("boxes"); # if multiple values
# get names of all parameters
my @list = $q->param;
# import parameters to own namespace
$q->import_names('Q');
if ($Q::type) {
# do something
}
# import parameters to hash
my %vars = $q->Vars();
# setting a parameter by hand
$q->param('name', $value);
$q->param('name', @values); # if multiple values
Um cookies zu lesen und zu setzen kann die Methode cookie() verwendet werden:
use CGI;
my $q = CGI->new;
# read cookie
my %cookies = $q->cookie(-name => "test_foo");
my $name = $cookies{name};
my $foo = $cookies{foo};
# write cookie
my $cookie = $q->cookie(-name => "test_foo",
-value => {
name => "zeitform",
foo => "foo",
bar => "bar",
},
-expires => '+10m');
print $q->header(-cookie=>$cookie, -expires => "now");
Will man eine Datei zum Download anbieten kann der folgende header-Aufruf
verwendet werden:
print $q->header(
-type => 'application/octet-stream',
-content_disposition => "attachment;filename=\"filename.ext\"",
);
print $file_content;
Um Dateien über ein Formular auf den Webserver zu laden (Upload)
muß in der Formular-Deklaration der enctype auf
"multipart/form-data" gesetzt werden.
<form method="post" action="/cgi-bin/script.pl" enctype="multipart/form-data"> <!-- other optional fields --> <input type="file" name="foo" size="40"> <input type="submit" value="Upload"> </form>
Im Perl-CGI-Skript kann der Dateiname aus der Parameterliste ausgelesen werden. Er ist zugleich ein Dateihandle auf die hochgeladene Datei:
my $filename = $q->param('foo');
# print that file
while (<$filename>) {
print;
}
# Copy this file somewhere safe
open (OUTFILE,">/path/to/somewhere/foo") or die('...');
while ( $bytesread = read($filename, $buffer, 1024) ) {
print OUTFILE $buffer;
}
close OUTFILE;
# avoid trouble with strict and use upload to get the file handle
my $fh = $q->upload('foo');
while (<$fh>) {
print;
}
# check Content-Type
my $filename = $q->param('foo');
my $type = $q->uploadInfo($filename)->{'Content-Type'};
unless ($type eq 'text/html') {
die "HTML FILES ONLY!";
}
Zusammengestellt von Alex Pleiner
© 2001-2003 zeitform Internet Dienste Bei Problemen wenden Sie sich bitte an den Webmaster
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1.