Feedbackform gespamt

René Weber

Legendäres Mitglied
Hello,

Auf einer meiner Sites wird das (HTML) Feedback Formular als Spamschleuder benützt.

Ich will diese Tür schliessen, da ich auf anderen Sites das gleiche Formular benütze.

Wie sich auf den phpBB schon gezeigt hat, werden schone einige "Captcha"-Filter von Spambots entziffert.

Zwei Fragen:
- Kennt jemand ein gutes (eher unbekanntes) PHP Script um Formulare zu filtern?

- Ich habe da eine Idee: Neben dem Formular ein Zufallsbild anzeigen (z.B. Tiere, die jeder kennt) und daneben ein Eingabefeld mit: "Was ist das?" Ich denke, jeder erkennt eine Kuh und kann auch Kuh schreiben. Schwieriger wird's bei einem Schwein, welches man auch Heu* nennen kann.


* hier hat Alain's Wortfilter zugeschlagen. Falls ihr Heu seht, dann habe ich "S-A-U" gemeint, den schweizerdeutschen Ausdruck für ein bovines Wesen.

Ich erwarte eher Input auf die erste Frage. Meinungen zur zweiten Frage sind aber auch erwünscht.

Cheers, René
 
den schwein/Heu-fall könntest du umgehen, indem du beide möglichkeiten gelten läßt.
wenn du dann noch eine funktion schreibst, die falschschreibungen/alternativnamen speichert, ist dies dann sogar selbslernent, und kann von dir dann nach und nach durch freischaltung alternativer bezeichnungen erweitert werden..
 
Vielleicht Bilder mit Rechenaufgaben?
Oder wie im Sony Ericsson Forum (www.se-community.com) (auch aus der Schweiz) da muss man beim Posten einen code eingeben.
 
@ kais:
Der Sony-Ericson Code "www.se-community.com" ist Schrott. Das kann jeder Bot lesen und dann schreiben.

@ pangu:
Du hast sicher recht, aber irgendwie führt mir das zu weit.

Ich habe einen kommerziellen Captcha Provider gefunden, aber irgendwie stinkts mir, dafèr zu bezahlen. Umgekehrt, wenn ich 10 Stunden für einen eigenen Captcha investiere, dann wird die Sache auch nicht billig.

Cheers, René

 
also ich überprüfe einfach immer vor dem absenden, ob das formular wirklich von meinem formular kam:

