Schrift
[thread]2973[/thread]

Hilfe mit Formular Script: CGI - Perl ### Formular

Leser: 2


<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten
Strat
 2004-01-16 12:37
#28166 #28166
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
so auf auf die schnelle fallen mir mal folgende sachen auf:

1. schreibe anstelle von
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ($ENV{"REQUEST_METHODE"} eq "POST")
{
read(STDIN, $daten, $ENV{"CONTENT_LENGTH"});
} else {
$daten = $ENV{"QUERY_STRING"};
}
@paare = split("&", $daten);
foreach $paar (@paare)
{
$paar =~ tr/+/ /;
$paar =~ s/%(..)/pack("C", hex($1))/eg;
($name, $wert) = split("=", $paar);
$FORM{$name} = $wert;
}

besser:
Code (perl): (dl )
1
2
3
use CGI;
my &#36cgi = CGI->new();
my %FORM = &#36cgi->Vars();

dann kannst du schon mal viele probleme und Abstuerze vermeiden (perl mag z.B. nicht hex('zz'), und wenn im wert eines parameters ein = vorkommen sollte, dann wuerde alles nach dem = verloren gehen...

2. du schreibst oefter
Code: (dl )
if ($FORM{'input07'} ne "" and ne "Musterweg 10") {print MAIL "$FORM{'input07'}\n\n"; }

ne vergleicht immer zwei werte, also da besser schreiben:
Code: (dl )
1
2
3
4
if ($FORM{'input07'} ne "" and 
$FORM{'input07'}ne "Musterweg 10") {
print MAIL "$FORM{'input07'}\n\n";
}

(ebenso in den folgezeilen

4.
Code: (dl )
&falsch(Fehler 02: Bitte eine gueltige eMail Adresse eingeben !) unless ($input13 =~ m/^[a-zA-Z0-9][-\_\.]*[a-zA-Z0-9]\@[a-zA-Z0-9][-\_\.]*[a-zA-Z0-9][\.]([a-zA-Z]){2,4}$/);

Email-Adressen wie irgendwas.@irgendwas.de sind auch gueltig... zum Ueberpruefen einer Email-Adresse verwende ich gerne das Perl-Modul CPAN:Mail::RFC822::Address

5. Zeile 75: [\.] ist fuer die katz; da reicht \.

6. eine gueltige Telefonnummer sieht folgendermaszen aus?
Code: (dl )
/^[0]\d+.\d+$/

also am anfang eine 0, danach eine oder mehrere Ziffern, danach ein beliebiges Zeichen (.), danach ein oder mehrere ziffern am ende?

7. wenn die Bedingung in if/unless recht lange ist, ist die Form
Code: (dl )
1
2
3
if (langeBedingung) {
block
}

normalerweise besser lesbar als
Code: (dl )
block if langeBedingung;


8. Zu Crian's Aussage wegen der Prototypen: eigene Subroutinen rufe ich immer mit &Subroutine(...) auf, weil ich nie Prototypen verwende (wofuer auch?), und weil es mir logischer erscheint, vor der Subroutine ein & zu haben (analog zu %hash, @array, $scalar, ...). Nur eingebaute Perl-Subroutinen (auch aus Modulen) sollte man besser nicht mit &Subroutine(...) aufrufen, weil sich da das mit den Prototypen auswirken koennte (aber sogar das wuerde bei tests schnell auffallen). und so kann man gut eigene Subs von fremden unterscheiden
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2004-01-16 22:39
#28167 #28167
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
setz vor jeder Initialisierung ein "my" also:
Code: (dl )
1
2
3
4
5
6
#! /usr/bin/perl
#... weiterer Code
my $mailprog = '/usr/sbin/sendmail';
my $date = '/usr/bin/date';
#usw...
# Bei der weiteren Verwendung der Variablen KEIN my mehr benutzen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Dubu
 2004-01-18 00:33
#28168 #28168
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Die Zeile sieht korrekt aus. Bist du sicher, dass die Zeile so wirklich in der ausgefuehrten Datei vorhanden ist?
(Das "my" darf/muss natuerlich nur bei der ersten Verwendung der Variablen davor stehen.)
Captain Future
 2004-01-18 15:12
#28169 #28169
User since
2004-01-16
19 Artikel
BenutzerIn
[default_avatar]
Hi Renee,

super jetzt sind bis auf einen Fehler alle weg.
Lediglich folgender Error wird noch geloggt:

[Sun Jan 18 14:06:11 2004] formpost.pl: Can't localize lexical variable $what at formpost.pl line 200.

Schonmal Danke für die Hilfe im Voraus.

(Aller Anfang ist schwer aber für's erste Perl-Script denke geht's)

MfG Captain Future
eisbeer
 2004-01-18 23:20
#28170 #28170
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ist nicht böse gemeint, aber - vorrausgesetzt du
kannst englisch - die Fehlermeldungen, die Perl
dir gibt haben schon eine Bedeutung...

Ich denke, hier ist zwar jeder so hilfsbereit und wird
dir auch mit Freude helfen, lernen tust du aber am
besten das, was du selbst rausgefunden hast. Probier
rum ... wenn du zum Beispiel die meldung
Code: (dl )
Missing right curly or square bracket at formpost.pl line 232, at end of line

bekommst, wirst du ja selbst sehen, das
eine Klammer fehlt ... :)
Ich denke, du bist ja nicht auf den Kopf
gefallen und ich trau dir das auch zu, weil
der Code für einen Anfänger ja garnicht
schlecht ist.

Also, nichts für ungut, aber versuch Perl
zu verstehen, es redet mit dir :)

