Gästebuch Spamfilter

Joel

Legendäres Mitglied
Hallo Ayom-Community,

In meinem Gästebuch habe ich immer viel Spam (ca. 5 Spam-Einträge pro Tag)

Ich wollte fragen, ob es vielleicht schon einen Webservice gibt, welchen Gästebuch-Spam überprüfen kann?

Wäre cool, einfach mit einem Webservice per PHP kurz sowas überprüfen:

CODE
$entry = new GuestbookSpamcheck();
$entry->setText( $_POST['text'] );
$entry->setName( $_POST['name'] );
$entry->setHomepage( $_POST['homepage'] );
$entry->setEmail( $_POST['email'] );
// etc.
if ( $entry->check() ) {
mysql_query( "INSERT INTO guestbook ........" );
} else {
die( "don't spam" );
}



Vielleicht würde es sich lohnen, so einen Service zu programmieren. Was meint ihr?

Gruess,
Joel
 
QUOTE (Joel Janser @ Fr 31.3.2006, 8:27)Vielleicht würde es sich lohnen, so einen Service zu programmieren. Was meint ihr?


Mit dem Gedanken habe ich auch schon gespielt.

Ich hab vor einigen Wochen einen einfachen trainierbaren Spamfilter gebastelt (Stichwort: Neuronale Netzwerke) und mir überlegt, dass es sinnvoll sein könnte, eine zentrale "Ablage" für die antrainierten Daten zu haben, so dass man eine breitere Basis an Spam-Einträgen hat, um die Zuverlässigkeit des Filters zu steigern.

Der "Markt" für einen solchen Service scheint zu existieren, denn beim Surfen trifft man immer häufiger auf vollgespammte Gästebücher und auch hier wurden in den letzten 2 Wochen schon mehrere Diskussionen eröffnet.

Die Gefahr eines solchen Service sehe ich darin, dass man u.U. sehr schnell Ziel eines DOS-Angriffs werden kann, wenn die Spammer das mitkriegen.

EDIT:
Weitere Schwierigkeit dürfte der Bedarf an Rechenleistung sein, der für das Verarbeiten, Trainieren und Klassifizieren nötig ist.
 
QUOTE
Die Gefahr eines solchen Service sehe ich darin, dass man u.U. sehr schnell Ziel eines DOS-Angriffs werden kann, wenn die Spammer das mitkriegen.

Weitere Schwierigkeit dürfte der Bedarf an Rechenleistung sein, der für das Verarbeiten, Trainieren und Klassifizieren nötig ist.


Ich denke sowas könnte man in einem ersten Schritt sehr einfach Gestalten, man macht einfach einige Tabellen mit gesperrten Inhalten:

Gesperrte IPs:
15.15.15.*
16.17.18.19
etc.

Gesperrte URLs:
http://*.goodwatches.com/
http://*.buysomething.com/
etc.

Gesperrte E-Mail-Adressen:
*@buysomething.com
clara@yahoo.com
etc.

Gesperrten Texten:
"Hi this is a very informative site! It's nice on the whole but it seems that the navigation system is a little bit confusing."
etc.

Gesperrten Wörtern:
*****-enlargement
etc.

Und da eine Abfrage dann einfach mit SQL an die Datenbank gestellt würde, würden auch keine Performance-Probleme auftreten.

Hast du etvl. Lust das mit mir zu programmieren und auf einer Homepage anzubieten?

<ironie>
Wir könnten einen Spam-Bot schreiben, welcher in alle zugespamten Gästebücher einen Eintrag macht: "Sehr nette Seite, aber leider ist das Gästebuch voll zugespamt. Bauen Sie doch unseren Spam-Filter ein! http://www.guestbook-spamfilter.com/ ;-)
</ironie>

Greets,
Joel
 
QUOTE
Ich hab vor einigen Wochen einen einfachen trainierbaren Spamfilter gebastelt (Stichwort: Neuronale Netzwerke) und mir überlegt, dass es sinnvoll sein könnte, eine zentrale "Ablage" für die antrainierten Daten zu haben, so dass man eine breitere Basis an Spam-Einträgen hat, um die Zuverlässigkeit des Filters zu steigern.


