spam und nonsense mail
Christian
- php
0 wahsaga0 Tobias Unger0 hkl0 Tobias Unger0 Christian0 Tobias Unger0 Christian0 Tobias Unger
Ich habe ein Formular im Internet, über das immer wieder mit Antworten mit ungebetenem Inhalt bei mir landen. Kostprobe weiter unten.
http://www.lichtblick-heiden.ch/kontakt.php
Meine Frage: Wie kann ich verhindern, solchen Müll zu erhalten.
Die Felder Name, email und Mitteilung sind zwingend.
Herzlichen Dank für dein Bemühen.
Christian
*********************************************************
Anrede:
Vorname: http6277@lichtblick-heiden.ch
Name: http6277@lichtblick-heiden.ch
Strasse: http6277@lichtblick-heiden.ch
Postleitzahl: tates
Content-Type: multipart/alternative;
boundary=3418cab2d328028281ace5352b727cb3
X-Mailer: Microsoft Outlook, Build 10.0.2616
Subject: microwave for a
to: sk8terbob32@aol.com,osu1234@aol.com,cocoflavorxx@aol.com,
blkgangsta@aol.com,gs61100193008@aol.com,dinotto2@aol.com,
mobydicg@aol.com
--3418cab2d328028281ace5352b727cb3
Content-Transfer-Encoding: 7bit
Content-Type: text/plain
are inferior, as they are already saturated with weak brine. read may be
fried in the
--3418cab2d328028281ace5352b727cb3
Content-Transfer-Encoding: base64
Content-Type: text/plain
d2hpY2ggdGhlcmVmb3JlIHNocmlua3MgYW5kIGN1cmxzIHNvbWV3aGF0LiBoaXMgcmVkdWNlcyBj
b250YWN0IHdpdGggdGhlIHBhbiwgc28gdGhlIGNvb2sgaGFzIHRvIGJlIHByZXNlbnQgdG8gZnJl
cXVlbnRseSBwcmVzcyB0aGUgcmFzaGVycyBhZ2FpbnN0IHRoZSBwYW4gYW5kIG1vdmUgdGhlbSBh
cm91bmQuIGhpcyBwcm9ibGVtIGlzIG1vcmU=
--3418cab2d328028281ace5352b727cb3--
.
Ort: http6277@lichtblick-heiden.ch
land:
e-mail: http6277@lichtblick-heiden.ch
Telefon: http6277@lichtblick-heiden.ch
Mitteilung: http6277@lichtblick-heiden.ch
hi,
Meine Frage: Wie kann ich verhindern, solchen Müll zu erhalten.
In dem du zuerst mal ganz klar definierst, was als "Müll" betrachtet werden, und was durchkommen soll.
Und zwar so, dass es sich in einen Erkennungsalgorithmus überführen lässt - die Definition "solcher Müll" ist dafür zu schwamming.
gruß,
wahsaga
hallo
ich dachte man könnte das Forum benützen, ohne 15 Jahre Informatik studiert zu haben.
Die Antwort
Und zwar so, dass es sich in einen Erkennungsalgorithmus überführen lässt - die Definition "solcher Müll" ist dafür zu schwamming.
in Ehren, aber wirklich weiterbringen tut sie mich leider nicht, dafür ist sie mir zu theoretisch.
Definition von zu theoretisch:
zu wenig praxisorientiert für Laien wie mich.
Christian
echo $begrüßung;
ich dachte man könnte das Forum benützen, ohne 15 Jahre Informatik studiert zu haben.
Das kann man auch. "Wir" helfen dir dabei die Lösung zu finden, es ist hier allerdings nicht üblich, Lösungen auf dem Silbertablett zu servieren.
Die Antwort
Und zwar so, dass es sich in einen Erkennungsalgorithmus überführen lässt - die Definition "solcher Müll" ist dafür zu schwamming.
in Ehren, aber wirklich weiterbringen tut sie mich leider nicht, dafür ist sie mir zu theoretisch.
Definition von zu theoretisch:
zu wenig praxisorientiert für Laien wie mich.
Dann versuche ich mal etwas Praxis ins Problem zu bekommen. Fällt dir an deinem Beispiel nichts auf, was ein menschlicher Benutzer anders machen würde als der Spam-Bot? Ich kenne zum Beispiel keine Leute, die ein @ oder Ziffern in ihrem Namen tragen. Die meisten haben Buchstaben (teilweise mit Umlauten und anderen Akzenten) und einige wenige zusätzlich noch Bindestrich(e) und Leerzeichen. Daran könnte man zumindest dein Beispiel als Spam entlarven.
echo "$verabschiedung $name";
echo $begrüßung;
Danke für dein Bemühen, mir etwas Logik nahezubringen. Ich muss leider feststellen wie wenig ich wirklich selbst in php umsetzen kann.
Gerne hätte ich eine Lösung für:
Wenn $name das Zeichen @ oder eine Ziffer enthält, dann
$fehler=true;
Er tuts auch ein rostiges Tablett.
Schöne Grüsse
Christian
echo $begrüßung;
Gerne hätte ich eine Lösung für:
Wenn $name das Zeichen @ oder eine Ziffer enthält, dann
$fehler=true;
Für jede Programmiersprache [1] gibt es Bibliotheken mit Stringfunktionen, da Stringverarbeitung eine grundlegende Funktionalität für die meisten Programme ist. Zwei Funktionen, die mir bisher stets begegnet sind, heißen substr und strpos, oder tragen ähnliche Namen. Mit der ersten erhält man Teile eines String, mit der zweiten findet man die Position von einem Zeichen oder einer Zeichenkette in einer anderen. Letztere ist diejenige, die du benötigst.
Wenn die PHP-Funktion strpos() einen Wert zurückgibt, der eine Positionsangabe darstellt, ist der gesuchte String im zu durchsuchenden String enthalten. Die genaue Position ist in deinem Fall nicht wichtig, du musst nur wissen, ob enthalten oder nicht. Ein Blick in die Handbuchseite zu strpos() offenbart sogar ein Anwendungsbeispiel für deinen Fall.
Das @ ist aber nur eines der Zeichen, die in einem Namen mit ausreichender Wahrscheinlichkeit nicht vorkommen. Es ist auch besser, nicht alle verbotenen Zeichen herauszufischen, sondern die Anzahl der erlaubten Zeichen einzuschränken.
Mit den Character Type Functions sucht man String nach erlaubten Zeichen ab. Doch von denen hilft uns leider keine so richtig weiter [2], da sie sich nicht kombinieren oder erweitern lassen. Erlaubt sind ja Buchstaben, das Leerzeichen und der Bindestrich. Ein sehr mächtiges Werkezeug, das man nur einsetzen sollte, wenn man mit gewöhnlichen Stringfunktionen nicht weiterkommt, sind Reguläre Ausdrücke.
Wir suchen zwischen Anfang ^ und Ende $ [3] des zu prüfenden Strings Buchstaben A-Z und a-z, Bindestrich und Leerzeichen, und das ein bis mehrmals wiederholt +. Das Suchmuster sieht dann so aus.
[1]+$
Die eckigen Klammern bilden mit ihrem Inhalt eine so genannte Zeichenklasse. Damit werden mehrere Zeichen zusammengefasst. Beachte den Bindestrich. Mit ihm kann man Bereiche festlegen. Nur wenn er am Ende oder am Anfang der Zeichenklasse steht, steht er für sich selbst. Alternativ kann man ihm auch einen Backslash voranstellen und dann auch irgendwo anders platzieren. Fehlen nur noch ein paar Umlaute und vielleicht noch ein é, wenn du dich auf die gebräuchlichsten Zeichen des deutschen Sprachraum beschränken möchtest. Ansonsten musst du eben noch weitere Zeichen hinzufügen.
Außerdem braucht ein Regulärer Ausdruck noch Begrenzungszeichen, wofür oftmals Schrägstriche verwendet werden. Zusammengefasst und in PHP-Code gegossen ergibt sich:
if ([link:http://de.php.net/manual/en/function.preg-match.php@title=preg_match]('/^[A-Za-zäöüßÄÖÜé -]+$/', $_POST['...']))
// erlaubt
else
// komischer Name
Man könnte das Suchmuster auch noch verfeinern. Großbuchstaben sind meist nur am Wortanfang anzutreffen, Bindestriche nur zwischen Wörtern, usw. aber das macht den Suchausdruck nur komplexer ohne das Kosten-Nutzen-Verhältnis großartig zu verbessern.
Er tuts auch ein rostiges Tablett.
Oh, mit Altmetall handle ich für gewöhnlich nicht. :-)
echo "$verabschiedung $name";
[1] jedenfalls für die erstzunehmenden
[2] Manchmal hat der Hoster diese Funktionen auch gar nicht mit installiert.
[3] Ohne ^ und $ wird nur geprüft, ob das Suchmuster irgendwo im String anzutreffen ist.
A-Za-z - ↩︎
Hallo
Dein Tablett ist mindestens aus einer Platinlegierung.
Der Code sieht nun folgendermassen aus:
if (empty($_POST['name'])or !preg_match('/[1]+$/', $_POST['name'])) {
$fehler=true;
$fehlertext.="Geben Sie bitte Ihren Namen an!<br>\n";
}
und funktioniert.
Herrlich
Herzlichen Dank für die ausführliche Erklärung.
Christian
A-Za-zäöüßÄÖÜé - ↩︎
Hi!
Ich habe ein Formular im Internet, über das immer wieder mit Antworten mit ungebetenem Inhalt bei mir landen.
Kenne ich...
Versucht wird natürlich, fremde Kontaktformulare zu missbrauchen um über fremde Server Spam zu versenden.
Meine Frage: Wie kann ich verhindern, solchen Müll zu erhalten.
Die Felder Name, email und Mitteilung sind zwingend.
Es gibt viele Möglichkeiten, unter anderem:
Grüße aus Nürnberg,
Tobias
Hallo Christian !
[...]
Die Felder Name, email und Mitteilung sind zwingend.
[...]
Deinen Beitrag hab ich so verstanden :
Die Mails um die es geht sind solche, und nur solche,
die ueber das Formular auf Deiner Webseite 'eingegeben'
werden. 'Eingeben' soll hier heissen, dass eine
menschliche oder anderweitige Interaktion ( z.B. eines
SPAM-Programmes) mit genau jenem Formular zum Entstehen
der Mail gefuehrt hat
war das so zu verstehen ?
Da ist naemlich MS Outlook als E-Mail Programm
zu ersehen ! (?)
Ferner sind solche Mails oft semantisch falsch
und/oder fremdsprachlich und/oder weisen starke
semantische Uebereinstimmungen in den Pflichtfeldern
auf
war das so zu verstehen oder handelt es sich um ein
konstruiertes Beispiel ?
Loesungsansatz:
Wenn die "Mails" ueberwiegend von Programmen "versandt"
werden - die Anfuehrungszeichen wg. des Formulars
als Quelle - koenntest Du eine kleine Graphik einbinden
inder eine zufaellige Buchstaben / Zahlen - Kombination
graphisch dargestellt wird.
Das sieht aehnlich aus wie bei einem Sehtest auf
Farbsichtigkeit.
Erst wenn der - menschliche !- Benutzer diese
Kombination korrekt erkannt und eingegeben hat wird die
Form verarbeitet und die Mail erstellt.
Ein Automat sollte da scheitern.
Habe das schon oft gesehen; kenne aber keinen gaengigen
Begriff dafuer.
=> Google (Spamschutz, Formular, Post, Zufall...)
Gegen menschlich Spammer koenntest Du den Inhalt der
Mail gegen ein deutsches Dictionary pruefen - Deine
Seite ist in deutscher Sprache gehalten, also
sollten die meisten Begriffe erkennbar sein
=> Google ( Dictionary, Lexikalisch, Semantisch, Analyse
Scanner, flex, lex, ispell, Thesaurus... )
Dann gibt es noch die Moeglichkeit, Strassen und
Postleitzahlen zu pruefen - bei freenet.de wird
bei der Anmeldung eines neuen Kontos die Benutzereingabe
gegen Postleitzahlen und Staedte geprueft.
---
Hoffe, dass da 'ne Idee dabei war
Gruss
Holger
P.S.: Deine Site find ich hubsch !
Hi!
[...] koenntest Du eine kleine Graphik einbinden
inder eine zufaellige Buchstaben / Zahlen - Kombination
graphisch dargestellt wird.[...]
Habe das schon oft gesehen; kenne aber keinen gaengigen
Begriff dafuer.
Captcha (wie in meinem Beitrag von eben erwähnt ;-) ).
Gegen menschlich Spammer koenntest Du den Inhalt der
Mail gegen ein deutsches Dictionary pruefen - Deine
Seite ist in deutscher Sprache gehalten, also
sollten die meisten Begriffe erkennbar sein
=> Google ( Dictionary, Lexikalisch, Semantisch, Analyse
Scanner, flex, lex, ispell, Thesaurus... )
Damit würde man allerdings fremdsprachiges Feedback ausschließen - was ich persönlich nicht tun würde, da ich bereits solches erhalten habe.
Außerdem halte ich es für extrem unwahrscheinlich, dass sich jemand die Mühe macht, solche Formulare mit Müll zu füllen und Captchas zu erkennen wenn es genug Seiten gibt, auf denen das nicht nötig ist (sprich wo das ein Bot auch machen kann).
Dann gibt es noch die Moeglichkeit, Strassen und
Postleitzahlen zu pruefen - bei freenet.de wird
bei der Anmeldung eines neuen Kontos die Benutzereingabe
gegen Postleitzahlen und Staedte geprueft.
Schufa Anfrage wäre auch noch ganz praktisch - so wie bei Ebay.
Und wenn sich die Identität so nicht prüfen lässt kann man ja nen Brief senden - Ebay macht das ja auch ;-) .
Und wenn schon - dann würde ich, wäre ich ein Spammer, halt eine Adresse angeben...
Sprich: Das ist sicherlich ein Ansatz, für das Problem halte ich ihn allerdings für etwas übertrieben.
Grüße aus Nürnberg,
Tobias
Holger !
Vielen Dank für die vielen Vorschläge.
Das angeführte Beispiel war echt und ähnliche kommen zur Zeit täglich an.
Deinen Vorschlag mit Überprüfung der PLZ auf Zahlen finde ich hilfreich.
Weisst du, wie man in PHP überprüft, ob eine Variable nur aus Zahlen besteht?
Herzliche Grüsse
Christian
Hi!
Weisst du, wie man in PHP überprüft, ob eine Variable nur aus Zahlen besteht?
Es gibt verschiedene Möglichkeiten, zwei davon findest du hier.
Grüße aus Nürnberg,
Tobias
Hallo
Danke für den Link. Leider funktioniert es immer noch nicht ganz.
Ich möchte gerne folgendes formulieren:
Wenn das Feld plz nicht leer ist und anderes wie Ziffern drinstehen, dann ist $fehler=true;
Mein Versuch klappt leider nicht: Weisst du den Grund?
if($_POST['plz']!="" && !is_integer($_POST['plz'])){
$fehler=true;
$fehlertext.="Überprüfen Sie bitte Ihre Postleitzahl!<br>\n";
}
Ich hoffe, dir stehen nicht die Haare zu Berge aufgrund so viel Unvermögens.
Herzlich
Christian
Hi!
Mein Versuch klappt leider nicht: Weisst du den Grund?
if($_POST['plz']!="" && !is_integer($_POST['plz'])){
$fehler=true;
$fehlertext.="Überprüfen Sie bitte Ihre Postleitzahl!<br>\n";
}
Afaik liegt es daran, dass die POST-Variable als Variable von Typ String übertragen wird.
<?php
$plz = "123";
if($plz !="" && !is_integer($plz)){
print("FEHLER!");
}
else print("KEIN Fehler!");
?>
Ergebnis: FEHLER!
Wenn du allerdings in der zweiten Zeile
$plz = 123;
schreibst dann erhällst du "KEIN Fehler!" .
Grund: "123" ist kein Integer sondern ein String, PHP behandelt das zwar meist recht unsauber ("123" == 123), aber wenn du das so explizit abfrägst nimmt es es halt doch mal genau.
Lösung:
if($plz != "" && ! ($plz >= 10000 && $plz <= 99999)) {
statt if($plz !="" && !is_integer($plz)){
Damit wird auch gleich überprüft - das prüft sogar noch genauer, ob es sich um eine PLZ handelt - und ignoriert die Unterschiede zwischen String und Integer.
D.h. nun ist auch "123" und 123 "falsch", "12345" und "12345" aber nicht mehr.
Ich hoffe, dir stehen nicht die Haare zu Berge aufgrund so viel Unvermögens.
Um 5:29 Uhr in der Nacht ist das verzeilich - außerdem habe ich mich im ersten Moment auch gewundert, wieso dein Bespiel nicht funktioniert :-) .
Grüße aus Nürnberg,
Tobias
echo $begrüßung;
Afaik liegt es daran, dass die POST-Variable als Variable von Typ String übertragen wird.
Alle Einträge in $_POST und $_GET sind immer vom Typ String. [1]
Grund: "123" ist kein Integer sondern ein String, PHP behandelt das zwar meist recht unsauber ("123" == 123), aber wenn du das so explizit abfrägst nimmt es es halt doch mal genau.
Das ist keinesfalls "unsauber".[2] PHP arbeitet hinter den Kulissen mit definierten Variablentypen. Man muss nur als Programmierer den Typ nicht explizit angeben. Wenn PHP beim Vergleichen auf unterschiedliche Typen stößt nimmt es eine implizite Typumwandlung vor.
Die Funktionen is_integer() bzw. is_int() prüft nur den aktuellen Typ. Das Handbuch erwähnt auch extra die Fälle, in denen diese Funktion nicht verwendet werden kann.
Lösung:
if($plz != "" && ! ($plz >= 10000 && $plz <= 99999)) {
Was ist mit den Postleitzahlen im Bereich 01xxx bis 09xxx?
Postleitzahlen sollte man nicht nach Integer umwandeln wollen, weil dabei die führende 0 verloren geht. Besser ist es, die Eingabe gegen eine Datenbank der "real existierenden" Postleitzahlen zu prüfen. Das ist recht aufwendig. Alternativ bietet sich an, die Eingabe zu prüfen, ob sie 5 Zeichen lang ist (strlen()), und ob diese 5 Zeichen alles Ziffern sind (ctype_digit()).
echo "$verabschiedung $name";
[1] In einigen Fällen kann auch der Typ Array vorkommen.
[2] Es mag vielleicht unsauber aussehen, wenn man PHPs Typkonzept keine Beachtung schenkt ...
Hi!
Grund: "123" ist kein Integer sondern ein String, PHP behandelt das zwar meist recht unsauber ("123" == 123), aber wenn du das so explizit abfrägst nimmt es es halt doch mal genau.
Das ist keinesfalls "unsauber".[2] PHP arbeitet hinter den Kulissen mit definierten Variablentypen. Man muss nur als Programmierer den Typ nicht explizit angeben. Wenn PHP beim Vergleichen auf unterschiedliche Typen stößt nimmt es eine implizite Typumwandlung vor.
Ok, ich habe es doof formuliert.
Natürlich ist es so, dass man "ordentlich" (also wie z.B. in C) Variablen vorher deklarieren kann - nur es wird eben akzeptiert, wenn man schlampt - das wollte ich sagen.
Ist fast wie in HTML - man kann praktisch alles falsch machen und der Browser überlegt sich, was man gemeint hat.
if($plz != "" && ! ($plz >= 10000 && $plz <= 99999)) {
Was ist mit den Postleitzahlen im Bereich 01xxx bis 09xxx?
Wusste nicht, dass es solche gibt - aber dann muss man die Bedinung halt bei 00001 (= 1) anfangen lassen.
Postleitzahlen sollte man nicht nach Integer umwandeln wollen, weil dabei die führende 0 verloren geht. Besser ist es, die Eingabe gegen eine Datenbank der "real existierenden" Postleitzahlen zu prüfen. Das ist recht aufwendig. Alternativ bietet sich an, die Eingabe zu prüfen, ob sie 5 Zeichen lang ist (strlen()), und ob diese 5 Zeichen alles Ziffern sind (ctype_digit()).
Nun gut, ich habe keine so genaue Ahnung, es für Postleitzahlen es gibt - ich dachte, alle von 10000 bis 99999 gibts, fertig.
Aber letztendlich war doch die Ausgangsfrage, wie man Bots ausschließt, die z.B. Emailadressen in PLZ-Felder schreiben - dafür sollte das doch eigentlich reichen, oder?
Grüße aus Nürnberg,
Tobias
Hallo Tobias
Aktueller code
if (empty($_POST['name'])or !preg_match('/[1]+$/', $_POST['name'])) {
$fehler=true;
$fehlertext.="Geben Sie bitte Ihren Namen an!<br>\n";
}
if($_POST['plz']!="" && ! ($plz >= 1 && $plz <= 99999)){
$fehler=true;
$fehlertext.="Überprüfen Sie bitte Ihre Postleitzahl!<br>\n";
}
Variable $name und $plz werden ausser $email und $mitteilung überprüft.
Dies sollte es etwas schwieriger machen für Roboter.
Die Bedingung für §plz habe ich verändert, da vor allem Schweizer Postleitzahlen berücksichtigt werden müssen.
Bisher habe ich nur spam in der Art bekommen:
...
Postleitzahl: to5378@lichtblick-heiden.ch
...
Übrigens: für die Eingabe im Feld plz wird auch 823erich akzeptiert.
Es scheint so, als schneide php nach den Ziffern einfach ab.
Die Eingabe muss nur mit einer Ziffer beginnen.
Dir herzlichen Dank für deinen engagierte Hilfestellungen.
Grüsse von der Schweiz
Falls du mal ein Schoki Carepaket wünscht, lass es mich wissen.
Christian
A-Za-zäöüßÄÖÜé - ↩︎
Hi!
Übrigens: für die Eingabe im Feld plz wird auch 823erich akzeptiert.
Es scheint so, als schneide php nach den Ziffern einfach ab.
Die Eingabe muss nur mit einer Ziffer beginnen.
Naja - das ganze System rund um "123" = 123 ist nicht wirklich exakt - vielleicht hängt das (im weiteren Sinne) auch damit zusammen.
Dir herzlichen Dank für deinen engagierte Hilfestellungen.
Gerne.
Falls du mal ein Schoki Carepaket wünscht, lass es mich wissen.
Schweizer Schokolade ist schon was tolles, aber wenn ich jedem, der mir in Foren schon mal weitergeholfen hätte Nürnberger Lebkuchen schicken wollte hätte ich was zu tun... ;-)
Trotzdem vielen Dank fürs Angebot!
Grüße aus Nürnberg,
Tobias