Einfache Methode, automatische Registrierungen zu verhindern
Verfasst: 14.05.2006 09:46
Mich hat es wahnsinnig geärgert, dass sich bei mir immer mehr automatische Registrierungen durch Bots trotz aktivierter visueller Bestätigung anhäuften...
Als ich bemerkte, dass sich die ersten sogar per E-Mail erfolgreich aktivierten, wollte ich endlich etwas dagegen unternehmen und hab mir hier im Forum verschiedene Lösungsansätze angeschaut, die mich aber alle nicht vollends überzeugt haben: Entweder waren dann die Bestätigungs-Codes nur noch schwer zu erkennen/erraten, oder die nötigen Änderungen am PHP-Code erschienen mir einfach viel zu überdimensioniert und umständlich für dieses "kleine" Problem.
Also habe ich mir in meinen Server-Logs die Registrierungen der Bots näher angeschaut, wobei mir eines aufgefallen ist: Allesamt haben sie vorher keine andere Seite besucht, sondern sind zuallererst direkt auf die Seite /profile.php?mode=register&agreed=true gegangen, um dann das Bild mit dem Bestätigungs-Code nachzuladen.
/profile.php?mode=register&agreed=true wurde in allen Fällen allerdings immer nur via GET angefordert, was mich auf eine Idee brachte: Die einfachste Lösung ist es doch, ein "true" der Variable "agreed" nur noch via POST-Übergabe zu akzeptieren. Dazu musste ich nur die folgende kleine Änderung in /includes/usercp_register.php durchführen:
Suche: und ersetze mit:
Dann muss nur noch das Template der Registrierungs-Seite angepasst werden, dass "agreed" auch via POST anstatt nur mit GET (also durch ein hidden-input-Feld anstatt bloß durch Anhängen an die URL) gesetzt wird.
Das geht am besten, indem die Text-Links für "Ich stimme zu / Ich stimme nicht zu" durch anklickbare Formular-Buttons ersetzt werden.
Ich benutze das (leicht modifizierte) subSilver-Template, bei dem dafür folgende Änderungen in /templates/subSilver/agreement.tpl nötig sind:
Suche: und ersetze mit:
Da ja innerhalb von Buttons keine extra Schrift-Formatierungen via HTML funktionieren, sollte entweder die entsprechende Stelle in der /language/lang_german/lang_main.php insofern abgeändert werden, dass die <b></b>-Formatierungen entfert werden, also z.B. in , oder aber {AGREE_OVER_13} wird direkt im Template agreement.tpl durch den gewünschten Text ersetzt...
Mehr Änderungen sind nicht nötig, und seitdem sind keine automatischen Bot-Registrierungen mehr aufgetreten (obwohl sie es nach wie vor immer noch fleißig versuchen, wie ich es an meinen Server-Logs sehen kann... vergeblich
)
Um zu sehen, ob die Änderungen bei euch geklappt haben, testet es dann einfach mal und gebt [euerForum]/profile.php?mode=register&agreed=true direkt in die Adresszeile ein: Nun sollte trotz &agreed=true immer nur noch die Seite geladen werden, wo man die Bedingungen erst noch akzeptieren muss. Erst wenn man wirklich auf das Formular-Button "Ich akzeptiere" klickt, gelangt man (oder der böse Regsitrierungs-Bot) auf die "richtige" Registrierungsseite.
Nichtsdestotrotz die übliche Warnung: Macht erst Backups, bevor ihr meine Änderungen durchführt.
Wichtig: Die visuelle Bestätigung durch Code-Eingabe sollte trotz Änderungen weiterhin aktiv bleiben, damit (ältere) Registrierungs-Bots, die es noch direkt via POST versuchen, weiterhin abgeblockt werden!
Als ich bemerkte, dass sich die ersten sogar per E-Mail erfolgreich aktivierten, wollte ich endlich etwas dagegen unternehmen und hab mir hier im Forum verschiedene Lösungsansätze angeschaut, die mich aber alle nicht vollends überzeugt haben: Entweder waren dann die Bestätigungs-Codes nur noch schwer zu erkennen/erraten, oder die nötigen Änderungen am PHP-Code erschienen mir einfach viel zu überdimensioniert und umständlich für dieses "kleine" Problem.
Also habe ich mir in meinen Server-Logs die Registrierungen der Bots näher angeschaut, wobei mir eines aufgefallen ist: Allesamt haben sie vorher keine andere Seite besucht, sondern sind zuallererst direkt auf die Seite /profile.php?mode=register&agreed=true gegangen, um dann das Bild mit dem Bestätigungs-Code nachzuladen.
/profile.php?mode=register&agreed=true wurde in allen Fällen allerdings immer nur via GET angefordert, was mich auf eine Idee brachte: Die einfachste Lösung ist es doch, ein "true" der Variable "agreed" nur noch via POST-Übergabe zu akzeptieren. Dazu musste ich nur die folgende kleine Änderung in /includes/usercp_register.php durchführen:
Suche:
Code: Alles auswählen
if ( $mode == 'register' && !isset($HTTP_POST_VARS['agreed']) && !isset($HTTP_GET_VARS['agreed']) )
Code: Alles auswählen
if ( $mode == 'register' && !isset($HTTP_POST_VARS['agreed']) )
Das geht am besten, indem die Text-Links für "Ich stimme zu / Ich stimme nicht zu" durch anklickbare Formular-Buttons ersetzt werden.
Ich benutze das (leicht modifizierte) subSilver-Template, bei dem dafür folgende Änderungen in /templates/subSilver/agreement.tpl nötig sind:
Suche:
Code: Alles auswählen
<td><span class="genmed"><br />{AGREEMENT}<br /><br /><br /><div align="center"><a href="{U_AGREE_OVER13}" class="genmed">{AGREE_OVER_13}</a><br /><br /><a href="{U_INDEX}" class="genmed">{DO_NOT_AGREE}</a></div><br /></span></td>
Code: Alles auswählen
<td><span class="genmed"><br />{AGREEMENT}<br /><br /><br /><div align="center"><form method="post" action="{U_AGREE_OVER13}"><input type="hidden" name="agreed" value="true"><input type="submit" class="mainoption" style="width:700px; border:2px solid" value="{AGREE_OVER_13}"></form><br /><form method="post" action="{U_INDEX}"><input type="submit" class="mainoption" style="width:700px; border:2px solid" value="{DO_NOT_AGREE}"></form></div><br /></span></td>
Code: Alles auswählen
$lang['Agree_over_13'] = 'Ich bin mit den Konditionen dieses Forums einverstanden und MINDESTENS 12 Jahre alt.';
Mehr Änderungen sind nicht nötig, und seitdem sind keine automatischen Bot-Registrierungen mehr aufgetreten (obwohl sie es nach wie vor immer noch fleißig versuchen, wie ich es an meinen Server-Logs sehen kann... vergeblich

Um zu sehen, ob die Änderungen bei euch geklappt haben, testet es dann einfach mal und gebt [euerForum]/profile.php?mode=register&agreed=true direkt in die Adresszeile ein: Nun sollte trotz &agreed=true immer nur noch die Seite geladen werden, wo man die Bedingungen erst noch akzeptieren muss. Erst wenn man wirklich auf das Formular-Button "Ich akzeptiere" klickt, gelangt man (oder der böse Regsitrierungs-Bot) auf die "richtige" Registrierungsseite.
Nichtsdestotrotz die übliche Warnung: Macht erst Backups, bevor ihr meine Änderungen durchführt.
Wichtig: Die visuelle Bestätigung durch Code-Eingabe sollte trotz Änderungen weiterhin aktiv bleiben, damit (ältere) Registrierungs-Bots, die es noch direkt via POST versuchen, weiterhin abgeblockt werden!