User since
2004-05-26
6
Artikel
BenutzerIn
Hallo allerseits,
mein Problem ist das mein Perl Guestbook Script auf meinem Apache Webserver nur richtig funktioniert wenn es allein steht. Sprich wenn ich mein Guestbook in meine Seite integriere und die ganze Seite laufen lasse geht es nur noch bedingt.
Problem 1: Nach einem erfolgreichen GB-Eintrag aktualisiert sich die GB-Seite nicht, ich kann den neuen Eintrag nicht abrufen.
Problem 2: Nach einem GB-Eintrag springt der Webserver wieder auf meine index Seite, diese wird normal in einem Frame, bestehend aus 3 Fenstern angezeigt. Der Webserver aber versucht diese in den main frame, Bildmitte zu kopieren.
Nun meine Frage, wie kann ich meinem Perl script sagen das es nur die GB-Index Seite aufrufen soll nach Programm ablauf und nicht die Hauptindex?
User since
2003-08-04
14371
Artikel
ModeratorIn
Zeig mal etwas Code... So auf die Entfernung lässt sich das schwer sagen...
zu 1.) Erzeugst Du vielleicht die Ausgabe, bevor Du den neuen Eintrag speicherst??
Speicherst Du in eine DB oder in eine Datei??
zu 2.) Irgendwo in Deinem Skript wirst Du vermutlich sagen, auf welche Seite er gehen soll...
User since
2004-05-26
6
Artikel
BenutzerIn
gespeichert wird in eine Datei, hier mal der Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!c:/Perl/bin/perl
$danke_mail = 0;
# Dankeschön an den Besucher
$danke_betreff = 'Vielen Dank für den Eintrag';
$meine_mail = 0; # 0: nein; 1: ja
$mein_betreff = 'Neuer Eintrag im Gästebuch';
$meine_adresse = 'lord4lenz@hotmail.com';
$mail_breite = 60;
$trennzeichen = '<hr>';
$neu = 1;
$gaestebuchreal = '../htdocs/pages/index.html'; # die Gästebuch-Datei
$gaestebuchvirtual = '../index.html';
$mailprog = '/usr/sbin/sendmail';
if($ENV{'REQUEST_METHOD'} eq 'GET')
{ $eingabe = $ENV{'QUERY_STRING'}; }
else
{ read(STDIN, $eingabe, $ENV{'CONTENT_LENGTH'}); }
@paare = split(/&/, $eingabe);
foreach $paar (@paare)
{
($schluessel, $wert) = split(/=/, $paar);
$wert =~ tr/+/ /;
$wert =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$wert =~ s/<([^>]|\n)*>//g;
$FORM{$schluessel} = $wert;
}
&name_fehlt unless ($FORM{'name'});
&kommentar_fehlt unless ($FORM{'kommentar'});
if ($meine_mail == 1)
{ &meine_mail; }
&lesen();
&suchen();
sub name_fehlt
{
print "Content-Type: text/html\n\n";
print "<html><body><center>\n";
print "<h1>Name fehlt !</h1></center>\n";
print "Ohne Ihren Namen ist ein Eintrag ";
print "in das Gästebuch nicht möglich.<p>\n";
print "Mit dem Zurück-Button Ihres Browsers kommen";
print " Sie wieder zurück zur vorherigen Seite.\n";
print "</body></html>";
exit;
}
sub kommentar_fehlt
{
print "Content-Type: text/html\n\n";
print "<html><body><center>\n";
print "<h1>Kommentar fehlt !</h1></center>\n";
print "Ohne geschriebenen Kommentar ";
print "ist ein Eintrag nicht möglich.<p>\n";
print "Mit dem Zurück-Button Ihres Browsers kommen";
print " Sie wieder zurück zur vorherigen Seite.\n";
print "</body></html>";
exit;
}
sub lesen
{
open(DATEI,"<$gaestebuchreal") || die "Fehler";
@gaestebuch = <DATEI>;
close(DATEI);
}
sub suchen
{
open(DATEI,">$gaestebuchreal") || die "Fehler";
foreach (@gaestebuch)
{
if(/<!--beginn-->/)
{
&eintrag;
}
else
{
print DATEI $_;
}
}
close (DATEI);
}
sub eintrag
{
if ($neu == 1)
{
print DATEI "<!--beginn-->\n";
}
print DATEI "$FORM{'name'} ";
if($FORM{'ort'})
{
print DATEI "$FORM{'ort'} ";
}
print DATEI "<blockquote><p>$FORM{'kommentar'}</p></blockquote>\n";
if ($FORM{'email'})
{
print DATEI "\<$FORM{'email'}\><br>\n";
}
else
{
print DATEI "<br>\n";
}
if ($FORM{'land'})
{
print DATEI "$FORM{'land'}";
}
if ($FORM{'ort'} || $FORM{'land'})
{
print DATEI "<br>\n";
}
print DATEI "$trennzeichen<br>\n";
if ($neu == 0)
{
print DATEI "<!--beginn-->\n";
}
}
print "Location: $gaestebuchvirtual\n\n";
sub meine_mail
{
local $text = &umbruch($FORM{'kommentar'},60);
open (MAIL, "|$mailprog $meine_adresse") || die "Fehler bei $mailprog!\n";
print MAIL "To: $meine_adresse\n";
print MAIL "Reply-to: $FORM{'email'}\n";
print MAIL "From: $FORM{'email'}\n";
print MAIL "Subject: $mein_betreff\n\n";
print MAIL "$FORM{'name'}\n";
print MAIL "$text\n";
close (MAIL);
}
sub umbruch
{
$_[0] =~ s/\n/ /g;
my @zeilen = split(/ /,$_[0]);
my $zaehler = 0;
my $string = '';
foreach(@zeilen)
{
$zaehler += length "$_";
if ($zaehler < $_[1])
{
$string.= "$_ ";
}
else
{
$string .= "\n$_ ";
$zaehler = length "$_";
}
}
return $string;
}
if ($danke_mail == 1 && $FORM{'email'})
{ &danke_mail; }
sub danke_mail
{
open (MAIL, "|$mailprog $FORM{'email'}") || die "Fehler bei $mailprog!\n";
print MAIL "To: $FORM{'email'}\n";
print MAIL "Reply-to: $FORM{'meine_adresse'}\n";
print MAIL "From: $FORM{'meine_adresse'}\n";
print MAIL "Subject: $danke_betreff\n\n";
print MAIL "Vielen Dank für ihren Eintrag.\n";
print MAIL "Bitte besuchen sie unsere Seiten ";
print MAIL "doch bald wieder.";
close (MAIL);
}
edit renee: [code]-Tags eingefügt\n\n
<!--EDIT|renee|1085563126-->
User since
2004-05-26
6
Artikel
BenutzerIn
hier die dazugehörigen html Dateien
nummer 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<html>
<head>
<link href="../library/style1.css" rel="stylesheet" type="text/css">
</head>
<body>
<p class="seitentitel">Mein Gästebuch</p>
<p> </p>
<p class="absatztitel">Bitte eintragen, ich freue mich
über Lob und Kritik.</p>
<p> </p>
<form action="../cgi-bin/gaestebuch.pl" method="post">
<table>
<tr>
<td>Name</td>
<td><input type=text name="name" size=30></td>
</tr>
<tr>
<td>E-Mail</td>
<td><input type=text name="email" size=30></td>
</tr>
<tr>
<td>Ort</td>
<td><input type=text name="ort" size=30></td>
</tr>
<tr>
<td>Land</td>
<td><input type=text name="land" size=30></td>
</tr>
</table>
<p>Kommentar:</p>
<textarea class="normtitel" name="kommentar" rows=5 cols=45></textarea>
<p><input type=submit value="eintragen">
</form></p><hr><br>
</body>
</html>
nummer 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
<head>
<link href="../library/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<p class="seitentitel">Das Gästebuch</p>
<p> </p>
<form action="index.html">
<p>
<input type="button" name="Verweis" value="Ins Gästebuch eintragen"
onClick="self.location.href='gaestebuch.html'">
</p>
</form>
<p>
<!--beginn-->
</p>
</body>
</html>
\n\n
<!--EDIT|renee|1085563267-->
User since
2004-05-25
12
Artikel
BenutzerIn
[quote=Lensi,26.05.2004, 10:00]open (MAIL, "|$mailprog $FORM{'email'}") || die "Fehler bei $mailprog!\n";
print MAIL "To: $FORM{'email'}\n";
print MAIL "Reply-to: $FORM{'meine_adresse'}\n";
print MAIL "From: $FORM{'meine_adresse'}\n";
print MAIL "Subject: $danke_betreff\n\n";
print MAIL "Vielen Dank für ihren Eintrag.\n";
print MAIL "Bitte besuchen sie unsere Seiten ";
print MAIL "doch bald wieder.";
close (MAIL);[/quote]
hat nichts mit deiner frage zutun, aber ich denke die sicherheit deiner seite ist dir auch wichtig :). da du die email (userinput!) in der open funktion nochmal als sendmail parameter angehängt hast und das ungefiltert ist es möglich system kommandos mit der uid des webservers auf deinem server auszuführen. einfache lösung: sendmail brauch diesen parameter nicht, wohin die mail geschickt werden soll wird ja auch im mail header festgelegt, also weg damit. oder prüfe den syntax der email, aber dann richtig, hab schon einige mail filter gesehen die trotzdem noch ausgenutzt werden konnten.
User since
2003-08-04
14371
Artikel
ModeratorIn
$gaestebuchvirtual = '../index.html';
print "Location: $gaestebuchvirtual\n\n";
Hier sagst Du, dass es auf die index-Seite gehen soll. Hier einfach $gaestebuchvirtual auf die GB-Index-Seite setzen...
if($ENV{'REQUEST_METHOD'} eq 'GET')
{ $eingabe = $ENV{'QUERY_STRING'}; }
else
{ read(STDIN, $eingabe, $ENV{'CONTENT_LENGTH'}); }
@paare = split(/&/, $eingabe);
foreach $paar (@paare)
{
($schluessel, $wert) = split(/=/, $paar);
$wert =~ tr/+/ /;
$wert =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$wert =~ s/<([^>]|\n)*>//g;
$FORM{$schluessel} = $wert;
}
würde ich ersetzen durch:
use CGI;
my $cgi = CGI->new();
my %FORM = $cgi->Vars();
if($FORM{'ort'})
{
print DATEI "$FORM{'ort'} ";
}
würde ich so schreiben:
print DATEI "$FORM{'ort'} " if($FORM{'ort'});
Dadurch wird der Code übersichtlicher...\n\n
<!--EDIT|renee|1085564377-->
User since
2004-05-26
6
Artikel
BenutzerIn
vielen Dank für die schnelle Hilfe, das verlinken auf die GB-index klappt nun. Frage mich nur warum ich nicht den kompletten Pfadnamen angeben kann. Dachte eigentlich ich müsste dem Webserver erklären das die GB-index im Pfad ../htdocs/pages/ liegt. Es reicht aber wenn ich nur ../Pages angebe. Hast du dafür auch eine Erklärung?
User since
2003-08-04
14371
Artikel
ModeratorIn
Ja, das Location ist eine Pfadangabe für den Browser und nicht für den Webserver (also keine Filesystem-Pfadangabe). htdocs ist ein Verzeichnis, das quasi unterhalb Deiner Domain liegt (es gibt ja kein deine_domain.tld/htdocs). Deswegen kann der Browser nichts mit htdocs anfangen...
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
Der Location-Header, den du schickst, ist nicht fuer den Server, sondern fuer den Browser. Darin steht also keine (lokale) Pfadangabe, sondern eine URI. Standardkonform ist es uebrigens nur, wenn du eine absolute URI angibst, also in der Art
Location: http://www.test.com/pfad/zum/ziel
Dass relative URIs bei den meisten Browsern funktionieren, heisst noch nicht, dass sie auch erlaubt sind. ;)