In welcher Sprache hast du den geschrieben? Java? PHP? ...

Könnte ich etvl. den Code haben?
wink.gif
 
QUOTE (Joel Janser @ Fr 31.3.2006, 13:32)Ich denke sowas könnte man in einem ersten Schritt sehr einfach Gestalten, man macht einfach einige Tabellen mit gesperrten Inhalten:

Und da eine Abfrage dann einfach mit SQL an die Datenbank gestellt würde, würden auch keine Performance-Probleme auftreten.


Der Filter funktioniert im Moment fast ohne Blacklists und es wird keine Datenbank verwendet, sondern bestimmte Kennzahlen berechnet, die nachher ins Neuronale Netz gespeist werden, um zu bestimmen, ob es sich um Spam handelt oder nicht. Die Idee war, keine DB mit IPs, Mailadressen u.ä. zu verwenden, da man diese ständig aktualisieren muss und man so gezwungenermassen einen Schritt hinterher ist.

Momentan sind die Kennzahlen:
- Anteil Links (Fragment <a href) am Gesamt-Text.
- Anteil URL am Gesamt-Text
- Anteil BBCode Links am Gesamt-Text
- Anteil HTML am Gesamt-Text
- Anteil Satzzeichen am Gesamt-Text
- Anteil blockierter Wörter am Gesamt-Text (einzige Blacklist dieser Lösung)

Inputs zu den obigen Kennzahlen sind jederzeit willkommen. Insbesondere interessiert mich, ob die Spam-Nachrichten weitere charakteristische Merkmale aufweisen.

Ich hab den Filter in PHP geschrieben, wobei ich die Klasse für das Neuronale Netz im Web gefunden habe.

Den Code gebe ich momentan nicht raus, da es sich bisher noch um ein Experiment handelt, das weder kommentiert noch sauber durchgetestet wurde, insbesondere hinsichtlich der Performance.


QUOTE (Joel Janser @ Fr 31.3.2006, 13:32)Hast du etvl. Lust das mit mir zu programmieren und auf einer Homepage anzubieten?


Grundsätzlich könnten wir uns schon zusammentun und mal schauen, was dabei rauskommt. Um die Sache effektiver zu machen, lohnt es sich vermutlich, die beiden Ansätze zu kombinieren.
 
QUOTE (Joel Janser @ Fr 31.3.2006, 14:01)PS:

Hier hats auch noch Ansätze zur Spam-Bekämpfung in Gästebüchern:

http://www.schrelb.de/Gaestebuch_Spam_bekaempfung.php


Ziel meiner Idee war gerade, sich solche umständlichen Techniken zu ersparen und auch für den Website-Besucher alles so einfach wie möglich zu halten, sprich z.B. keine Captchas einsetzen zu müssen.
 
QUOTE
Momentan sind die Kennzahlen:
- Anteil Links (Fragment <a href) am Gesamt-Text.
- Anteil URL am Gesamt-Text
- Anteil BBCode Links am Gesamt-Text
- Anteil HTML am Gesamt-Text
- Anteil Satzzeichen am Gesamt-Text
- Anteil blockierter Wörter am Gesamt-Text (einzige Blacklist dieser Lösung)


Das Problem ist, dass ein solcher Filter sehr leicht zu umgehen ist. In der letzten Zeit sind sehr viele Spam-Einträge erschienen, die bei deinen Filter nicht funktionieren würden. Ausserdem würden auch viele Nicht-Spam als Spam deklariert.

Nur weil eine Nachricht 1-2 URL enthält, BBCode, etc. ist sie ja noch lange keine Spam. Denk doch mal an irgend eine die Schreibt:

QUOTE
"Hallo Joel, du wie liefs mit deiner Facharbeit? Schreib mir doch auch mal ins gästebuch www.blabla.com/xyz. PS: Hier noch die Fotos vom Klassenlager http://www.xyz.com/blabla. Schaus dir an!!!!!!!!"



Und solche Spams würden nicht erkannt, weil sie auch für normale Nutzer sehr typisch sind:

QUOTE
--
Name: Pulsar
Email: pulsarwatch@goodwatches.net
Homepage: http://pulsar-watch.goodwatches.net
Nachricht: Thank you! Interesting site. You surely much worked at it.
--

