Formmailer mit html-Formular auf einem Server, php-Skript auf einem anderen

M

marian

Mitglied
Thread Starter
Dabei seit
04.11.2002
Beiträge
57
Reaktionspunkte
0
Hallo,

ich betreue eine kleine Homepage eines kleines Vereins. Diese Homepage befindet sich auf einem Server der nicht php-fähig ist (leider ist der Vertrag auch so dass absehbar die Homepage weiterhin auf dem Server bleibt). Die Email-Adressen die in der Homepage auftauchen sind auch nach dem Motto:
HTML:
<a href="mailto:name@provider.net" rel="self">Name</a>
Ich selber habe ein Vertrag mit einem Provider der mir ein php-fähigen Server zur Verfügung stellt.
Da in der letzten Zeit vermehrt Spam bei den Email-Adressen des Vereins aufkommt, habe mir gedacht ein Formmailer zu benutzen wo ein Kontakt-Formular auf der Seite des Homepage in als html sich befindet aber "in Verbindung" mit dem php-Skript auf einem anderen Server steht.
Damit hoffe ich etwas aus der "Hartnäckigkeit" einigen Roboter zu nehmen (da ich ein Anfänger in Web-Programmierung bin, viellleicht bleibt meine Hoffnung nur in Hoffnung-Stadium).
Ich suche also ein fertigen Skript der lizenzfrei ist und diese Möglichkeit bietet.

Gesetzt der Fall dass so ein Skript existiert, habe ich noch eine Frage:
die Problematik Spam und Roboter hat zwei Aspekte (so wie ich verstehe):
1. Sicherheit des Skripts im Bezug auf seiner Manipulierung für Massen-Spam nach aussen (von irgendwelchen Roboter entarnt und ausgenutzt fürs Versenden des Spam in die "weite Welt").
2. "gewisse" Sicherheit des Skripts im Bezug auf Entdeckung der Email-Adresse wo die Emails gelangen sollen (und dadurch auch weiterhin Spam an dieser Adresse schickt).
Was für Sicherheitsmassnahmen sollen für den ersten Punkt getroffen werden?
Ist für den zweiten Punkt ein Skript empfehlenswert der die Adresse in der php-Code als name@provider.net auftaucht oder könnte man sie auch als
HTML:
&# 110;&# 97;&# 109;&# 101;&# 64;&# 112;&# 114;&# 111;&# 118;&# 105;&# 100;&# 101;&# 114;&# 46;&# 110;&# 101;&# 116;
eingeben oder vielleicht noch besser in einer .txt-Datei woher der Skript die Variablen sich holt?

Ich bedanke mich für Eueren Antworten und Ratschlägen,
marian
 
Aus einem normalen formmailer kann ein Spamroboter keine eMail-Adresse auslesen. Die steht ja erst in der PHP-Datei, die auf dem Server ausgewertet wird.

Ein bestimmtes Mailskript kann ich nicht empfehlen, gibt's wie Sand am Meer. Ich wär für schnell selbst skripten.

Von DMS habe ich folgendes Skript, eMails einigermaßen zu verschlüsseln:

Code:
<head>
	<script type="text/javascript">
   function genmail(no1,no2,no3) {
      document.write('<a href="mailto:'+no1+'@'+no2+'.'+no3+'">'+no1+'@'+no2+'.'+no3+'</a>');
   }
</head>
<body>
<script type="text/javascript">genmail('name','domain','de');</script>
</body>

<noscript>
   <div style="display:inline;">na<span style="display:none;">unsichtbar</span>me@doma<span style="display:none;">unsichtbar</span>in.<span style="display:none;">unsichtbar</span>de</div>
</noscript>
[…]

Für den schnellen Schutz zwischendurch sicher brauchbar.
 
Jakob schrieb:
Aus einem normalen formmailer kann ein Spamroboter keine eMail-Adresse auslesen. Die steht ja erst in der PHP-Datei, die auf dem Server ausgewertet wird.

