PHP Spammails verhindern?

Gamer20

Lieutenant
Registriert
Dez. 2005
Beiträge
515
Hi!

Ich habe eine Community mit Anmeldezwang. D.h. nur reg. Benutzer kommen in den Mitgliederbereich. Die Anmeldung erfolgt über einen Aktivierungscode der eingegeben werden muß.

Das bedeutet für mich, das es kein Bot ist, der die Postfächer voll macht.

Weiterhin ist mir aufgefallen das nicht soviele Mails raus gehen, wie Mitglieder vorhanden sind (das man denken könnte das an JEDES mitglied in der DB eine PN gesendet wird).

Ich vermute daher, das die Person die hier manipuliert, über die Mitgliedersuche sich die Personen anzeigen läßt (je nachdem welche Kriterien in der Suchmaske angegeben werden).

Von dort aus sich die UserID's zieht und dann an das Script, für die Speicherung der Nachrichten, per Schleife die Nachrichten sendet.

Injections vermute ich nicht, da ich 1. die Fehlercodeanzeige deaktiviert habe:

Code:
ini_set('display_errors', FALSE);

und 2. alle Zeichen Escape

Code:
if(isset($_POST['PN'])) {$Kom = mysql_real_escape_string($_POST['PN']);} else {$Kom='';}

Daher mein Frage, wie kann ich es zu 99% verhindern, das solche Nutzer mir das legel schwer machen?

Da es ein Mensch sein wird, denke ich nicht, das es was bringt, ein paar fake Inputfelder zu erzeugen.

Das Problem wird sein, das man per Firebug usw. sich alles anzeige lassen kann (welche Datei aufgerufen wird und was sie ausgibt).

Wie machen die großen Seiten das? (Neu.de, Facebook und was es sonst noch so gibt?).

Oder ich muß mein Konzept ändern und es dürfen nur Nachrichten geschrieben werden, an Personen die man in der Kontaktliste hat. Aber da ich kein soziales Netzwerk habe, wäre das ja auch doof.

Ich dachte erst an eine Abfrage, wieviel Nachrichten in 1 Minute geschrieben wurden und ich dann ein Captcha einbaue (wenn es mehr als 5 Stück pro Minute sind, dann haue sperre rein bzw. eine manuelle Abfrage).

Und die 6. Nachricht erst versendet wird, wenn der Code korrekt eingegeben wurde.

Oder was gibt es noch für Möglichkeiten?

Den Code verbergen, so was man es per Firebug net auslesen kann?
Wie mache ich das?

mfg
 
der email versandt, der dir als spam vorkommt, kommt also von einem registriertem user, nicht von einem gast?
warum loggst du das mailversenden nicht in eine zb. datenbank mit uhrzeit, datum, nachricht, ip, browser usw.
um erstmal zu sehen ob es spam ist oder ob es sich wirklich um einen regen verkehr untereinander handelt.

weiterhin würde ich bei einer community nach außen nicht auf user id setzen, sondern mit benutzernamen arbeiten.
gerade wegen dieser manipulation. säubere deine urls mit ein paar RewriteRules, lass deine parameter nicht in der url für alle sichtbar ...
 
Also Spam ist es def.! Da 1. in engl. und 2. immer der selbe Text. Wer schreibt denn 100 Nachrichten oder mehr an unterschiedliche Personen mit dem selben Text in kurzer Zeit?

Denn meine Seite ist nur für deutsche Nutzer und außerdem gibt es keine "Gast" Funktion. Wer nicht reg. ist, kommt nicht rein.

OK ich könnte den Usernamen ausgeben (im Suchergebnis) und dann beim Formular um eine PN zu schreiben, anhand des Nutzernamens die ID auslesen und diese an das "speichern" Script mit senden.

Was ich noch mit hinzufügen muß, das aufrufen des PN Formulars erfolgt per Javascript und das versenden am Ende per Ajax.

Ich logge die IP Adresse, Browser und Uhrzeit beim Login mit.
 
Nochmal zum Verständnis: Es handelt sich um reine PNs innerhalb einer Community, die nur als registrierter Benutzer nutzbar ist? Es erhalten viele User Spam-PNs von einem anderen User? Oder kommen diese von versch. Accounts?

