![]() |
SELFHTML Forumsarchiv |
|
|
Die folgende Nachricht zum Thema stammt von: Jojo, 29. 08. 1999, 20:34
Hallo Internetgemeinde,
hallo Selfhtmlgemeinde.
Ich habe folgendes Problem:
A) Situationsdarstellung
B) Serverprotokolle
C) Das Cgi-Script
C.2) Die im Script geforderte library
D) FRAGE
************************
A) Situationsdarstellung
************************
Ich versuche seit kurzem Html und Perl zu lernen.
Dazu habe ich mir einen virtuellen Server eingerichtet (OmniHTTPd v2.02) der nach meinem
Ermessen funktioniert. Ein Perlinterpreter ist ebenfalls installiert, dieser funktioniert
ebenfalls. Er befindet sich in d:\Internet\Server\ActivePerl\perl.exe.
Mein Betriebssystem ist NT, installiert ist das Servicepack 5.
Wenn ich nun die Daten aus einer Seite mit den Eingabefeldern Name, Email, Homepage und Text
abschicke, erscheint immer die Fehlermeldung "Standard CGI Launch Error".
Die Serverprotokolle sehen dann wie folgt aus (qqq ist der jeweils eingegebene Text):
*******************
B) Serverprotokolle
*******************
access.log:
localhost ILLUMINATUS - [14/Aug/1999:18:18:56 +0200] "GET
/cgi-bin/cgiBeispiel.pl?name=qqq&email=qqq&homepage=qqq&text=qqq HTTP/1.0" 500 913
"http://127.0.0.1/herz" "Mozilla/4.05 [de] (WinNT; I)"
error.log:
localhost [14/Aug/1999:18:18:56 +0200] Standard CGI:
"d:\Internet\Server\Cgi-Bin\cgiBeispiel.pl" - Launched failed; error code = 193, %1 ist
keine zulässige Anwendung für Windows.
trace.log:
localhost [14/Aug/1999:18:18:56 +0200] (183) [Standard CGI Launch] WorkPath:
d:\Internet\Server\Cgi-Bin CmdLine: "d:\Internet\Server\Cgi-Bin\cgiBeispiel.pl" Args:
name=qqq&email=qqq&homepage=qqq&text=qqq Path Info:
*****************
C) Das Cgi-Script
*****************
Das cgiBeispiel.pl, welches in Html per "<form action="../cgi-bin/cgiBeispiel.pl"
method=get>" aufgerufen wird, sieht wie folgt aus:
#!/activeperl/perl.exe -w
require "/cgi-bin/cgi-library.pl";
$filename = 'sample.data';
&ReadParse;
$name = $in{'name'} 'NoName';
$email = $in{'email'};
$homepage = $in{'homepage'};
$text = $in{'text'};
$anyfile = $in{'anyfile'};
$anyfile=&Check_Name($anyfile);
open(BEISPIEL,">>$sample.data") &Errormessage('Could not open file!!!');
lock(BEISPIEL);
print BEISPIEL "$name\n";
print BEISPIEL "$email\n$homepage\n";
print BEISPIEL "$text\n";
unlock(BEISPIEL);
close BEISPIEL;
print(&PrintHeader);
&HtmlTop('(Title of the document),,');
print "You gave:";
print "<br>";
print "<dl><dd>Name: $name";
print "<dd>Email: $email";
print "<dd>Homepage: $homepage";
print "<dd>text: $text";
print "<dd>anyfile: $anyfile";
print "</dl><p>";
print "<b>We thank you for the data.<br>Have a nice day!</b>";
&HtmlBot('');
exit(0);
sub Errormessage {
local($message) = @_;
if ($HEADER) {print(&PrintHeader);}
&HtmlTop('Error,,');
print "<b> <blink>$message</blink></b><br>";
print "<p>";
print "Please contact xxx";
print "</HTML>";
}
*************************************
C.2) Die im Script geforderte library
*************************************
Die erforderliche cgi-Library.pl sieht wie folgt aus:
#!/AvtivePerl/perl.exe
use Socket;
$sockaddr = 'S n a4 x8';
$webadm = 1;
$webmastertext = '<div align=right><i>Webmaster<br>
<a href="mailto:xxx">xxx</a></i></div>';
$def_topbuttons="<a href=\"http://www.xxx"><img src=\"http://www.xxx">
<a href=\"http://www.xxx/">
<img src=\"http://www.xxx\"></a>
<a href=\"$ENV{'HTTP_REFERER'}\">
<img src=\"http://www.xxx/"></a></b><hr>";
$bad_path[0] = '^/etc/';
$bad_path[1] = '^/bin/';
$bad_path[2] = '^/+private/';
$bad_path[3] = '^/+shared/';
$bad_path[4] = '^/devices/';
$bad_path[5] = '^/export/';
$bad_path[6] = '^/sbin/';
$bad_path[7] = '^/src/';
$bad_path[8] = '^/var/';
$ok_p_zahl=8;
$CHKN_Level=0;
$OK_CHARS='a-zA-Z0-9_\-\.@\/';
$HEADER=1;
$START_YEAR = 1970;
@MONTHS = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
%MONTH_NAMES = ("Jan", 1, "Feb", 2, "Mar", 3, "Apr", 4, "May", 5, "Jun", 6, "Jul", 7, "Aug",
8, "Sep", 9, "Oct", 10, "Nov", 11, "Dec", 12);
$CHK_CONTROL=0;
$HOST = $ENV{'REMOTE_HOST'};
$DATE = `/usr/bin/date +'%a %b %e %T %Y'`;
($sek,$minute,$stunde,$tag,$monat,$jahr,$wtag,$ytag,$isdst) = localtime(time);
$monat++;
$zeit=$tag.'.'.$monat.'.'.$jahr.' - ';
if ($stunde < 10) {$stunde='0'.$stunde;}
if ($minute < 10) {$minute='0'.$minute;}
if ($sek < 10) {$sek='0'.$sek;}
$zeit=$zeit.$stunde.':'.$minute.':'.$sek;
$UHR ="$stunde:$minute:$sek";
$LOCK_SH = 1;
$LOCK_EX = 2;
$LOCK_NB = 4;
$LOCK_UN = 8;
sub ReadParse {
local($buffer);
local($namebuffer,$valuebuffer);
if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; }
else { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
if (!($buffer)) {$buffer=substr($ENV{'PATH_INFO'},1,length($ENV{'PATH_INFO'}));}
if (!($buffer)) {$buffer=@ARGV; }
@nvpairs = split(/&/,$buffer);
foreach $pair (@nvpairs)
{
($namebuffer, $valuebuffer) = split(/=/, $pair);
$valuebuffer =~ tr/+/ /;
$valuebuffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
if (exists($in{$namebuffer})) {
if ($in{$namebuffer} ne '#VALUE_CHECKBOX') {
$in{$namebuffer}="#VALUE_CHECKBOX";
push(@{$value_checkbox{$namebuffer}},$in{$namebuffer});
}
push(@{$value_checkbox{$namebuffer}},$valuebuffer);
} else {
$in{$namebuffer}=$valuebuffer;
}
}
}
sub PrintHeader {
$HEADER=0;
return "Content-type: text/html\n\n";
}
sub HtmlTop
{
local ($HTMLTOP_input) = @_;
local ($HTMLTOP_title, $HTMLTOP_body, $HTMLTOP_kopf);
($HTMLTOP_title,$HTMLTOP_body, $HTMLTOP_kopf)=split(/,/,$HTMLTOP_input);
if ($HEADER) {print(&PrintHeader);}
print ("<HTML>\n");
print ("<HEAD>\n");
print ("<TITLE>$HTMLTOP_title</TITLE>\n");
print ("</HEAD>\n");
if ($HTMLTOP_body =~ /^http:/) {
print "<BODY BACKGROUND=$HTMLTOP_body>\n";
}
else {
print "<BODY $HTMLTOP_body>\n";
}
if (($HTMLTOP_kopf) && ($HTMLTOP_kopf ne 'default')) {print "$HTMLTOP_kopf\n";}
else {
if ($HTMLTOP_kopf eq 'default') {print "$def_topbuttons\n";}
}
print ("<h1>$HTMLTOP_title</h1>");
}
sub HtmlBot
{
local ($title) = @_;
print ("<hr>\n");
if ($title) {print "$title ";}
elsif ($webadm) {print "$webmastertext\n";}
print ("</body>\n</html>\n");
}
sub SplitParam
{
local ($param) = @_;
local (@params) = split ("\0", $param);
return (wantarray ? @params : $params[0]);
}
sub MethGet {
return (defined $ENV{'REQUEST_METHOD'} && $ENV{'REQUEST_METHOD'} eq "GET");
}
sub MethPost {
return (defined $ENV{'REQUEST_METHOD'} && $ENV{'REQUEST_METHOD'} eq "POST");
}
sub MyBaseUrl {
local ($ret, $perlwarn);
$perlwarn = $^W; $^W = 0;
$ret = 'http://' . $ENV{'SERVER_NAME'} .
($ENV{'SERVER_PORT'} != 80 ? ":$ENV{'SERVER_PORT'}" : '') .
$ENV{'SCRIPT_NAME'};
$^W = $perlwarn;
return $ret;
}
sub MyFullUrl {
local ($ret, $perlwarn);
$perlwarn = $^W; $^W = 0;
$ret = 'http://' . $ENV{'SERVER_NAME'} .
($ENV{'SERVER_PORT'} != 80 ? ":$ENV{'SERVER_PORT'}" : '') .
$ENV{'SCRIPT_NAME'} . $ENV{'PATH_INFO'} .
(length ($ENV{'QUERY_STRING'}) ? "?$ENV{'QUERY_STRING'}" : '');
$^W = $perlwarn;
return $ret;
}
sub MyURL {
return &MyBaseUrl;
}
sub CgiError {
local (@msg) = @_;
local ($i,$name);
if (!@msg) {
$name = &MyFullUrl;
@msg = ("Error: script $name encountered fatal error\n");
};
if ($HEADER) {print &PrintHeader;}
print "<html>\n<head>\n<title>$msg[0]</title>\n</head>\n<body>\n";
print "<center><h1>Critical Error</h1>";
print "<h3>$msg[0]</h3>\n";
foreach $i (1 .. $#msg) {
print "<p>$msg[$i]</p>\n";
}
print "</center>\n";
}
sub CgiDie {
local (@msg) = @_;
&CgiError (@msg);
die @msg;
}
sub PrintVariables {
local (*in) = @_ if @_ == 1;
local (%in) = @_ if @_ > 1;
local ($out, $key, $output);
$output = "\n<dl compact>\n";
foreach $key (sort keys(%in)) {
foreach (split("\0", $in{$key})) {
($out = $_) =~ s/\n/<br>\n/g;
$output .= "<dt><b>$key</b>\n <dd>:<i>$out</i>:<br>\n";
}
}
$output .= "</dl>\n";
return $output;
}
sub PrintEnv {
&PrintVariables(*ENV);
}
sub cur_date {
$today = `/usr/bin/date +'%a %b %e %T %Y'`;
&num_days_from_date($today);
}
sub num_days_from_date {
local($_) = @_;
$month_name = split(/ +/);
$month = $MONTH_NAMES[$month_name];
$day = split(/ +/);
$year = split(/ +/);
$time = split(/ +/);
&num_days ($month,$day,$year,$time);
}
sub num_days {
local ($month, $day, $year, $time) = @_;
$cur_days = 0;
for ($i = $START_YEAR; $i < $year; $i++) {
$cur_days += 365;
if (!($i % 4)) {
$cur_days++;
}
}
for ($i = 1; $i < $month; $i++) {
$cur_days += $MONTHS[$i-1];
if (!($year % 4)) {
if ($i == 2) {
$cur_days++;
}
}
}
$cur_days += ($day - 1);
if ($time ne "") {
$time =~ s/://g;
$cur_days .= ".$time";
}
$cur_days;
}
sub Hidecount {
local ($input) = @_;
local ($PAGE, $IGNORE, $HOST, $DATE, $LOG, $ilog);
($PAGE, $IGNORE) = split(/,/,$input);
$PAGE =~ s/[\x00-\x20<>\;\(\)\$^\+!\^\[\]\?\"\'\`]//g;
if ($PAGE eq "") {
print ("No page specified\n");
exit(0);
}
if ($IGNORE eq "") {$IGNORE='off';}
$LOG = $PAGE;
$LOG .= ".count";
$ilog = $PAGE;
$ilog .= ".ignore";
if (open(f1,"$LOG")) {close f1;} else
{
system("/usr/bin/touch $LOG");
}
$ignore_not='y';
if ($IGNORE eq 'on') {
open (IGN, "<$ilog") print "Could not read from ignore file\n";
@eintrag=<IGN>;
chop(@eintrag);
for ($i=0; $i <= $#eintrag; $i++)
{ if ($eintrag[$i] eq $HOST) {$ignore_not='n';}
}
close (IGN);
}
if ($ignore_not eq 'y') {
$newhost=$HOST;
open (LOG, ">>$LOG") print ("Could not read or write from log file $LOG\n");
&NLock($LOG);
print LOG ("$newhost\t$DATE");
&NUnlock($LOG);
close (LOG);
}
}
sub Check_Name {
local($chk_name)=@_;
local($bad_path,$ok_checkpath,$OK_CHARS);
if ($CHK_CONTROL) {print "<p>Check_Name got: $chk_name<p>\n";}
if ($chk_name) {
$chk_name =~ s/\*//g;
if (index($chk_name,':') > -1) {$chk_name=substr($chk_name,0,index($chk_name,':'));}
if (index($chk_name,'..') > -1) {$chk_name=substr($chk_name,0,index($chk_name,'..'));}
if (index($chk_name,'&') > -1) {$chk_name=substr($chk_name,0,index($chk_name,'&'));}
$ok_checkpath=1;
for ($i=0;$i<=$ok_p_zahl;$i++) {
if ($chk_name=~ /$bad_path[$i]/) {$ok_checkpath=0;}}
if ($ok_checkpath==0) {return("illegal_path");}
if ($CHK_CONTROL) {print "<p>Check_Name after Path_check: $chk_name<p>\n";}
if ($CHKN_Level==0) {
$chk_name =~ s/[\x00-\x20<>\;\(\)\$^\+!\^\[\]\?\"\'\`]//g;
if (index($chk_name,' ') > -1) {$chk_name=substr($chk_name,0,index($chk_name,' '));}
if (index($chk_name,'&') > -1) {$chk_name=substr($chk_name,0,index($chk_name,'&'));}
if (index($chk_name,'%') > -1) {$chk_name=substr($chk_name,0,index($chk_name,'%'));}
if (index($chk_name,',') > -1) {$chk_name=substr($chk_name,0,index($chk_name,','));}
if ($CHK_CONTROL) {print "<p>Check_Name got: $chk_name<p>\n";}
return($chk_name);
} else { # $CHKN_Level==1
$_=$chk_name;
eval "tr/[$OK_
© 1998-2006
Impressum, Software: Classic Forum