Moin!
so hab mich mal in Perl versucht. Könnt Ihr euch das mal ansehen und sagen was man da anderes machen könnte?
Perl Datei:
Code:
#!c:/Perl/bin/perl -w ### Aufruf des CGI-Moduls ### use CGI qw(:standard); use Fcntl qw(:flock); use strict; ### Gaestebuch öffnen ### my $gaeste = "../htdocs/gaestebuch.html"; open(GAESTEBUCH,"+< $gaeste") or die "Das Gaestebuch konnte nicht geöffnet werden !\n"; flock(GAESTEBUCH,LOCK_EX); ### Einlesen der Formulardaten ### my $name = param('eingabe'); my $E_Mail = param ('E_Mail'); my $kommentar = param('kommentar'); ### Eintrag ins Gaestebuch ### my $neueintrag = <<HERE_TEXT; <P> $name<BR> $E_Mail </P> <H4>Kommentar:</H4> <P><i>$kommentar</i></P> <HR> HERE_TEXT seek(GAESTEBUCH, -16,2); print GAESTEBUCH "$neueintrag\nZurück zum <A HREF =\"../formular.html\">Eingabeformular.</A>\n<BODY>\n</HTML>"; close(GAESTEBUCH); ###Dankeseite ### my $danke =<<HERE_TEXT2; Content-type:text/html <HTML> <HEAD> <TITLE>Dankeseite</TITLE> </HEAD> <BODY> <H1>Hallo $name!</H1> <H4>Danke für Deinen Eintrag ins Gaestebuch.</H4> <HR> <P> Wenn Sie die Eintraegee im Gästebuch<BR> lesen wollen klicken Sie bitte <A HREF="../gaestebuch.html">hier</A>zurück.</P> </BODY> </HTML> my $danke =<<HERE_TEXT2; HTTP 1.1 200 OK Content-type:tex print $danke; t/html
Abgesehen davon, dass Einzeiler in Perl auf Grund der Shebang-Zeile nicht viel anstellen kann und dir in der Ausgabe des HTTP-Headers wohl ein paar Steuerzeichen die Ausgabe verhauen haben, sehe ich dicke Cross-Site-Scripting- und HTML-Injektion-Lücken, weil du $name, $kommentar, … ungeprüft ins Gästebuch schreiben lässt. Damit kann jeder seine Postings mit HTML und JavaScript aufpeppen – und deinen Besuchern viel Ärger machen.
Um dir vorzuführen, was die Forengemeinschaft von dir will, habe ich deinen Perlcode einmal vom Forum farbig darstellen lassen: Wie du bei einem Blick in den HTML-Code dieser Seite siehst, ist der komplette Perlcode als Shebang ausgezeichnet.
Hmm hier dann das Eingabeformular:
HTML-Code:
<HTML> <HEAD> <TITLE> Gästebuchformular</Title> <script language = " JavaScript"> <!-- function checkForm (form) { if(form["eingabe"].value =="") { alert ( "Bitte geben Sie Ihren Namen ein!"); return false; } return true; } //--> </script> </HEAD> <Body> <H1>Eingabeformular </H1> <FORM METHOD ="post" action="/cgi-bin/gaestebuch.pl" on Submit ="return checkForm(this);"> <HR> <TABLE> <TR> <TD> Bitte gehen Sie Ihren Namen ein:</TD> <TD><INPUT TYPE = " text" name = "eingabe" size = "50"></TD> </TR> <TR> <TD>Über Ihren Kommentar zur <BR> Web-Site und konstruktive <BR> Kritik bin ich dankbar: </TD> <TD><TEXTAREA Type = "text" name = "kommentar" rows = " 8" cols = "25"> </TEXTAREA></TD> </TR> </TABLE> <HR> <INPUT type = "submit" value= "Eintragen"> <INPUT type = "reset" value = "Löschen" > <HR> <P> Klicken sie <A HREF="gaestebuch.html">hier</A> um die <BR> bisherigen Einträge im Gästebuch zu lesen. </P> </FORM> [i][/i]
Da fehlt ein Doctype und statt <script language = " JavaScript">
(wieso eigentlich mit Leerzeichen zwischen Attribut und Wert?) heißt das nun <script type="text/javascript">
Generell empfehle ich – was auch schon meine von dir abgekanzelten Vorredner dir versucht haben mitzuteilen – den Code sauber und übersichtlich zu schreiben, weil das schon die halbe Miete bei der Vermeidung von (gravierenden) Fehlern sein kann. Falls du meinst, durch den Verzicht auf Newlines Übertragungszeit und Bandbreite zu sparen, da gibt es bessere Methoden.
Viele Grüße,
Robert