Wie sicher kannst du dir sein, dass es kein Bot ist? Nur, weil du eine Aktivierung per Mail erzwingst? Gibt es Captchas bzw. sonstige Bot-Sperren? Captchas sind eig nicht mehr wirklich sicher und auch schlecht für die User. Am besten arbeitet man mit Fragen, wie es hier auch auf CB der Fall ist. D.h., ein User muss zur Registrierung eine Frage richtig beantworten. Seitdem habe ich in meinem kleinen Forum keine Bot-Anmeldungen mehr.

Oder habe ich hier etwas falsch verstanden?
 
Nur mal so als Frage:
Hast du den Ajax-Call abgesichert? Sodass keiner einfach freudestrahlend an das ajax-script seine Requests schicken kann?

Ansonsten: Stell doch einfach ein: Max 5 Mails pro Stunde.
Was mich interessiert: loggst du auch den Usernamen des Senders mit? Wenn ja, hau den raus.
 
nein alles korrekt verstanden. ok ich probiere das mal mit den fragen (matheaufgaben oder allgemeine fragen).

was mir nur aufgefallen ist, wenn die stadt (wohnort) und das bundesland angegeben wird, sind diese werte immer identisch. bei "hamburg" mag es noch gehen, aber bei "brandenburg" ist es quatsch (bei dem städtenamen).

ok ich muß mir echt mal eine platte machen. aber das mit dem nutzernamen und dann erst die id raus finden, könnte man doch trotzdem machen oder wäre das sinnlose arbeit?

äh das ist zwar jetzt eine doofe frage, aber wie sichere ich ein ajax request ab? im empfangendem script prüfe ich die session mit dem entsprechendem benutzer etc. in der datenbank, ob die werte stimmen, wenn nicht, erfolgt abbruch und die weiterleitung zur startseite.

im moment speichere ich bei den emails nur die nutzerid des senders und dann des empfängers, die nachricht und den timestamp.
 
Zuletzt bearbeitet:
Wenn du die NutzerID hast kannste den Nutzer ja mal anhauen, ob er das bewusst macht.
Da du ja selber sagst, dass es nur jmd von Intern sein kann, hast du ja die NutzerID.

Was ich mit absicher meine:
Es ist kein Witz, sowas finde ich immer wieder bei Neukunden: z.B. ein Contact-Form, welches nur prüft, ob eine Message geschickt wird, und pumpt dann die Mail raus. Wenn du jedoch sagst, du würdest den Nutzer gegen prüfen glaub ich dir das einfach mal ;)

Das mit den Abfragen hilft ja nur gegen Bots, welche ja eigentlich nicht existieren dürften ;) Es handelt sich sicherlich um die von die in deiner Signatur angegeben Site oder? Wenn man nun youtube trauen darf (ca. 1000 likes) wirst du wahrscheinlich auch schon ein paar tausend User haben.

Die Abfragen bei jeder Mail halte ich für nicht sinnvoll. Damit bekämpft man die Auswirkung und nicht die Ursache. Fragen machen dementsprechend bei der Registrierung Sinn. Da dann allgemeine Fragen und keine Matheaufgaben ;) Solche Matheaufgaben sind für die entsprechenden Bots recht simple Zeitvertreibe für nen paar ms. Danach wird munter weiter gefeuert.

Langfristig gesehen halte ich die Idee, Usernamen darzustellen für ein zweischneidiges schwert. Einerseits macht es das ganze schön lesbar, jedoch macht es die Website langsam. Wenn man nun von ein paar tausend Request in der Sekunde ausgeht, dann ist eine Stringoperation + SQL-Abfrage um dann eine ID zu haben viel zu Performance-lastig.

Pick dir die Leute raus, die massig Mails verschicken (kannste ja als Cron einmal in der Stunde laufen lassen) und pick dir alle Messages(die Anzahl natürlich^^) pro User und ordne diese absteigend. daraus kannste dann ein relativ deutliches Bild abzeichnen, welche User spamen und welche sich normal verhalten. Wenn jemand offensichtlich spamt, dann packste dem nen Delay drauf. Zusätzlich würde ich noch nen "Spam-Melde-Knöpfchen" integrieren, sodass User aktiv spam melden können. Ab z.B. 10 Meldungen wegen Spam wird dann ein User vorerst gesperrt.
 
danke für deine infos. einen spamlink für die nutzer (immer in jeder mail vorhanden) gibt es.