Ein bestimmtes Mailskript kann ich nicht empfehlen, gibt's wie Sand am Meer.
Danke Jakob. Inzwischen habe ich mich auf die Suche und bei http://thedemosite.co.uk/phpformmailer/ den PHP Form Mailer gefunden.
Es funktioniert in seinem Ursprungsform sehr gut. Da die Lizenz frei ist, hätte ich noch zwei Fragen:
1. nach dem Abschicken des Formulars, es wird verbunden mit dem php-fähigen Server und der Skript im Gang gesetzt. In dem original Skript gibt es als "Danke schön" folgendes Code-Stück:
HTML:
$success_sent_msg='<p align="center"><strong>&nbsp;</strong></p>
                   <p align="center"><strong>Your message has been successfully sent to us<br>
                   </strong> and we will reply as soon as possible.</p>
                   <p align="center">A copy of your query has been sent to you.</p>
                   <p align="center">Thank you for contacting us.</p>';
Die obere Meldung kommt allerdings unter der Adresse des Servers wo der Skript sich befindet und der User verlässt so gesehen die Homepage. Da diese HP die HP eines Vereins gehört muss ich damit rechnen dass einige Users nicht so versiert sind und sie werden verunsichert sein (auch wenn die Meldung in deutsch wäre, was ich wohl machen werde wenn keine andere Möglichkeit es gibt). Gibt es eine Möglichkeit das beim erfolgreichen Email-Versand eine "Danke schön"-Seite aus der Homepage zu erscheinen?

2. In wieweit ist es möglich dass dem Skript einige Variablen eingefügt werden können die dem Adressat einiges über die Umgebung des Anwenders mitteillt (u. U. der Anwender soll auf der Formular-Seite über diese Möglichkeit informiert werden) wie:
Browser-Software, IP-Adresse, Hostname des Anwenders, Zeit