--
Name: Diamond
Email: diamond@gmail.com
Homepage: http://diamond-watch.goodwatches.net
Nachricht: look forward to participating and hope to do more teaching, writing and research in the future on the topic of sacroiliac joint dysfunction.
--



Perfekt, aber schwer zu realisieren, wäre ein Schutz (Wie bei GMX):
<Textmuster>
Erkennt anhand des Bayes-Algorhytmus wie gross die Wahrscheinlichkeit auf Spam ist (in %). Der Bayes-Algorhytmus lernt dazu, wenn ein Eintrag als Spam deklariert wird. Es wird für jedes Wort ausgerechnet, wie typisch dieses für ein Spam ist. Es gibt dazu schon fertige PHP-Implementationen.

<Häufigkeit IP-Adresse>
Wenn von der gleichen IP-Adresse in mehrere Gästebücher in kurzer Zei einträge gemacht werden, wird die IP-Adresse in die Blacklist aufgenommen.

<Häufigkeit Homepage>
Wenn die gleiche Homepage zu oft in das Homepage-Feld eingetragen wird, wird die Homepage in die Blacklist aufgenommen.

<Häufigkeit Text>
Wenn der gleiche Text in mehreren Einträgen vorkommt, wird er in die Blacklist aufgenommen.

<IP-Adresse / IP-Adressblock Blacklist>
Oft werden Spam-Einträge von Chinesischen PCs aus automatisiert gesendet. So kann man ganze Blocks oder einzelne IPs Sperren.

<Manuell Verschieben>
- Homepage / IP-Adresse / Text IP-Adresse wird in die Blacklist aufgenommen.
- Wird mit Bayes als Spam markiert.
 
Ich hab mal einen Algorhytmus geschrieben, er funktioniert sehr gut, kann aber sicher noch ausgebaut werden:

http://www.hardstyle.net/view/guestbook/option/past