CODE if ($_POST && $_SERVER["HTTP_REFERER"] == "http://www.seite.vom/kontakt.formular") { ...
 
Wenn du Spamschleuder sagst, dann wird ja das Feld Email hauptsächlich missbraucht. Bzw es wird mail()-Fähiger Code verwurstet.

Ich behandle meine Fromulare so, dass wenn mehr als 100 Zeichen eingegeben werden, dass das Script die verarbeitung Komentarlos mit exit; abbricht.
 
hmm..

Zum Thema "captcha" kann euch folgende Seite mal empfehlen:
http://sam.zoy.org/pwntcha/


Eines wird dabei wohl deutlich:
Zukünftig werden vor allem die Cpatcha sicher sein, die auch recht häufig von Menschen nicht zu entziffern sind.
Aber es gibt ja immer wieder schöne, neue Ansätze
wink.gif



Übrigens:
Geld würde ich für soetwas nicht bezahlen, es sei denn ich bekomme eine 100% Garantie, dass Menschen das Captcha lesen können und ebenfalls eine 100% Garantie, dass Maschinen dies nicht können.
Denke so eine Garantie kann keiner geben... ^^


ABER
Spammer versuchen nur solche Captcha zu knacken, die Ihnen auch etwas bringen.
Entwickel ich ein eigenes ist die Gefahr schon einmal drastisch gesenkt (außer ich gib dies wieder weiter)
 
@spross: Referer lassen sich ganz leicht faken (1 zusätzliche Zeile Code). Das ist also überhaupt kein Schutz vor irgendwas. Nicht jeder Browser übermittelt einen oder den korrekten Refererer. Es können also evtl. nicht alle User das Formular nutzen.

@René:
Wenn es sich bei dem Problemscript um diesen asbach-uralter Formmailer handelt, ist das natürlich Käse, weil da die Empfängermail im HTML-Code steht. Wenn der das Problem ist, könntest Du die Variable mit der Empfängermail erstmal im Script statisch setzen. Wie anfällig das alte Teil ansonsten noch ist, weiss ich nicht.
Ansonsten: schau Dir an wie Mail-Injection funktioniert und prüfe entsprechend auf Zeilenumbrüche und sonstige Header-Angaben die in den normalen Feldern nichts zu suchen haben. So schwierig ist das nicht. Dafür brauchst Du auch keine Captchas.
Das PEAR Mail Package bietet angeblich einen "Injection Schutz" - ich habs mir aber nicht näher angesehen oder geprüft.
 
@Mar-T: soweit ich weiss, ist der http-referer aus $_SERVER nicht vom browser, sonder von der session auf dem server... somit ist es bei mir fast unmöglich, den referer auf der server session zu ändern...

¤: nein du hast recht, laut php manual:
QUOTE 'HTTP_REFERER'

Die Adresse der Seite (falls es eine gibt), die den Browser auf die aktuelle Seite verwies. Dieser Header wird vom Browser gesetzt, aber nicht von allen. Einige Browser bieten die Möglichkeit, den HTTP_REFERER zu modifizieren. Kurz, auf diesen Header kann man sich nicht verlassen.
 
Es gibt auch einen einfachen weg, der 95% aller Spambots abwimmelt (zumindest momentan noch)


Man baue ein einfaches Formular
CODE <form .....>
<input type="text" name="bla" />
<input type="submit" name="formular_absenden" value="Formular absenden" />
</form>


Und wertet nach dem Submit-Button aus:



QUOTE <?PHP

if ($_POST['formular_absenden']) {

mail_senden();
}
?>


Es wird also geprüft, ob effektiv der Submit-Button gedrückt (gesetzt) wurde. Man kann den Namen des Buttons z.B. auch dynamisch aufbauen (z.B. Session-ID), um das ganze etwas zu verbessern.

So unglaublich es klingt, aber diese wirklich einfache Variante bewährt sich ganz gut. Dabei wäre es wirklich einfach für die Bot's, diese auch zu umgehen.

In meinen Fällen habe ich es so erweitert, dass man erst Formulare senden darf, wenn zumindest 2 Klicks auf dem Projekt gemacht worden sind.

Bis jetzt bin ich mit dieser Version 100% Spamfrei, ganz ohne Captcha
biggrin.gif
 
QUOTE (Alonso @ Mi 27.9.2006, 20:08)Es gibt auch einen einfachen weg, der 95% aller Spambots abwimmelt (zumindest momentan noch)
...
Bis jetzt bin ich mit dieser Version 100% Spamfrei, ganz ohne Captcha

Ja, aus ähnlichen Gründen habe ich mit meinen Kontakt- und Tell-a-friend-Formularen bislang noch keinerlei Probleme mit Spambots.

Da werden einige versteckte Felder angelegt, die ich einfach zur korrekten Verarbeitung benötige. Und sendet der Client / Spambot die nicht mit, dann wird einfach nichts verarbeitet.

Die einzigste Attacke, die es mal auf das Kontaktformular gab, war, daß jemand per Hand sich über mein angeblich unsicheres (da Microsoft nutzendes) Angebot aufgeregt hat und meinte, er müsse mir das vielfach zusenden. Na ja - eine Portion von fünf Einträgen (die, da zu dicht nacheinander, nur eine Benachrichtigungsmail erzeugten), fünf Minuten später dasselbe nochmals, dann wurde es ihm zu doof.

Bei meinem Newsletter gibt es regelmäßig Erstanmeldungen mit Müll-Mails - aber die kriegen nicht das Double-Opt-In hin. Die scheinen das zu testen - würde das Double-Opt-In klappen, würden sie wahrscheinlich irgendetwas weiteres versuchen.

Edit: Also, wer solche Dinge gerne ohne Captcha für einige Domains braucht: Ab 9,90.- Euro pro Monat - allerdings ist das Angebot dann natürlich nicht ausgenutzt.
 
So, ich denke, ich hab's gelöst.

Der ursprüngliche Spam sah so aus:

CODE Origin:: The Lodge English

Name: free texas holdem game

Email: main@yandex.com

Message: hello word ,Thes is best site of pharmasi cialis co drug Deli impotence lilly
cialis drug impotence
herbal impotence treatment
impotence in man
impotence medication
impotence pill
impotence viagra
<a href="http://www.freewebs.com/as3v/impotence-in-man.html ">impotence in man</a> [url=http://www.freewebs.com/as3v/impotence-in-man.html]impotence in man[/url]
<a href="http://www.freewebs.com/as3v/impotence.html ">impotence</a> [url=http://www.freewebs.com/as3v/impotence.html]impotence[/url]
<a href="http://www.freewebs.com/as3v/impotence-medication.html ">impotence medication</a> [url=http://www.freewebs.com/as3v/impotence-medication.html]impotence medication[/url]
<a href="http://www.freewebs.com/as3v/smoking-and-impotence.html ">smoking and impotence</a> [url=http://www.freewebs.com/as3v/smoking-and-impotence.html]smoking and impotence[/url]


Ich habe folgendes JS eingebaut:


CODE <script type="text/javascript">

function checksubmit()
{
if (document.getElementById("feedback").fullname.value == "")
{
alert("Please enter your first and last name.")
document.getElementById("feedback").fullname.focus()
return false
}
if (document.getElementById("feedback").emailadresse.value == "")
{
alert("Please enter your e-mail address")
document.getElementById("feedback").emailadresse.focus()
return false
}

function get_url()
{
var your_url=document.getElementById("feedback").mitteilung.value;
var is_protocol_ok=your_url.indexOf('http');
var is_url_ok=your_url.indexOf('url=');
var is_tag_ok=your_url.indexOf('<');
if ((is_protocol_ok!=-1) || (is_url_ok!=-1) || (is_tag_ok!=-1))
{
alert('Your message must not contain tags.');
your_url = "";
checksubmit();
}
else
alert('Thank you for the message.');
}
get_url()
}
</script>


Wenn jemand Lust und/oder Zeit hat hat das Ding zu testen:
Testbed

Cheers, René

PS: Falls das Script einen "tag" in der Message entdeckt, kommt der Spammer nicht mehr ohne CTRL-ALT-DEL raus.
ph34r.gif
 
Réne; Und wenn JS ausgeschaltet ist?
rolleyes.gif


Haben die Bot's JS? Nein..

Ich denke hier wird von 2 Varianten Spam gesprochen:

1) Die Formulare werden durch Bot's automatisiert mit Werbung gefüllt und an den normalen Empfänger zugestellt. Dagegen hillft die Variante Capcha, oder nach dem Prinzip wie von jAuer und mir erklärt.

2) Die Formulare können Missbraucht werden, um z.B. Massenmails zu erzeugen, die nicht nur an den normalen Empfänger versendet werden. Dazu hats auch einige Links in diesem Thread.


Gegen beides sollte man siche Absichern. Wirklich sinnvoll wird das aber erst Serverseitig. Daher, bitte nimm's mir nicht übel Réne, ist die Variante per JS _NICHT_ vernünftig.
 
@Alonso:QUOTE Daher, bitte nimm's mir nicht übel Réne, ist die Variante per JS _NICHT_ vernünftig.
Im Gegenteil, konstruktive Kritik ist die beste Art, jemanden zum Handeln anzuregen. Also, herzlichen Dank.

@jAuer:
QUOTE Origin:: Miramichi English

fullname: myPersonal Name

emailadresse: info@sql-und-xml.de\n\nHello You I want that you buy ...

mitteilung: kleiner Test @jAuer / Ayom

absenden: Send
Ich habe deinen Test erhalten (siehe Quote). Besten Dank für den Test.

Ich nehme nun noch einmal einen Anlauf ...

Cheers, René
 
QUOTE (René Weber @ Do 28.9.2006, 14:33)@jAuer:
QUOTE Origin:: Miramichi English

fullname: myPersonal Name

emailadresse: info@sql-und-xml.de\n\nHello You I want that you buy ...

mitteilung: kleiner Test @jAuer / Ayom

absenden: Send
Ich habe deinen Test erhalten (siehe Quote). Besten Dank für den Test.

Nee, so ist das doch größtenteils unproblematisch. Denn ich hatte befürchtet, daß man mit den \n den Header sprengen könnte und daß ich so eine Mail an mich selbst bzw. an beliebige andere Personen hätte generieren können. So bekommst nur Du eine einzige Mail - das ist zwar Käse, aber noch kein richtiger Spam.

Die Frage ist allerdings, ob man das etwas verschärfen könnte - eventuell probiere ich das heute abend mal aus.
 
@alonso und jAuer:

Ihr zwei seid wirklich fein. Besten Dank.

Ich habe versucht alonso's Lösung zu programmieren, denn die Überlegung, dass Bots sich nicht um JS kümmern leuchtet mir ein. Ich bin nicht sicher, ob dass es ein Bot ist, deshalb denke ich daran, beide Übel gleichzeitig los zu werden.

Mit alonso's Lösung habe ich aber noch Probleme. Die Site ist auf einem remote Linux Server gehostet und benützt ein PERL Script (formmail.pl), welches vom Hoster zur Verfügung gestellt wird.
Ich habe deine Lösung so augesplittet:

form.php: enthält das Formular und ruft als "action" das Script 'absenden.php' auf.
absenden.php: sieht so aus
CODE
<?PHP
if ($_POST['formular_absenden']) {
'/cgi-bin/formmail.pl';
}
?>



Ich erhalte aber nur eine leere Seite und das PERL Script wird nicht ausgeführt, oder? Jedenfalls erhalte ich kein Mail.

Na, wird wohl Mitternacht werden heute...

Cheers, René
 
Also das Problem hatte ich auch. Dazu gibts folgendes zu erledigen:


1. Modsecurity von http://www.modsecurity.org/ downloaden.
2. Modsecurity per apxs in den Apache einbinden (dauert etwa 2 minuten)

Dann folgende Zeilen im httpd.conf einfügen BEVOR du deine VirtualHost direktiven lädst:

CODE
SecFilterEngine On
SecFilterSelective ARGS_VALUES "\n[[:space:]]*(to|bcc|cc)[[:space:]]*:.*@"



Was passiert da genau? Ganz einfach, sobald ein solches Formular gepostet wird und to:, bcc: oder cc: in einem Formularfeld vorkommt wird das E-Mail nicht versendet und du kannst wieder ruhig deine Aeuglein schliessen und entspannt weiterschlafen.

Solange du dann deine Programmierer ermunterst keine Scripte zu schreiben bei denen man über die URL Variablen mitgeben kann, die an die exec oder system Kommandos übergeben werden so wie es meine Kunden manchmal tun ist alles ok.

Ansonsten schlag sie. Peitschen oder eiserne Jungfrau sind auch gut.

Chris
 
Zurück
Oben