Ich bedanke mich im Voraus für die Hilfe. Leider kenne ich mich mit der Programmierung allegemein nicht aus, mit php noch weniger :( . In etwa verstehe ich in dem Code einiges, aber mehr auch nicht.

Noch einen schönen Tag,
marian
 
Hab jetzt nur schnell drübergeschaut aber probier mal in der fast letzten Zeile
PHP:
echo $success_sent_msg;
durch
PHP:
header("Location: http://www.deineDomain.de/ordner/dankeDatei.html");
zu ersetzen. Dieser Befehl leitet Deine User wieder auf Deinen Server. Du kannst eine eigene Danke-Datei erstellen.

Das Weiterleiten funktioniert bloß, wenn sonst nichts anderes auf der PHP-Seite ausgegeben wird.
 
Danke Jakob, es funktioniert sehr gut.

Vielleicht hat jemand auch ein Tipp für die Variablen Browser-Software, IP-Adresse, Hostname des Anwenders, Zeit der Absendung die man in php-Skript einbauen könnte um sie dem Adressaten mitgeteillt werden kann.

Danke,
marian
 
marian schrieb:
Danke Jakob, es funktioniert sehr gut.

Vielleicht hat jemand auch ein Tipp für die Variablen Browser-Software, IP-Adresse, Hostname des Anwenders, Zeit der Absendung die man in php-Skript einbauen könnte um sie dem Adressaten mitgeteillt werden kann.

Danke,
marian

Diese Werte findest Du im superglobalen Feld »$_SERVER«. Welche für Dich verfügbar sind, siehst Du auch bequem per »phpinfo()«. Hier nur eine kleine Auswahl:
PHP:
$_SERVER["REMOTE_ADDR"]
// zum Beispiel: 192.168.0.20

$_SERVER["HTTP_USER_AGENT"]
// zum Beispiel: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de-de) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3

$_SERVER["HTTP_REFERER"]
// zum Beispiel: http://www.google.de/
 
Hi,

mit dem PHP-Befehl gethostbyaddr() kannst Du Dir auch den zugehörigen Hostnamen anzeigen lassen.
Manchmal kannst Du aber auch HTTP_X_FORWARDED_FOR abfragen.

Viele Grüße
 
Hallo,

ich bedanke mich sehr an Euch. Ihre Tipps konnte ich nach einigen Versuchen in den php-Skript einbauen. Ich habe noch:
1.
Code:
$ip = $_SERVER["REMOTE_ADDR"];
$host = @gethostbyaddr($_SERVER["REMOTE_ADDR"]);
$client = $_SERVER["HTTP_USER_AGENT"];
2. in der "Antwort"-Email nach der Kopie:
Code:
Ihre IP-Adresse: $ip ($host)
Ihr Client: $client
3. für den Adressat:
Code:
$themessage = "Name: $name \nIP: $ip ($host) \nClient: $client \nNachricht: $themessage";
eingefügt.

Es funktioniert sehr gut. Nochmal vielen Dank!

Ich hatte vergessen noch zu fragen woran es liegen könnte dass die Nachrichten die den Adressat und den Anwender erreichen (dem letzten als Bestätigung) in Kleinbuchstaben geschrieben werden. Bei alle meinen Tests wurden die Wörter die groß geschrieben waren in klein gesendet. Allerdings als ich Umlaute in Großbuchstaben geschrieben habe sind sie richtig gesendet.

Da ich nicht Ahnung mit den php Applikationen habe aber wie ich verstehe auf dem Server wo die php Dateien vorliegen "etwas" schon passiert und vielleicht "was" passiert im Zusammenhang mit den Rechten die diese Dateien (und die Ordner wo sie sich befinden) auf dem Server haben, würde ich noch fragen, wenn das nicht offtopic ist, was für Rechte diese Dateien haben müssen. Denke natürlich an einem eventuellen Misbrauch (aus dem html Code kann man schon lesen wo die php Datei liegt und dann sie vielleicht ändern?).

Danke Euch wiedermals,
marian
 
marian schrieb:
Hallo,

ich bedanke mich sehr an Euch. Ihre Tipps konnte ich nach einigen Versuchen in den php-Skript einbauen. Ich habe noch:
1.
Code:
$ip = $_SERVER["REMOTE_ADDR"];
$host = @gethostbyaddr($_SERVER["REMOTE_ADDR"]);
$client = $_SERVER["HTTP_USER_AGENT"];
2. in der "Antwort"-Email nach der Kopie:
Code:
Ihre IP-Adresse: $ip ($host)
Ihr Client: $client
3. für den Adressat:
Code:
$themessage = "Name: $name \nIP: $ip ($host) \nClient: $client \nNachricht: $themessage";
eingefügt.

Es funktioniert sehr gut. Nochmal vielen Dank!

Ich hatte vergessen noch zu fragen woran es liegen könnte dass die Nachrichten die den Adressat und den Anwender erreichen (dem letzten als Bestätigung) in Kleinbuchstaben geschrieben werden. Bei alle meinen Tests wurden die Wörter die groß geschrieben waren in klein gesendet. Allerdings als ich Umlaute in Großbuchstaben geschrieben habe sind sie richtig gesendet.

*knifflig*
marian schrieb:
Da ich nicht Ahnung mit den php Applikationen habe aber wie ich verstehe auf dem Server wo die php Dateien vorliegen "etwas" schon passiert und vielleicht "was" passiert im Zusammenhang mit den Rechten die diese Dateien (und die Ordner wo sie sich befinden) auf dem Server haben, würde ich noch fragen, wenn das nicht offtopic ist, was für Rechte diese Dateien haben müssen. Denke natürlich an einem eventuellen Misbrauch (aus dem html Code kann man schon lesen wo die php Datei liegt und dann sie vielleicht ändern?).

Danke Euch wiedermals,
marian

In der Regel benötigen die PHP-Skripte keine speziellen Rechte (also 644), da sie nicht wirklich direkt ausgeführt werden, sondern mit Hilfe des PHP-Interpreters und des Apache-HTTP-Servers umgesetzt werden (dies gilt, solange PHP nicht als CGI installiert ist, was inzwischen unüblich geworden ist).
 
Hallo Hilarious,

danke für die Tipps, habe ich gleich umgesetzt.

Was die Kleinbuchstaben betrifft, habe ich nach einigen Funktionen aus dem Code in Google gesucht und ich bin auf dem folgenden String fundig:
Code:
return preg_replace($patterns, "", strtolower($value));
Über strtolower steht in php Manual: Setzt einen String in Kleinbuchstaben um.
Allerdings es kommen mehrere Fehlermeldung wenn ich diese Funktion aus dem String rausnehme: viermal Wrong parameter count for preg_replace() für die Zeile 28 und eine Cannot modify header information - headers already sent by... für die Zeile 41 (wo eigentlich header("Location: http://www.deineDomain.de/ordner/dankeDatei.html"); steht)
Diese Code-Zeile (return preg_replace($patterns, "", strtolower($value));) bezieht sich für die anderen die davor sind (wie ich vermute, deswegen kopiere ich die ganze Stelle:
Code:
//clean input in case of header injection attempts!
function clean_input_4email($value, $check_all_patterns = true)
{
 $patterns[0] = '/content-type:/';
 $patterns[1] = '/to:/';
 $patterns[2] = '/cc:/';
 $patterns[3] = '/bcc:/';
 if ($check_all_patterns)
 {
  $patterns[4] = '/\r/';
  $patterns[5] = '/\n/';
  $patterns[6] = '/%0a/';
  $patterns[7] = '/%0d/';
 }
 //NOTE: can use str_ireplace as this is case insensitive but only available on PHP version 5.0.
 return preg_replace($patterns, "", strtolower($value));
}

$name = clean_input_4email($_POST["name"]);
$email = clean_input_4email($_POST["email"]);
$thesubject = clean_input_4email($_POST["thesubject"]);
$themessage = clean_input_4email($_POST["themessage"], false);

$error_msg='ERROR - not sent. Try again.';
Hilarious, das meintest Du dass es knifflig ist?

Alles was Ihr mir bis jetzt geraten habt, konnte ich irgendwie ein bißchen verstehen, allerdings jetzt in diesem Teil des Codes, da ich von php Syntax keine Ahnung habe (und nicht nur davon :) ) verstehe ich nicht was der Entwickler eigentlich davor wollte damit das ganze in Kleinbuchstaben umgewandelt werden soll.
Vielleicht hat jemand trotzdem ein Rat.

Danke,
marian
 
marian schrieb:
Hallo Hilarious,

danke für die Tipps, habe ich gleich umgesetzt.

<...>
Hilarious, das meintest Du dass es knifflig ist?

Alles was Ihr mir bis jetzt geraten habt, konnte ich irgendwie ein bißchen verstehen, allerdings jetzt in diesem Teil des Codes, da ich von php Syntax keine Ahnung habe (und nicht nur davon :) ) verstehe ich nicht was der Entwickler eigentlich davor wollte damit das ganze in Kleinbuchstaben umgewandelt werden soll.
Vielleicht hat jemand trotzdem ein Rat.