Einige Einträge sind mit der Spam-Wahrscheinlichkeit von 100% versehen, diese wurden ohne eine vorher angelegte Blacklist als Spam markiert. Die Fehlerquote beträgt bei diesen Einträgen ca. 15%, könnte aber sicher noch verbessert werden.
Falsch Positiv (Fälschlicherweise als Spam markiert): ca. 15% der als Spam markierten Einträge
Falsch Negativ (Fälschlicherweise als Nicht-Spam markiert: ca. 5% der Spam Einträge.

Ist natürlich erst in den Anfangsschuhnen, die Fehlerquoten können sicher noch stark reduziert werden.

Wäre für mich interessant mit jemandem Zusammenzuarbeiten, welcher einen Gästebuchservice betreibt! (Ich frag mal in nem andern Thread danach)

Gruess,
Joel
 
QUOTE
Nur weil eine Nachricht 1-2 URL enthält, BBCode, etc. ist sie ja noch lange keine Spam. Denk doch mal an irgend eine die Schreibt:

"Hallo Joel, du wie liefs mit deiner Facharbeit? Schreib mir doch auch mal ins gästebuch www.blabla.com/xyz. PS: Hier noch die Fotos vom Klassenlager http://www.xyz.com/blabla. Schaus dir an!!!!!!!!"




Dieses wird bei mir mit meinem aktuellen (aber sehr kleinen) Satz an Testdaten (nicht mit dieser neuen Nachricht trainiert) mit einem Spam-Faktor von 0.35501617701148 klassifiziert, was ein Indiz dafür ist, dass es kein Spam ist.


QUOTE
Und solche Spams würden nicht erkannt, weil sie auch für normale Nutzer sehr typisch sind:

Name: Pulsar
Email: pulsarwatch@goodwatches.net
Homepage: http://pulsar-watch.goodwatches.net
Nachricht: Thank you! Interesting site. You surely much worked at it.



Da hast du recht, an dieser Stelle versagt mein Ansatz.

Ich muss aber zugeben, dass ich bisher nur mit Spams konfrontiert war, welche im Nachrichten-Text immer mindestens ein Kriterium ziemlich stark aufwiesen (Links, BBCode, Verweis auf Medikamente), da hat das auch perfekt funktioniert
wink.gif
. Ich hoffe, dass ich die Zuverlässigkeit meines Ansatzes durch eine Differenzierung der Kriterien noch weiter verbessern kann.

Jetzt nimmts mich schon noch wunder: Wie kannst du eine Nachricht mit 100% Wahrscheinlichkeit als Spam markieren, ohne eine Blacklist angelegt zu haben? Wie entscheidest du das?
 
QUOTE
Jetzt nimmts mich schon noch wunder: Wie kannst du eine Nachricht mit 100% Wahrscheinlichkeit als Spam markieren, ohne eine Blacklist angelegt zu haben? Wie entscheidest du das?


Ich möchte den Algo nicht öffendlich im Forum schreiben, aber kann ihn dir per PM erklären wenns dich interessiert.

(Aber bitte Idee nicht kopieren und nicht veröffendlichen
tongue.gif
)

PS: Sry PM geht bei dir noch net ..
 
Egal, ich poste einfach mal das Konzept:

Angenommen ich habe 2 Gästebuch-Einträge:

Ein regulärer Eintrag:
QUOTE
Name: Sandra
E-Mail: sandra@gmx.ch
Homepage: www.sandraonline.de
Text:
Hallo Joel,
Wirklich nette Seite, man sieht sich bald... Schau doch auch mal auf meiner Seite vorbei.
Gruess,
Sandra



Ein Spam-Eintrag:

QUOTE
Name: Gina
E-Mail: gina@gmail.com
Homepage: www.buysomethingcool.com
Text:
Hallo,
Coole Seite, besuch doch mal meine Homepage.
Gruess,
Gina



Beide haben einen relativ typischen gästebuch Text, beide haben Homepage-Werbung und eine E-Mail, beide einen typischen Frauennamen.

Wie soll man erkennen, was Spam ist? Was ist anders?

Nun, www.buysomethingcool.com ist eine kommerzielle Seite und www.sandraonline.de nicht. Die URL www.buysomethingcool.com wird auch in sehr vielen andern Gästebüchern beworben, die Seite von Sandra ist jedoch kaum verlinkt.

Über das Google bzw. Yahoo API wird eine Abfrage gemacht um herauszufinden, wie oft die Seite im Internet verlinkt wird. Es wird auch eine Abfrage gemacht um herauszufinden, in wie vielen Gästebüchern schätzungsweise für die Homepage geworben wird. Es kann z.B. auch noch eine Abfrage mit dem Text und der URL gemacht werden, um herauszufinden, wie oft der Text in andern Gästebüchern verwendet wird.

So kann man ganz klar sagen, dass die Seite von Gina mit "buysomethingonline" in sehr sehr vielen Gästebüchern (z.B. 5000) vorhanden ist, und die Seite von Sandra in vielleicht 10 Gästebüchern.

Somit markiert das Script die Seite von Gina als Spam und die von Sandra als Ham.

Auf der Seite habe ich es mit einem Bayesschen Filter kombiniert, welche aber praktisch untrainiert ist und deshalb nicht optimale Resultate liefert.

Gruess,
Joel
 
Die Idee gefällt mir.

Du setzt also hauptsächlich auf die URL, welche im Gästebuch eingetragen wird. Was machst du, wenn keine Website angegeben wird (Feld nicht ausgefüllt, oder das Gästebuch hat kein entsprechendes Feld) oder die Suchmaschinen irgendwann solche Verweise aus dem Index verbannen (können)?

Ein weiteres Problem sehe ich in der Zeitdauer, in welcher die entsprechenden Links den Suchmaschinen noch nicht bekannt sind (wenn eine neue solche URL verwendet wird)?

Hast du für diesen Fall alternative Mechanismen?

---
EDIT:
@Joel: ich habe Verständnis, falls du weitere Details nicht hier in der Öffentlichkeit bekanntgeben willst, ich habe im entsprechenden Thread mal die Freigabe von PN angefragt, damit wir das ggf. auch "unsichtbar" diskutieren können.
 
QUOTE
Du setzt also hauptsächlich auf die URL, welche im Gästebuch eingetragen wird. Was machst du, wenn keine Website angegeben wird (Feld nicht ausgefüllt, oder das Gästebuch hat kein entsprechendes Feld) oder die Suchmaschinen irgendwann solche Verweise aus dem Index verbannen (können)?


Die Suchmaschinen werden die Spam-Seiten selbst sperren, und das machen sie auch. Jedoch nicht die Verweise darauf -> Also hat es keinen Einfluss.

Wenn nichts eingetragen ist, wird nur der Bayessche Filter verwendet (dieser Filter wird z.B. auch bei Thunderbird verwendet, muss aber trainiert werden). Normalerweise haben aber alle Spam-Einträge Links.


QUOTE
Ein weiteres Problem sehe ich in der Zeitdauer, in welcher die entsprechenden Links den Suchmaschinen noch nicht bekannt sind (wenn eine neue solche URL verwendet wird)?


Das Script hat sowieso eine gewisse Tolleranz, dass es erst ab ca. 50 Einträgen reagiert. Die Seiten kommen bei dieser Masse relativ schnell in den Index (2-3 Tage). Aber natürlich, ganz neue Seiten, für welche kaum gespamt wurde, werden nicht erkannt.

Damit nicht bei jedem Gästebuch-Eintrag eine Google API-Abfrage gemacht werden muss, muss die URL mit der Anzahl Resultate sowieso gecacht werden.


QUOTE
Hast du für diesen Fall alternative Mechanismen?



Wie gesagt, der Bayessche Filter. Man könnte natürlich noch weitere Mechanimen einbauen um Spam zu erkennen und URLs zu Blacklisten. Gibt ja da genug Methoden (wie oben irgendwo beschrieben ..).

--

Und das System selbst habe ich mir ungefähr so vorgestellt:

1. Kunde X möchte ein Spamfreies Gästebuch.
2. Wir geben ein AntispamClient.php Script heraus, mit dem man Gratis 1'000 Gästebucheinträge auf Spam checken kann. Beim Script muss nur der Tabellenname und Datenbank-Logindaten angegeben werden, das Script sucht sich die entsrechenden Felder selbst wenn möglich. Das Script findet mit dem Webservice heraus, was Spam ist und was nicht.
3. Mit einem Klick im Script können die als Spam identifizierten Spams gelöscht werden.
4. Falls der Kunde mehr als 1000 Einträge prüfen möchte, oder möchte dass die Spam-Einträge automatisch gelöscht werden, kann er sich für 10 Fr Gebür beim Server registrieren. Und das AntispamClient-Script wird automatisiert z.B. alle 10 Minuten aufgerufen um neue Einträge auf Spam zu überprüfen.

Greets,
Joel
 
Hallo,

Nachdem ich diesen Thread gelesen habe und noch einen anderen zum Theam, habe ich erst mal geguckt, ob mein Gästebuch überhaupt funktioniert. Es hat sich nämlich noch niemand eingetragen, noch nicht einmal ein bot.
sad.gif


Doch zum Thema: Das Prob lässt sich doch auch ohne viel Kopfzerbrechen mit javascript lösen, allerdings mit dem Haken, dass Einträge dann ausschliesslich Gästen vorbehalten sind, die javascript eingeschaltet haben.

Ich schreib mal ein kurzes Script und mach euch dann Konkurrenz.
biggrin.gif


Gruss

Bernd R. Rickert
 
QUOTE
Das Prob lässt sich doch auch ohne viel Kopfzerbrechen mit javascript lösen, allerdings mit dem Haken, dass Einträge dann ausschliesslich Gästen vorbehalten sind, die javascript eingeschaltet haben.


Jo ist klar, es gibt sehr viele effektive Möglichkeiten Spam zu verhindern wenn man das Gästebuch-Script anpassen kann. Aber das Problem ist einfach bei fast jeder Website mit einem Gästebuch.

Wäre ja Zeitverschwendung wenn jeder Webmaster sein Script extra umbauen müsste nur um das Spam Problem zu beheben. Viele benutzen Content-Management-Systeme, da ist es etwas ungeschickt einfach das Gästebuch anzupassen, oder sie benutzen Standard-Gästebuch-Scripts. Nach dem Anpassen ist ein Update auf eine neue Version also nur sehr schwer ... Einige Webmaster sind einfach zu faul, zu dumm oder haben keine Zeit für so einen Umbau
wink.gif
. Das Gästebuch-Script wechseln wollen sie auch nicht, weil sie dann die Daten migrieren müssten.

Da wärs doch am einfachsten, einfach ein AntiSpam-Script hochzuladen ohne irgendwas anzupassen. Problem gelöst
wink.gif
.

Gruess,
Joel
 
QUOTE Viele benutzen Content-Management-Systeme, da ist es etwas ungeschickt einfach das Gästebuch anzupassen, oder sie benutzen Standard-Gästebuch-Scripts. Nach dem Anpassen ist ein Update auf eine neue Version also nur sehr schwer


So ein kurzes Script kann man auch automatisch einfügen. Dazu brauchen Webmaster nicht einmal das cms zu öffnen, sofern er den Namen der Gästebuchdatei kennt.


QUOTE Einige Webmaster sind einfach zu faul, zu dumm oder haben keine Zeit für so einen Umbau


Das stimmt. Einfach einmal am Tag ein Klick zu einer Putzkolonne ist sicher komfortabler. Allerdings müsstest du mit einem notwendigen Zugriff auf die Datenbank eine ziemliche Hemmschwelle überwinden. Ich würde nicht ohne weiteres ein Account auf meiner Datenbank freigeben. Wer weiss, was dann alles angerichtet werden kann? Ausserdem blick ich ja selbst bei den vielen Accounts kaum noch durch.

Mit einem Javascript, dass Spameinträge vorweg verhindert, braucht man gar nicht zu putzen.
Es ist schon so wie Polonius irgendwo hier im Thread geschrieben hatte. Du hängst immer einen Schritt hinterher, wenn Spameinträge überhaupt erst zugelassen werden.

Gruss

Bernd R. Rickert

editiert: Jetzt benutz ich schon dieses Vorschauoption und trotzdem muss trotzdem immer umschreiben.
mad.gif
 
QUOTE
So ein kurzes Script kann man auch automatisch einfügen.


Nein denke ich nicht. Wie stellst du dir das vor?


QUOTE
Einfach einmal am Tag ein Klick zu einer Putzkolonne ist sicher komfortabler.


Nein, wie gesagt würde ich das Script vom Server durch einen Corn-Job alle 10 Minuten aufrufen.

Der Cron-Job macht einfach einen normalen HTTP-Request auf

http://www.einewebsite.de/AntiSpam-Script.php

(Das erste mal wird das Script vom User aufgerufen, um die Einstellungen für die Datenbank zu machen.)


QUOTE
Allerdings müsstest du mit einem notwendigen Zugriff auf die Datenbank eine ziemliche Hemmschwelle überwinden. Ich würde nicht ohne weiteres ein Account auf meiner Datenbank freigeben. Wer weiss, was dann alles angerichtet werden kann? Ausserdem blick ich ja selbst bei den vielen Accounts kaum noch durch.


Nein das stimmt nicht. Das AntiSpam-Script.php ist nur etwa 30 Zeilen und macht selbst die Datenbank-Abfragen lokal. Im Script sieht man auch, dass da nichts an Passwörtern oder ähnlichem übermittelt wird. Praktisch jedes lokale PHP-Script hat Zugriff auf die Datenbank -> also ganz normal.

Es werden nur die Gästebucheinträge via SOAP-Client zur Überprüfung auf meinen Server übermittelt.

Gruess,
Joel
 
Ich weiß gar nicht warum ihr überhaupt Links zulassen wollt. Ich haben mal testweise einen "Harvester" in ColdFusion geschrieben der mir über 20 000 Mailadressen an einem Tag in eine datenbank geschrieben hat. Und Gästebücher sind hierfür die dankbarsten "Opfer".
Einfach "Das eintragen von Links wird als Spam gelöscht" in den Gästebuchheader und alle Tags die "http:" oder "@" enthaltenn nicht ins gästebuch eintragen.

Weitere Lösung
Um automatisierte spams zu filtern zwingt die Gäste von einem Link ein bestimten String zu schreiben. Aus diese anweiseung können automatisierte Spams nicht reagieren.

Gruß Ronny
 
Zurück
Oben