zeitform Internet Dienste      

[Inhalt] -> [CGI]

[info]


           

CGI: Dynamische Webseiten erzeugen


CGI-Objekt anlegen

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;
....

Seitenanfang


CGI-Parameter auslesen

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

Seitenanfang


Cookies

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");

Seitenanfang


Datei zum Download ausgeben

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;

Seitenanfang


Dateien über ein Formular uploaden

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!";
   }

Seitenanfang


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.