Herkunfstüberprüfung und Variablenüberprüfung
Dennis
- php
0 Thomas Luethi0 Dennis0 René Marscheider0 Dennis0 Thomas Luethi0 Dennis
0 Empfänger
Dennis0 wahsaga0 Thomas Luethi
Hi @all!
_
|1|
ich hab mir ein PHP Script mit Hilfe von SelfPHP gebastelt.
Dieses Script entspricht relativ genau dem hier http://www.selfphp.info/funktionsreferenz/mail_funktionen/mail.php#beispiel1
Nur hab ich das so umgebaut, dass ich von vielen verschiedenen Seiten dort ein Formular hinschicken kann und das wird dann dort weiterverarbeitet.
Hat den Vorteil, dass ich nicht in jedes Formula php reinschreiben muss.
Hat aber den Nachteil, dass rein theoretisch jeder darüber Mails verschicken kann.
Deshalb: Wie kann ich prüfen, von welchem Server/Domain das abgeschickt wurde?
z.B. Nur Formulare von riehle-web.com und go-modellbahn.de sollen verarbeitet werden.
Wie geht das? Bitte bedenkt, ich bin Anfänger.
_
|2|
Ein kleines Problem ist aber noch da:
Jede Variable die in der HTML-Mail verschickt werden soll, muss ich im PHP script angeben.
Am ' . $datum . ' um ' . $uhrzeit . ' Uhr hat ' . $absender_name . ' das Formular ausgefüllt und abgeschickt.<br>
' . $absender_name . ' hat ' . $absender_email . ' als Absender E-Mail eingegeben und folgende Nachricht geschrieben:<br>
' . $nachricht . '
Jezt kann ich da ja nicht in ein Formular irgendwas reinmachen <input type="text" name="sonstiges"> das wird dann ja nicht mit verschickt.
Wie kann ich erreichen, dass ALLE Name-Wert Paare übermittelt werden, ohne dass ich diese vorher hier rein schreiben muss?
So nach dem Motto:
<?php mache(Liste alle Name-Wert Paare auf) ?>
Bitte auch hier wieder bedenken, dass ich Anfänger bin.
Ich bin dankbar für jede Hilfe, auch zu nur einem Teil.
ich hoffe, das Problem wurde klar.
MfG, Dennis.
Hallo,
Hat aber den Nachteil, dass rein theoretisch jeder darüber Mails verschicken kann.
Der wirksamste Schutz - und das solltest Du eigentlich laengst wissen, weil ich
es schon einmal erklaert habe und Du es zur Kenntnis genommen hast - ist, die
E-Mail-Adresse des Empfaengers im Skript und nicht im Formular zu codieren.
Alles andere ist sehr gefaehrlich.
Z.B. zu schauen, was im Referrer steht.
http://www.php.net/manual/de/reserved.variables.php#reserved.variables.server
$_SERVER['HTTP_REFERER']
Wenn der Referrer leer ist oder unmittelbar vor dem ersten Slash nach http://
eine Deiner beiden Domains enthaelt, wird das Formular verschickt, sonst nicht.
D.h. leer, http://*.DeineDomain1/* und http://*.DeineDomain2/* waeren OK.
Bedenke aber, dass der Referrer gefaelscht werden kann, und dass gerade die
"richtig boesen Jungs" a.k.a. Spammer einen leeren oder eben einen gefaelschten
Referrer angeben werden, um Dein Skript zu missbrauchen. Also lass es lieber sein.
http://www.dclp-faq.de/q/q-http-referer.html
Wie kann ich erreichen, dass ALLE Name-Wert Paare übermittelt werden, ohne dass ich diese vorher hier rein schreiben muss?
Mach eine foreach()-Schleife fuer $_POST (falls Du method="POST" verwendest,
was bei Feedback-Formularen und dergleichen sicher am sinnvollsten ist, sobald
man eine Textarea hat).
http://www.php.net/manual/de/control-structures.foreach.php
Gruesse,
Thomas
Hi @all!
Hat aber den Nachteil, dass rein theoretisch jeder darüber Mails verschicken kann.
Der wirksamste Schutz - und das solltest Du eigentlich laengst wissen, weil ich
es schon einmal erklaert habe und Du es zur Kenntnis genommen hast - ist, die
E-Mail-Adresse des Empfaengers im Skript und nicht im Formular zu codieren.
Damals wars nur Perl/CGI und jetzt PHP. Da dachte ich, ich frag nochmal.
Ok, ich schreibs in Script rein, überzeugt *g*
Aber ich werden den Referer trotzdem noch überprüfen, damit das Risiko zu dass mit irgendwer
irgendwelchen sinnlosen Mist schickt reduziert wird.
Wie kann ich erreichen, dass ALLE Name-Wert Paare übermittelt werden, ohne dass ich diese vorher hier rein schreiben muss?
Mach eine foreach()-Schleife fuer $_POST (falls Du method="POST" verwendest,
was bei Feedback-Formularen und dergleichen sicher am sinnvollsten ist, sobald
man eine Textarea hat).
http://www.php.net/manual/de/control-structures.foreach.php
Das hab ich mir angeschaut und durchgelesen aber ....... hm, so klug werd ich da nicht draus.
Könntest du mir ein kleines Beispiel geben, davon ausgehend, dass es a=variable, b=variable und c=variable gibt.
Du verstehst, was ich meine, oder?
Das wäre echt super nett, weil ich versteh das jetzt einfach nicht.
Gruesse,
Grüße und herlichen Dank zurück,
MfG, Dennis.
foreach($_POST AS $key => $elem)
{
echo $key . ' = ' . $elem . "<br />\r\n";
}
Hi @all!
Wo muss das denn genau rein? ich habs jetzt so gemacht, bei der konfiguration der HTML-Mail, welche versandt wird:
$emailbody = '
<html>
<body bgcolor="#FFFFFF" text="#000000">
Am ' . $datum . ' um ' . $uhrzeit . ' Uhr hat ' . $absender_name . ' das Formular
auf ' . $HTTP_REFERER . ' ausgefüllt und abgeschickt.<br>
<br>
' . $absender_name . ' hat ' . $absender_email . ' als Absender eingegeben und folgende Nachricht geschrieben:<br>
' . $nachricht . '<br>'
foreach($_POST AS $key => $elem) <-- Parse Error!
{
echo $key . ' = ' . $elem . '<br>'
}
'<br>
</body>
</html>
Allerdings krieg ich da einen Parse Error in der gekennzeichneten Linie mit dem foreach.
Warum, was mache ich falsch?
Unterstützt mein Webspace vielleicht kein PHP4? Wie krieg ich das raus?
Gibts da ne Möglichkeit das ohne foreach, auf andere, PHP3 kompatible Methode zu machen?
MfG, Dennis.
Hallo,
$emailbody = '[...]' . $nachricht . '<br>'
foreach($_POST AS $key => $elem) <-- Parse Error!
Allerdings krieg ich da einen Parse Error in der gekennzeichneten Linie mit dem foreach.
Weil die Zeile davor nicht mit ; abgeschlossen wird...
Gewoehne Dich daran, dass die Fehlermeldung manchmal
die Zeile davor oder danach betrifft...
Wenn die "Fehlerzeile" die letzte Zeile des ganzen Scripts ist,
dann hast Du vermutlich _irgendwo_ eine Klammer oder ein
Anfuehrungszeichen vergessen... Das ist der nervigste Fehler!
Unterstützt mein Webspace vielleicht kein PHP4?
phpinfo() weiss mehr...
Gibts da ne Möglichkeit das ohne foreach, auf andere, PHP3 kompatible Methode zu machen?
Vergiss PHP3.
Es gibt noch andere Kontroll-Strukturen und Schleifen,
die Du auch mit Arrays verwenden kannst:
http://www.php.net/manual/de/control-structures.php
Ein Beispiel mit einer for-Schleife gibt's etwas unterhalb von:
http://www.php.net/manual/de/language.types.array.php#language.types.array.foo-bar
foreach() ist aber etwas sehr, sehr praktisches,
ich wuerde nicht darauf verzichten.
Gruesse,
Thomas
Hi @all!
Unterstützt mein Webspace vielleicht kein PHP4?
phpinfo() weiss mehr...
Ach stimmt, und der sagt:
PHP Version 4.3.4
Configure Command: './configure' '--with-mysql' '--with-zlib' '--with-gd' '--with-apxs' '--with-config-file-path=/etc' '--with-ftp' '--with-jpeg-dir=/usr/local/lib' '--with-xml' '--with-ssl' '--with-pdf'
Server API: Apache
uvm.
MfG, Dennis.
Hi Thomas Luethi,
Der wirksamste Schutz - und das solltest Du eigentlich laengst wissen, weil ich
es schon einmal erklaert habe und Du es zur Kenntnis genommen hast - ist, die
E-Mail-Adresse des Empfaengers im Skript und nicht im Formular zu codieren.
Was hälst du von:
if(empfaenger==1) { $email_to = "emailadresse1@riehle-web.com" }
if(empfaenger==2) { $email_to = "emailadresse2@riehle-web.com" }
if(empfaenger==3) { $email_to = "emailadresse3@riehle-web.com" }
else { $email_to = "andereadresse@riehle-web.com" }
Das wäre doch auch idiotensicher, oder?
Drei Adressen von mir.
MfG, Dennis.
hi,
Was hälst du von:
if(empfaenger==1) { $email_to = "emailadresse1@riehle-web.com" }
if(empfaenger==2) { $email_to = "emailadresse2@riehle-web.com" }
if(empfaenger==3) { $email_to = "emailadresse3@riehle-web.com" }
else { $email_to = "andereadresse@riehle-web.com" }Das wäre doch auch idiotensicher, oder?
das wäre sicher - aber leicht ... idiotisch :-)
(sofern du empfaenger noch einen $ spendierst.)
mehrfache if-abfragen würde man natürlich eher als switch realisieren, und bei dieser problemstellung bietet sich evtl. sogar noch ein array zum ablegen der emailadressen an (plus prüfung, ob übergebener index im array existiert natürlich).
gruss,
wahsaga
Hallo,
if(empfaenger==1) { $email_to = "emailadresse1@riehle-web.com" }
if(empfaenger==2) { $email_to = "emailadresse2@riehle-web.com" }
if(empfaenger==3) { $email_to = "emailadresse3@riehle-web.com" }
else { $email_to = "andereadresse@riehle-web.com" }
Wenn die Konstante "empfaenger" den Wert 3 hat,
geht es an emailadresse3@..., sonst an emailadresse@...
Nicht gerade optimal. ;-)
Beachte: Das else bezieht sich nur auf die letzte Bedingung.
Und Du solltest die Zuweisungen jeweils mit einem ; abschliessen.
PHP ist da strikter als JavaScript.
Bei mehr als 3 Moeglichkeiten (wo man noch if/elseif/else
verwenden koennte) solltest Du das ganze - wie wahsaga
schon schrieb - mit einer SWITCH/CASE Struktur machen.
Oder mit einem Array.
Die Werte der Parameter aus $_POST u.s.w. sind uebrigens
AFAIK immer vom Typ "String".
Mit SWITCH/CASE wuerde ich es so machen:
SWITCH ($_POST['empfaenger'])
{
CASE "1":
$email_to = "emailadresse1@riehle-web.com";
break;
/* u.s.w. */
DEFAULT:
$email_to = "emailadresse@riehle-web.com";
break;
}
http://www.php.net/manual/de/control-structures.switch.php
Das wäre doch auch idiotensicher, oder?
Ja, wenn Du es richtig machst, ist das eine brauchbare Loesung.
Gruesse,
Thomas