Danke,
marian

Kein Problem. Die von Dir zitierte Methode sucht und ersetzt bestimmte Platzhalter. Tatsächlich ist das »strtolower« für die konsequente Kleinschreibung verantwortlich.

Die Problematik lässt sich leicht beheben indem Du statt »return preg_replace($patterns, "", strtolower($value));« nur die folgende Variante stattdessen verwendest:
Code:
return preg_replace(strtolower($patterns), "",$value);
Hier ist nämlich ein kleiner Bug versteckt gewesen. Ich nehme an, es sollten die Platzhalter sowohl klein als auch groß geschrieben erkannt werden. Zwar kann man dies eleganter, aber diese kleine Änderung macht es für Dich am einfachsten.
 
Danke Hilarious,

leider bekomme ich Fehlermeldungen: Warning: preg_replace(): Delimiter must not be alphanumeric or backslash in /............ on line 28 (vier davon) und noch Cannot modify header information - headers already sent by ....... on line 41
No recipient addresses found in header

marian
 
Bei dieser Fehlermeldung stört er sich an den Begrenzungszeichen (in diesem Fall »/«), die in dem Array »patterns« verwendet werden. In vielen Fällen ist der Schrägstrich kein Problem, macht aber dann Ärger, wenn die Eingabe selbst einen Schrägstrich enthält (dann kommt er aus dem Tritt). Abhilfe könnte sein hier statt dem Schrägstrich ein Grad-Zeichen zu verwenden (, was noch seltener vorkommt). Also zum Beispiel »$patterns[0] = '°content-type:°';« statt »$patterns[0] = '/content-type:/';«. Dabei ist nur darauf zu achten, dass der Texteditor die gleiche Kodierung verwendet, wie Dein Server.
 
Danke Hilarious für Deine Antwort,
leider hatte ich absolut keine Zeit die Sachen zu ändern. Habe heute getan. Von / oder ° in Patterns war kein Problem. Die alte Formel - return preg_replace($patterns, "", strtolower($value)); - funktionierte weiter hin tadellos: sie hat weiterhin alle Großbuchstaben in Kleinbuchstaben umgewandelt. Dein Vorschlag - return preg_replace(strtolower($patterns), "",$value); - gibt weiter die vier Fehlermeldungen: Delimiter must not be alphanumeric or backslash in.... on line 28.
Ich habe die Änderungen (von / zu °) mit Transmit durchgeführt. Transmit codiert Westlich (ISO Latin 1). Was der Server tut, habe keine Ahnung, aber ich habe in der Bildergalerie geschaut wo für den Administrator ein phpinfo zur verfügung steht und alle codierungen die ich da gefunden habe waren ISO-8859-1.