Gute Nacht, Claudi
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
Dubu
 2004-01-20 23:12
#28171 #28171
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Was ich beim Ueberfliegen noch sehe:
- Zeile 25: Du benutzt Single-Quotes und quotest die '@' nochmal mit '\@'. Damit landen die Backslashes in den E-Mail-Adressen.
- Zeile 69: Da fehlt ein 'print'.
- Du rufst SendIt() und PrintResponse() auf, bevor du ueberhaupt $date und $time berechnest!
- "sprinf" statt "sprintf" wurde ja schon genannt.
- Zeile 95: Da stehen immer noch Single Quotes (') statt Backticks (`) um den cat-Befehl.
- Dass die Fehlerseite evtl. mehrfach ausgegeben wird liegt daran, dass du missing() fuer jedes fehlende Feld wieder aufrufst.
- Wenn die Formularfelder nicht erkannt werden: Hast du ueberprueft, dass die Feldnamen wirklich stimmt, inkl. Gross-/Kleinschreibung?
Crian
 2004-01-28 22:50
#28172 #28172
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Aber die regulären Ausdrücke sind ja auch wirklich nicht ganz trivial. Am besten liest Du Dir dazu das entsprechende Kapitel im Kamelbuch gründlich durch, falls Du ein solches besitzt oder an eines herankommst.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Captain Future
 2004-01-16 02:24
#28173 #28173
User since
2004-01-16
19 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

Bitte um Hilfe mit meinem Script.
Bin noch ein Perl-Newbie habe hier mein erstes Script gepostet.
Leider sind darin noch einige Fehler, da ich sozusagen einen Köpfler in Perl gemacht habe.
Da ich keine Perlumgebung @ Home laufen habe ist das Script also so runtergeschrieben.
Hier erstmal mein Script zur Versendung und überprfung von Formulardaten:

Code: (dl )
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
#!/usr/bin/perl
# Pfad zu Prel

# ------------ Pfad zum Mailprogramm ------------
$mailprog = '/usr/sbin/sendmail';

# Pfad zum Date-Kommando:
$date = '/usr/bin/date';

# OS auf dem das Programm eingesetzt wird (Server)! UNIX / WINDOWS
$os = "UNIX";

# Weiterleitungs-URL nach dem Versenden der Formulardaten
$returnurl = "http://www.xyz4711.de/index.html";

# Zeitspanne in Sekunden nach der auf die $returnurl weitergeleitet wird:
$weiterleitungszeit = 5;

# E-Mail Adresse des Empf&auml;ngers (mit \@):
@email_list = ("info\@xyz4711.de", "webmaster\@xyz4711.de");

###################################################################
# Perl-Programm ist f&uuml;r &Uuml;bergabemethode POST sowie GET geeignet:

if ($ENV{"REQUEST_METHODE"} eq "POST")
  {
read(STDIN, $daten, $ENV{"CONTENT_LENGTH"});
  } else {
         $daten = $ENV{"QUERY_STRING"};
         }
         @paare = split("&", $daten);
         foreach $paar (@paare)
                  {
                  $paar =~ tr/+/ /;
                  $paar =~ s/%(..)/pack("C", hex($1))/eg;
                  ($name, $wert) = split("=", $paar);
                  $FORM{$name} = $wert;
                  }

###################################################################
# ------------------ Formular-Elemente ------------------

$recipient = $FORM{'recipient'};
$recipient_bcc = $FORM{'recipient_bcc'};
$subject = $FORM{'subject'};
$CB01 = $FORM{'Kacheloefen'};
$CB02 = $FORM{'Kaminoefen'};
$CB03 = $FORM{'Herde'};
$CB04 = $FORM{'Heizkamine'};
$input05 = $FORM{'Vorname'};
$input06 = $FORM{'Nachname'};
$input07 = $FORM{'Strasse'};
$input08 = $FORM{'PLZ'};
$input09 = $FORM{'Ort'};
$input10 = $FORM{'Land'};
$input11 = $FORM{'Telefon'};
$input12 = $FORM{'Telefax'};
$input13 = $FORM{'eMail'};
$input14 = $FORM{'Betreff'};
$input15 = $FORM{'Text'};

###################################################################

$input15 =~ s/\cM//g;
$input15 =~ s/\n/  /g;

###################################################################
# ------- Check auf fehlende und falsche Eingabe -------
&missing(Vorname) unless $input05;
&missing(Nachname) unless $input06;
&missing(eMail) unless $input13;
&missing(Text) unless $input15;

### Zeile 74 ###
&falsch(Fehler 01: Bitte eine gueltige Postleitzahl(PLZ) eingeben !) unless ($input08 =~ m/\d{5});
### Zeile 75 ###
&falsch(Fehler 02: Bitte eine gueltige eMail Adresse eingeben !) unless ($input13 =~ m/^[a-zA-Z0-9][-\_\.]*[a-zA-Z0-9]\@[a-zA-Z0-9][-\_\.]*[a-zA-Z0-9][\.]([a-zA-Z]){2,4}$/);
&falsch(Fehler 03: Bitte eine gueltige Telefonnummer eingeben !) unless ($input11 =~ m/^[0]\d+.\d+$/);
&falsch(Fehler 04: Bitte eine gueltige Telefaxnummer eingeben !) unless ($input12 =~ m/^[0]\d+.\d+$/);
&falsch(Fehler 05: Bitte einen gueltigen Strassennamen eingeben !) unless ($input07 =~ m/\w?\-/);
&falsch(Fehler 06: Bitte einen gueltigen Ortsnamen eingeben !) unless ($input09 =~ m/\D/);
&falsch(Fehler 07: Bitte einen gueltigen Landesnamen eingeben !) unless ($input09 =~ m/\D/);

sub falsch {
         ($fehler) = @_;
          }
##################################################################

&getdate;

if($os eq "UNIX")
    {
    &SendIt;
    } else {
           require "winmail.pl";
           &SendMail($mailprog, $tempdirectory, $subject, $email_list[$recipient], $Text);
           }
&PrintResponse;

###################################################################
# ---------- Empf&auml;nger-Mail aus den Formulardaten (im TXT-Format) ----------
sub SendIt {
open (MAIL, "|$mailprog -t") || die "Kann Sendmail nicht starten: $!";
print MAIL "To: $email_list[$recipient, $recipient_cc]\n";
print MAIL "From: $input05, $input06\n\n";
print MAIL "------ KUNDENANFRAGE via WebFormular ------\n";
print MAIL "===========================================\n";
print MAIL "Subject: $subject - ";
if ($FORM{'input14'} ne "") {print MAIL "$FORM{'input14'}\n";
print MAIL "===========================================\n";
print MAIL "Text des Kunden:\n";
print MAIL "$input15\n";
print MAIL "===========================================\n";
print MAIL "Kunde interessiert sich fuer:\n\n";
if ($FORM{'CB01'} ne "") {print MAIL "$FORM{'CB01'}\n";
if ($FORM{'CB02'} ne "") {print MAIL "$FORM{'CB02'}\n";
if ($FORM{'CB03'} ne "") {print MAIL "$FORM{'CB03'}\n";
if ($FORM{'CB04'} ne "") {print MAIL "$FORM{'CB04'}\n\n";
print MAIL "===========================================\n";
print MAIL "Kundendaten:\n\n";
print MAIL "$input05, $input06\n";
if ($FORM{'input07'} ne "" and ne "Musterweg 10") {print MAIL "$FORM{'input07'}\n\n";
if ($FORM{'input08'} ne "" and ne "12345") {print MAIL "$FORM{'input08'}";
if ($FORM{'input09'} ne "" and ne "Musterhausen") {print MAIL "$FORM{'input09'}\n";
if ($FORM{'input10'} ne "" and ne "Musterland") {print MAIL "$FORM{'input10'}\n\n";
if ($FORM{'input11'} ne "" and ne "08382-72176") {print MAIL "Tel.:  $FORM{'input11'}\n";
if ($FORM{'input12'} ne "" and ne "08382-75140") {print MAIL "Fax.:  $FORM{'input12'}\n";
print MAIL "eMail: $input13\n\n";
print MAIL "===========================================\n";
print MAIL "Das Formular wurde am $date um $time Uhr (MEZ) vom Kunden versendet.\n";
print MAIL "IP des Absenders:   $ipaddr\n";
print MAIL "Host des Absenders: $hostname\n\n";
print MAIL "Formular-Nr.: $count\n";
print MAIL "===========================================\n\n";
print MAIL "<<< Dies ist ein Service des Webmasters: Captain Future >>>";
close (MAIL);
          }
###################################################################
# ------------ Remote_Host auslesen (Variante für 1&1) ------------

# Using Socket-Library
use Socket;

# Fatal-Fehler an den Browser schicken
use CGI::Carp 'fatalsToBrowser';

# Die Variable $ipaddr auf die Remote IP-Adresse setzten
$ipaddr = $ENV{'REMOTE_ADDR'};

# Die IP muss codiert werden:
$iptocheck = inet_aton($ipaddr);

# Host-Lookup auf die codierte IP machen:
$hostname = gethostbyaddr($iptocheck, AF_INET);

###################################################################
# ------------ Datums und Zeitstempel ------------

sub getdate {
@days = ("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
@months = ("Januar", "Februar", "Maerz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$time = sprinf("%02d:%02d:%02d", $hour, $min, $sec);
$year += 1900;
$date = "$days[$wday], $mday. $months[$mon] $year";
           }

##################################################################
# ------------ Counter-Funktion ------------
$countfile = "formcount.txt";
$count = 'cat $countfile';
chop($count);
$count = $count + 1;
open (INF, ">$countfile");
print INF "$count\n";
close (INF);

##################################################################
# ------------ Ergebnis-Seite bei Erfolg ------------
sub PrintResponse {
print "Content-type: text/html\n\n";
print <<"ENDE"
<html>
<head>
  <meta name="Description" content="www.xyz4711.de || Webseite vom xyz4711 || Hier finden Sie ...>
  <title>XYZ4711 >> Kontaktformular - Daten Erfolgreich versendet !</title>
  <meta http-equiv="refresh" content="$weiterleitungszeit; URL=$returnurl">
</head>

<body text="#FFFFFF" bgcolor="#6B0000" link="#0000FF" vlink="#009900" alink="#FF0000">
<div align="center"><br><br><br>
<table bgcolor="#C0C0C0" width="500" cellspacing="4" cellpadding="4">
<tr>
<td>
<font face="Verdana,Arial,Times" size="-1" color="#000000"><b><font size="+2" color="#00A050"><i>Vielen Dank</i></font><br><br>Herr/Frau <font color="#0000FF">$input05, $input06</font>, da&szlig; Sie sich die Zeit genommen haben um dieses Formular auszuf&uuml;llen.<br><br>Ihre Daten sind am <font color="#0000FF">$date</font> um <font color="#0000FF">$time</font> Uhr <font color="#00A050"><i>erfolgreich</i></font> an das xyz4711 &uuml;bermittelt worden.<br><br>Sie werden in <font color="#0000FF">$weiterleitungszeit</font> Sekunden automatisch zur Startseite des XYZ4711 weitergeleitet.<br><br>Falls ihr Browser dies nicht tut, klicken Sie bitte folgenden Link an:<br><a href="$returnurl">Zur&uuml;ck zur Hauptseite</a><br><br>Mit freundlichem Gru&szlig;<br><br><font color="#FFDF00"><i>Ihr XYZ4711</i></font></b></font>
</td>
</tr>
</table>
</div>

</body>
</html>

ENDE

                 }

#################################################################
# ------------ Ergebnis-Seite bei Fehlern ------------
sub missing {
local ($what) = @_;

print "Content-type: text/html\n\n";
print <<"FIN"
<html>
<head>
  <title>XYZ4711 >> Kontaktformular - Es traten Fehler auf !</title>
  <meta http-equiv="refresh" content="$weiterleitungszeit; URL=$returnurl">
</head>

<body text="#FFFFFF" bgcolor="#6B0000" link="#0000FF" vlink="#009900" alink="#FF0000">
<div align="center"><br><br><br>
<table bgcolor="#C0C0C0" width="500" cellspacing="4" cellpadding="4">
<tr>
<td>
<font face="Verdana,Arial,Times" size="-1" color="#000000"><b><font size="+2">Achtung <font color="#FF0000"><i>FEHLER</i></font></font>
<br><br>
Leider traten beim ausfüllen des Formulars Fehler auf:<br><br>Es wurde folgendes vergessen:<br><font color="#FF0000"><i>$what</i></font><br><br>Folgende Eingabefehler wurden falsch ausgef&uuml;llt:<br><font color="#FF0000"><i>$fehler</i></font><br><br> Bitte gehen Sie mit dem Zurück Knopf ihres Browsers wieder zum Formular und vervollst&auml;ndigen Sie bitte die oben genannten Daten. Vielen Dank.<br><br>Mit freundlichem Gruß<br><br><font color="#FFDF00"><i>Ihr XYZ4711 || &nbsp;&nbsp; &copy; </i></font></b></font>
</td>
</tr>
</table>
</div>

</body>
</html>

FIN

           }

#################################################################


Der Aufruf des Scriptes verursacht einen INTERNAL ERROR
Im Error-Logfile wird dazu folgendes vermerkt:

Number found where operator expected at formpost.pl line 74, near "Fehler 01"
       (Do you need to predeclare Fehler?)
Bareword found where operator expected at formpost.pl line 74, near ") eingeben"
       (Missing operator before eingeben?)
Backslash found where operator expected at formpost.pl line 75, near "_\"
 (Might be a runaway multi-line // string starting on line 74)
Backslash found where operator expected at formpost.pl line 75, near "]\"
       (Missing operator before \?)
Bareword found where operator expected at formpost.pl line 75, near "@[a"
       (Missing operator before a?)
Backslash found where operator expected at formpost.pl line 75, near "_\"
syntax error at formpost.pl line 74, near "Fehler 01"
Unmatched right square bracket at formpost.pl line 75, at end of line
Unrecognized file test: -Z at formpost.pl line 75.
[Fri Jan 16 00:03:17 2004] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/xyz4711.de/www/cgi-bin/formpost.pl

Habe nachdem ich die Überprüfung auf fehlende Eingaben im Formular, die Üüberprüfung auf falsche Eingaben versucht nachträglich einzubauen mit wohl mäßigem Erfolg. Denn ich glaube in diesem Bereich könnte der Fehler/die Fehler liegen.

Warum ich die Überprfung von falschen Eingaben nicht mit Java Script gemacht habe? Nun bin mitlerweile von Perl so begeistert obwohl ich Perl-Anfänger bin, daß ich es einfach in Perl umsetzten wollte.

Schonmal im Voraus vielen Dank für Eure Hilfe.

MfG Catain Future
Dubu
 2004-01-16 12:42
#28174 #28174
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Captain Future,16.01.2004, 01:24]
Bin noch ein Perl-Newbie habe hier mein erstes Script gepostet.
[/quote]
Fuer einen Neuling ist der Code schon recht gut. :)

Trotzdem wuerde ich dir eher raten, einen guten(! ) FormMailer anzupassen (siehe z.B. NMS-FormMailer), statt hier in diverse Fallen zu geraten. Eine gute Uebung ist das Selberschreiben sicherlich, aber fuer den Produktiveinsatz halte ich den Code so fuer zu gefaehrlich.

Quote
Leider sind darin noch einige Fehler, da ich sozusagen einen Köpfler in Perl gemacht habe.
Da ich keine Perlumgebung @ Home laufen habe ist das Script also so runtergeschrieben.

Mein Tipp: Installier dir Perl! Selbst wenn du keinen Webserver laufen hast, kannst du zumindest deine Programme auf syntaktische Korrektheit pruefen.

Quote
Code: (dl )
1
2
#!/usr/bin/perl
# Pfad zu Prel

Hier fehlen auf jeden Fall
use strict;
use warnings;

Diese sind zwar nicht syntaktisch notwendig, erleichtern aber die Entwicklung ungemein, wenn du die Fehler- und Warnmeldungen erhaeltst. Fuer "strict" muessen allerdings saemtliche Variablen deklariert (oder voll qualifiziert angegeben) werden.

Quote
Code: (dl )
1
2
3
...
# Pfad zum Date-Kommando:
$date = '/usr/bin/date';

Dieses Date-Kommando brauchst du danach nie wieder.
Den Variablennamen dagegen verwendest du unten nochmal!

Quote
Code: (dl )
1
2
3
...
# E-Mail Adresse des Empf&auml;ngers (mit \@):
@email_list = ("info\@xyz4711.de", "webmaster\@xyz4711.de");

Wenn man statt doppelter einfache Anfuehrungszeichen nimmt, kann man sich das Escapen der '@' sparen.

Quote
Code: (dl )
1
2
3
4
5
6
7
###################################################################
# Perl-Programm ist f&uuml;r &Uuml;bergabemethode POST sowie GET geeignet:

if ($ENV{"REQUEST_METHODE"} eq "POST")
  {
read(STDIN, $daten, $ENV{"CONTENT_LENGTH"});
...

Auahauaha.
Nein, bitte nicht diese kaputten selbstgeschriebenen Formularfunktionen! Nimmt CGI.pm, bitte! Es gehoert seit Perl 5.6.1 zum Standardumfang:

Code: (dl )
1
2
use CGI;
my %FORM = CGI::Vars();


Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
###################################################################
# ------------------ Formular-Elemente ------------------

$recipient = $FORM{'recipient'};
$recipient_bcc = $FORM{'recipient_bcc'};
$subject = $FORM{'subject'};
$CB01 = $FORM{'Kacheloefen'};
$CB02 = $FORM{'Kaminoefen'};
$CB03 = $FORM{'Herde'};
$CB04 = $FORM{'Heizkamine'};
$input05 = $FORM{'Vorname'};
$input06 = $FORM{'Nachname'};
$input07 = $FORM{'Strasse'};
$input08 = $FORM{'PLZ'};
$input09 = $FORM{'Ort'};
$input10 = $FORM{'Land'};
$input11 = $FORM{'Telefon'};
$input12 = $FORM{'Telefax'};
$input13 = $FORM{'eMail'};
$input14 = $FORM{'Betreff'};
$input15 = $FORM{'Text'};

Warum kopierst du hier die Formularinhalte von einem Hash mit sinnvoll benannten Feldern in durchnummerierte Variablen? Ich finde, der Code wird dadurch eher weniger verstaendlich, aber okay.

Quote
Code: (dl )
1
2
3
4
###################################################################

$input15 =~ s/\cM//g;
$input15 =~ s/\n/  /g;

Die Benutzereingaben zu bearbeiten ist eine gute Idee. Aber warum nur $input15? Der ist gerade am wenigsten gefaehrlich. $input05 und $input06 faende ich hier wichtiger, weil diese direkt im Header der Mail landen und durch Manipulation dieser Felder der Formmailer missbraucht werden kann.

Quote
Code: (dl )
1
2
3
4
5
6
###################################################################
# ------- Check auf fehlende und falsche Eingabe -------
&missing(Vorname) unless $input05;
&missing(Nachname) unless $input06;
&missing(eMail) unless $input13;
&missing(Text) unless $input15;

Hier sollte das Argument der Funktionsaufrufe jeweils in Anfuehrungszeichen stehen, da es sich um Strings handelt.

Also:
Code: (dl )
1
2
missing('Vorname') unless $input05;
...



Quote
Code: (dl )
1
2
### Zeile 74 ###
&falsch(Fehler 01: Bitte eine gueltige Postleitzahl(PLZ) eingeben !) unless ($input08 =~ m/\d{5});

Hier gilt das gleiche: Argument der Funktion in Anfuehrungszeichen.
Ausserdem ist hier die Regex nicht beendet und wahrscheinlich auch falshc. Ich vermute, du moechtest pruefen, ob $input08 exakt aus fuenf Ziffern besteht. Dann lautete es so:
Code: (dl )
falsch ("Fehler 01: Bitte eine gueltige Postleitzahl(PLZ) eingeben!") unless $input08 =~ m/^\d{5}$/;


Quote
Code: (dl )
1
2
### Zeile 75 ###
&falsch(Fehler 02: Bitte eine gueltige eMail Adresse eingeben !) unless ($input13 =~ m/^[a-zA-Z0-9][-\_\.]*[a-zA-Z0-9]\@[a-zA-Z0-9][-\_\.]*[a-zA-Z0-9][\.]([a-zA-Z]){2,4}$/);

Wie oben, nur dass zusaetzlich die Regex fuer die E-Mail-Adresse alles andere als vollstaendig ist. Nimm Email::Valid oder Mail::RFC822::Address oder aehnliches fuer diesen Test.

Quote
Code: (dl )
&falsch(Fehler 03: Bitte eine gueltige Telefonnummer eingeben !) unless ($input11 =~ m/^[0]\d+.\d+$/);

Siehe oben.

Quote
Code: (dl )
&falsch(Fehler 04: Bitte eine gueltige Telefaxnummer eingeben !) unless ($input12 =~ m/^[0]\d+.\d+$/);

Die Regex bedeutet: "Eine Null am Anfang, gefolgt von beliebig vielen Ziffern, gefolgt von einem beliebigen Zeichen, gefolgt von beliebig vielen Ziffern und Ende des Strings." War das so gemeint?

Quote
Code: (dl )
&falsch(Fehler 05: Bitte einen gueltigen Strassennamen eingeben !) unless ($input07 =~ m/\w?\-/);

Diese Regex bedeutet: "Der String enthaelt evtl. ein Wortzeichen (also a-z, A-Z, 0-9 oder '_' ), auf jeden Fall gefolgt von einem Bindestrich."

Quote
Code: (dl )
&falsch(Fehler 06: Bitte einen gueltigen Ortsnamen eingeben !) unless ($input09 =~ m/\D/);

"Der String enthaelt mindestens ein Zeichen, das keine Ziffer ist."

Quote
Code: (dl )
&falsch(Fehler 07: Bitte einen gueltigen Landesnamen eingeben !) unless ($input09 =~ m/\D/);

S.o.

Quote
Code: (dl )
1
2
3
sub falsch {
         ($fehler) = @_;
          }

Gut, die Fehlerbehandlung steht wohl noch am Anfang. ;)

Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
##################################################################

&getdate;

if($os eq "UNIX")
    {
    &SendIt;
    } else {
           require "winmail.pl";
           &SendMail($mailprog, $tempdirectory, $subject, $email_list[$recipient], $Text);
           }

Ich weiss nicht, was "winmail.pl" enthaelt, aber wahrscheinlich muss $tempdirectory irgendwo gesetzt werden, und $mailprog ist in diesem Programm auch nicht passend fuer ein Windows-System.

Wusstest du schon, dass es Perl-Module gibt, die das Versenden von E-Mails deutlich vereinfachen, wie Mail::Mailer oder MIME::Lite?

Quote
Code: (dl )
1
2
3
4
5
6
&PrintResponse;

###################################################################
# ---------- Empf&auml;nger-Mail aus den Formulardaten (im TXT-Format) ----------
sub SendIt {
open (MAIL, "|$mailprog -t") || die "Kann Sendmail nicht starten: $!";

Besser waere bei Sendmail der Aufruf
"|$mailprog -oit"
weil damit verhindert wird, dass man den eingebenen Text leicht so manipulieren kann, dass man damit beliebige E-Mails ueber den Server verschickt.

Quote
Code: (dl )
1
2
print MAIL "To: $email_list[$recipient, $recipient_cc]\n";
print MAIL "From: $input05, $input06\n\n";

Here be dragons!
Da die Eingaben $input05 und $input06 nicht geprueft wurden, kann ein Angreifer alles erdenkliche in den Header injizieren, inkl. neuer Empfaenger-Adressen in einem CC-Feld.

Quote
Code: (dl )
1
2
3
print MAIL "------ KUNDENANFRAGE via WebFormular ------\n";
print MAIL "===========================================\n";
print MAIL "Subject: $subject - ";

Den Betreff im Body der Mail zu haben ist zwar ungewoehnlich, aber nicht verboten. ;)

Quote
Code: (dl )
if ($FORM{'input14'} ne "") {print MAIL "$FORM{'input14'}\n";

Von $FORM{input14} war bisher nicht die Rede. Wahrscheinlich meinst du $input14 oder $FORM{Subject}.
Ausserdem: Wenn das Feld leer ist, wird in dieser Zeile auch kein Zeilenumbruch ausgegeben. Absicht?

Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
print MAIL "===========================================\n";
print MAIL "Text des Kunden:\n";
print MAIL "$input15\n";
print MAIL "===========================================\n";
print MAIL "Kunde interessiert sich fuer:\n\n";
if ($FORM{'CB01'} ne "") {print MAIL "$FORM{'CB01'}\n";
if ($FORM{'CB02'} ne "") {print MAIL "$FORM{'CB02'}\n";
if ($FORM{'CB03'} ne "") {print MAIL "$FORM{'CB03'}\n";
if ($FORM{'CB04'} ne "") {print MAIL "$FORM{'CB04'}\n\n";

Auch hier soll es wahrscheinlich $CB01 etc. heissen.

Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
print MAIL "===========================================\n";
print MAIL "Kundendaten:\n\n";
print MAIL "$input05, $input06\n";
if ($FORM{'input07'} ne "" and ne "Musterweg 10") {print MAIL "$FORM{'input07'}\n\n";
if ($FORM{'input08'} ne "" and ne "12345") {print MAIL "$FORM{'input08'}";
if ($FORM{'input09'} ne "" and ne "Musterhausen") {print MAIL "$FORM{'input09'}\n";
if ($FORM{'input10'} ne "" and ne "Musterland") {print MAIL "$FORM{'input10'}\n\n";
if ($FORM{'input11'} ne "" and ne "08382-72176") {print MAIL "Tel.:  $FORM{'input11'}\n";
if ($FORM{'input12'} ne "" and ne "08382-75140") {print MAIL "Fax.:  $FORM{'input12'}\n";

Dito fuer $FORM{inputXX} vs. $inputXX.

Quote
Code: (dl )
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
print MAIL "eMail: $input13\n\n";
print MAIL "===========================================\n";
print MAIL "Das Formular wurde am $date um $time Uhr (MEZ) vom Kunden versendet.\n";
print MAIL "IP des Absenders:   $ipaddr\n";
print MAIL "Host des Absenders: $hostname\n\n";
print MAIL "Formular-Nr.: $count\n";
print MAIL "===========================================\n\n";
print MAIL "<<< Dies ist ein Service des Webmasters: Captain Future >>>";
close (MAIL);
          }
###################################################################
# ------------ Remote_Host auslesen (Variante für 1&1) ------------

# Using Socket-Library
use Socket;

# Fatal-Fehler an den Browser schicken
use CGI::Carp 'fatalsToBrowser';

# Die Variable $ipaddr auf die Remote IP-Adresse setzten
$ipaddr = $ENV{'REMOTE_ADDR'};

# Die IP muss codiert werden:
$iptocheck = inet_aton($ipaddr);

# Host-Lookup auf die codierte IP machen:
$hostname = gethostbyaddr($iptocheck, AF_INET);

Nur eine Warnung: Ein gethostbyaddr() kann laenger dauern, weil dafuer ein reverse DNS Lookup gemacht werden muss. Fuer Skripte, die sehr haeufig aufgerufen werden, wuerde ich darauf verzichten.

Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
###################################################################
# ------------ Datums und Zeitstempel ------------

sub getdate {
@days = ("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
@months = ("Januar", "Februar", "Maerz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$time = sprinf("%02d:%02d:%02d", $hour, $min, $sec);
$year += 1900;
$date = "$days[$wday], $mday. $months[$mon] $year";
           }

Tipp: Gewoehne dir an, deine Variablen in moeglichst kleinem Geltungsbereich ("Scope") zu deklarieren und moeglichst wenige globale Variablen zu benutzen. Wenn man sich an "use strict" gewoehnt hat, faellt einem das sogar leichter. Generell sollte man es vermeiden, in Subroutinen andere Variablen als lokal erzeugte oder uebergebene zu verwenden.

Quote
Code: (dl )
1
2
3
4
##################################################################
# ------------ Counter-Funktion ------------
$countfile = "formcount.txt";
$count = 'cat $countfile';

Das sollen wahrscheinlich keine einfachen Anfuehrungszeichen sein, sondern Backticks.

Quote
Code: (dl )
1
2
3
4
5
chop($count);
$count = $count + 1;
open (INF, ">$countfile");
print INF "$count\n";
close (INF);

Dieser Code faellt schnell auf die Nase, wenn das Programm mehrere Male parallel laeuft. Da wird entweder falshc gezaehlt oder sogar der Zaehler geloescht.
Siehe dazu auch perldoc -q "get locking".

HTH
renee
 2004-01-16 22:41
#28175 #28175
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
setz das
Code: (dl )
1
2
3
use CGI;
my $cgi = CGI->new();
my %FORM = $cgi->Vars();

mal hinter die Zeile mit #! /usr/bin/perl...

nur wegen der Übersichtlichkeit...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten



View all threads created 2004-01-16 12:37.