also habe ich techn. keine möglichkeit weiter, gegen den spam vorzugehen (nur gegen bots, aber net gegen menschen).

tja dann muß ich wohl wirklich alles manuell machen. auf jedenfall muß eine sperre zwischendurch rein (nur eine bestimmte anzahl pro stunde oder minute an nachrichten), kann ja nicht jede minute in der DB nachschauen.

wenn wir diese idioten von spamern nicht hätten, würden wir alle ruhiger schlafen, aber leider gibt es leute, die anderen immer schaden müssen.
 
Gamer20 schrieb:
kann ja nicht jede minute in der DB nachschauen.
Was hindert dich bzw. deine Cronjobs?

Aber du könntest tatsächlich eine Verzögerung einbauen. Neulinge haben dabei eine starke Limitierung und je länger jemand in der Community dabei & tätig ist, desto mehr Freiheiten hat er.
 
die cronjobs hintern mich net, dachte nur es gibt programmiertechn. möglichkeiten gegen den spam vorzugehen.

gibt es eine möglichkeit von jquery aus, einen code beim ajax aufruf mitzusenden? meine JS dateien habe ich "verschlüsselt" UND komprimiert (natürlich nur die dateien auf dem server, nicht meine lokalen dateien). ganz verschlüsseln geht ja nicht, sonst könnten die browser es nicht lesen.

das ich zumindest sehe, ob der spamer direkt das speichern script von einem fremden script aufruft oder direkt über meine js dateien?

das mit den einschränkungen für neue mitglider ist eine gute idee, werde das schonmal auf meine liste setzen.
 
Naja, es gibt programmiertechnische Möglichkeiten ;)
Eine, die wie ich finde, sinnvoll ist und auch relativ "moderat" in der Umsetzung ist ein cronjob, der sich ein Ranking der Leute packt und diese Auswertet und exorbitante Mail-Verschickung gesondert behandelt ( Kein normaler Mensch verschickt pro tag z.B. 500 Mails (sofern ihr einen Chat habt) :P). Dann kannst du ja ein Flag beim User setzen, dass er bei der nächsten Mail erstmal eine Frage beantworten muss (sinnvollerweise eine Logische Frage á la "Welche Farbe hat Gras im Frühling?" Antwort: "Grün"). Dann darf er munter weiter mit seiner Angebeteten schreiben :)
Damit könntest du Bots ziemlich dazwischen grätschen. Die Fragen sollten natürlich variieren ;)
 
ja genau, sowas werde ich wohl mal einbauen. ich brauche ja nur im script die mitteilungen zählen und wenn es mehr als x sind (in einem bestimmten zeitraum), dann kommt ein "frage antwort" spiel.

danke, das versuche ich mal umzusetzen.
 
Wie sind denn nun diese Spammails definiert? Melden sich Nutzer regulär und schreiben an möglichst viele Personen die gleiche Nachricht? Welche Charateristiken haben die Spammails?

Du könntest fernab des Rate Limiting eben auch Spam-Klassifikation einbauen. Z.B. Mit einem Bayes-Klassifikator wie er u.A. auch beim Email-Spam stattfindet, oder eben (eventuell auf genau dein Problem bezogen) erkennen, dass die immer identische Nachricht an viele Mitglieder verschickt wird. Außer bei Kettenmails fällt mir keine Begründung dafür ein.
Zusammen mit einem "Trustscore" für jedes Mitglied (wielange schon aktiv, usw.) kann man da schon Lösungen fernab des simplen Rate Limiting bauen.

Ein Beispiel: Der typische Spammer, der sich vor 5min erst angemeldet hat, hat natürlich einen TrustScore von 0.0 (er hat ja praktisch noch nichts [über einen längeren Zeitraum] auf deiner Seite gemacht), schickt dieser nun eine identische Mail an viele Mitglieder hast du einen hohen Spamverdacht mit einem niedrigen TrustScore des Nutzers: du hast erfolgreich Spam erkannt.

Für eine effektive Spambekämpfung brauchst du eben mehreres, also dein Rate Limiting, die aktive Spamerkennung und die Möglichkeit für Nutzer Nachrichten als Spam zu flaggen. Mit diesen 3 Systemen solltest du das Problem ziemlich gut im Griff haben.
 
Zurück
Oben