An der ganzen Sache, würde mich absolut nichts stören. Die einzige Sache ist dass andere wildfremde Menschen bekommen deren selbstgeschriebene Emails zurück als Bestätigung. Und da taucht alles in Kleinbuchstaben.

Noch einen schönen Abend!
marian
 
marian schrieb:
Danke Hilarious für Deine Antwort,
leider hatte ich absolut keine Zeit die Sachen zu ändern. Habe heute getan. Von / oder ° in Patterns war kein Problem. Die alte Formel - return preg_replace($patterns, "", strtolower($value)); - funktionierte weiter hin tadellos: sie hat weiterhin alle Großbuchstaben in Kleinbuchstaben umgewandelt. Dein Vorschlag - return preg_replace(strtolower($patterns), "",$value); - gibt weiter die vier Fehlermeldungen: Delimiter must not be alphanumeric or backslash in.... on line 28.
Ich habe die Änderungen (von / zu °) mit Transmit durchgeführt. Transmit codiert Westlich (ISO Latin 1). Was der Server tut, habe keine Ahnung, aber ich habe in der Bildergalerie geschaut wo für den Administrator ein phpinfo zur verfügung steht und alle codierungen die ich da gefunden habe waren ISO-8859-1.

An der ganzen Sache, würde mich absolut nichts stören. Die einzige Sache ist dass andere wildfremde Menschen bekommen deren selbstgeschriebene Emails zurück als Bestätigung. Und da taucht alles in Kleinbuchstaben.

Noch einen schönen Abend!
marian

Marian,

ich glaube, da habe ich einen kleinen Fehler eingebaut, den ich erst jetzt gesehen habe: Das »strtolower« macht das Problem. Wenn Du jedem Pattern ein »i« hinzufügst, ist der Effekt erzielt, den der Programmierer wohl erreichen wollte:
Code:
// Bei den Pattern folgt noch ein 'i' fuer 'incasesensitive':
// ...
 $patterns[0] = '/content-type:/i';
 $patterns[1] = '/to:/i';
 $patterns[2] = '/cc:/i';
 $patterns[3] = '/bcc:/i';
 if ($check_all_patterns)
 {
  $patterns[4] = '/\r/';
  $patterns[5] = '/\n/';
  $patterns[6] = '/%0a/i';
  $patterns[7] = '/%0d/i';
 }
// ...
// Und dann dies:
return preg_replace($patterns, "", ($value));

Nun sollte es weder Änderungen an der Schreibweise der E-Mail geben, noch Fehlermeldungen und Warnungen.
 
@ marian

Hi,

Transmit sollte die Daten nur übertragen, mir ist nicht bekannt, das Transmit nur Latin1 kann, da ich auch einige Dateien in Latin2 habe und die werden ohne Probleme übertragen, da Transmit ja nicht den Dateiinhalt verändert.

Entschuldige, mein Beitrag schweift vom Thema ab ;) Daher nun zurück. :)

Viele Grüße
 
Guten Morgen!

Danke Hilarious! Funktioniert wunderbar!

mikne21: wie Du in den ganzem Thread bemerkt hast, ich verstehe von Programmieren allegemein wenig. Das auf der anderen Seite ein Server ist und u.U. auch eine andere Kodierung verwendet hätte ich mir davor sicherlich denken können aber bewust war mir nicht. Aus diesem Grund die Änderungen in dem Quelltext die ich online mit Transmit gemacht habe wurden immer ohne diese Hintergrundgedanke getan. Dass ich von Hilarious auf diesm Punkt aufmerksam gemacht worden bin, habe ich einfach die Textcodierung angeschaut und war auf ISO Latin 1. Eine ganze Latte von anderen Kodierunngen sind da schon aufgeführt. Ich nehme an dass sie eigentlich auf die Textänderungen die gemacht werden sich beziehen und nicht auf die Übertragung (aber es kann sein dass ich alles jetzt durcheinander bringe).

Ich wünsche Euch auch einen sonnigen Sonntag!
marian
 
Zurück
Oben Unten