phpbar.de logo

Mailinglisten-Archive

[php] Wie kann man verschiedene Daten aus einem Formular verknüpfen.

[php] Wie kann man verschiedene Daten aus einem Formular verknüpfen.

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Die Mai 8 20:20:34 CEST 2007


Hallo Marita,

Am Dienstag, 8. Mai 2007 schrieb Marita Betz:
> Lutz Zetzsche schrieb:
> > Bei 1. gilt was der Auftraggeber wünscht, bei 2. gilt, daß es
> > gemacht werden muß, weil Du ja sonst einen Fehler in der Software
> > hast, für das Du wiederum haftest und Dein Auftraggeber Dich im
> > Zweifelsfall zur Verantwortung zieht.
>
> Lt. meinen Auftraggeber soll es bei diesem Formular keine
> Pflichtfelder geben.

also das kannst Du ihm gleich mal ausreden. :-D Es macht absolut keinen 
Sinn, eine Mail zu versenden, die keinen Absender und keinen Inhalt 
hat. Folglich sind die Felder E-Mail und Mitteilung aus meiner Sicht 
zwingend Pflichtfelder.

> > Eine einfache Maßnahme ist z.B. schon einmal, eine Mail nicht zu
> > versenden, wenn Du "TO:"-, "CC:"- und "BCC:"-Angaben in einem der
> > Feldinhalte entdeckst.
>
> In meinen Buch "Besser programmieren mit PHP" ist dazu anscheinend
> nichts drin, aber ich habe mir gerade den Heise-Artikel ausgedruckt,
> das könnte ich doch hernehmen. Und die Prüfung nicht nur für das
> absender-Feld machen sondern auch für TO: CC: BCC:, oder?

Du mußt die einzelnen Elemente einer Mail sauber auseinander halten. 
Grundsätzlich mußt Du, wie gesagt, jedes übergebene Formularfeld auf 
die Korrektheit seines Inhalts prüfen.

Die Prüfung der FROM-Adresse (Absender) ist sinnvoll, um 
sicherzustellen, daß die Absenderadresse syntaktisch korrekt ist. Eine 
Prüfung der Mailadresse auf Gültigkeit wäre nur möglich, indem Du 
tatsächlich eine Testmail an die Adresse schicken würdest. Die 
Syntaxprüfung bewahrt den Absender aber immerhin vor groben Tipfehlern.

Die Prüfung der Felder auf "TO:", "CC:" und "BCC:" dient hingegen der 
Entdeckung von Spamversuchen!

> > Also es gibt zwei Folgen von Spamversand über ein Mailformular. Die
> > größte Gefahr ist, daß ein Spammer über Dein Mailformular Spam an
> > Dritte verschickt. Das muß unbedingt unterbunden werden, was auch
> > nicht so schwierig ist.
>
> Für einen Profi wie Dich vielleicht nicht, aber für einen Anfänger
> wie mich schon. Da muss man das Weiterleiten-Feld blockieren, oder?
> Aber wie macht man das mit PHP?

Im Prinzip reicht dafür, alle Felder zu durchlaufen und mit stripos() 
auf die fraglichen Elemente, "TO:", "CC:" und "BCC", zu prüfen. Noch 
einfacher, wie schon in einer meiner letzten Mails erwähnt: Einfach 
alle \r und \n rausschmeißen, die da nichts zu suchen haben.

> > Daneben besteht natürlich die Möglichkeit, daß die im
> > Mailformular hinterlegte Kontaktadresse selbst mit Spam zugemüllt
> > wird, wenn wieder ein Spambot versucht, automatisch über das
> > Mailformular Spam an Dritte zu versenden. Auch das läßt sich aber
> > weitgehend in den Griff kriegen. Solche Spamversuche haben oft
> > eindeutige Merkmale, z.B. findest Du plötzlich in einem Feld eine
> > Eingabe, die "Content-Type: multipart/alternative;" enthält oder
> > einen Link. Auch werden Felder wie Vorname, Nachname,
> > Absenderadresse, Ort, Land etc. gerne mit demselben Wert belegt.
> > Mit den Kriterien wirst Du weit über 90% der Spamversuche erkennen
> > können.
>
> Solche Abfragen gibt es bestimmt schon irgendwo im Netz, oder? Hast
> Du oder jemand anders da eine Adresse wo man diese findet?

Ich glaube nicht, das sowas im Netz zu finden ist, weil ich mir das 
selbst ausgedacht habe. Im Prinzip ist das aber hier genauso einfach, 
wie oben. Durchlaufe alle Felder und prüfe mit stripos() 
auf "Content-Type: multipart/alternative;" etc. Außerdem merkst Du Dir 
den Inhalt aller Felder und guckst, ob zwei oder mehr Felder denselben 
Inhalt haben. Letzteres geht z.B., indem Du einen Array anlegst, in den 
Du jeden Feldwert hineinschreibst. Am Ende zählst Du mit count() die 
Elemente, wendest dann array-unique() auf den Array an, ermittelst dann 
erneut mit count() die Anzahl der Elemente und vergleichst abschließend 
beide Zählungen. Gibt es eine Differenz von 1 oder größer, liegt ein 
Spamversuch nahe. Je größer die Differenz, desto wahrscheinlicher ist 
es.

> > Es ist natürlich ratsam, für das Mailformular eine gesonderte
> > Mailadresse zu verwenden, allerdings spielt das hinsichtlich des
> > Spams über das Formular keine Rolle, weil die Adresse ja nur intern
> > im Skript steht und nach außen nicht sichtbar wird.
>
> Das verstehe ich jetzt nicht so ganz, bis jetzt war ich in dem
> Glauben, dass wenn die E-Mail des Empfängers nicht auf der Webseite
> steht, bzw. erscheint, könne darauf kein Spam versandt werden. Aber
> das scheint ja nicht zu stimmen. So wie ich Dich und andere jetzt
> verstanden habe, geht das sehr wohl, auch wenn die
> Empfängermail-Adresse im PHP-Programm steht.

Genau. Und zwar durch die Einschleusung von Mail-Headern über die 
übrigen Formularfelder mittels "BCC:" etc. Deswegen mußt Du auch 
sorgfältig darauf prüfen.

Es gibt dazu eine aktuelle Lektüre:
http://www.php-security.org/MOPB/MOPB-34-2007.html

Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive