Neue Kampfansage gegen Spambot-Registrierungen

In diesem Forum können Mod-Autoren ihre Mods vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Benutzeravatar
Hamlet
Mitglied
Beiträge: 5
Registriert: 09.05.2004 09:17

Neue Kampfansage gegen Spambot-Registrierungen

Beitrag von Hamlet »

Automatisierte Registrierungen von Spambots sind ja ein immer grösser werdendes Ärgernis. Solche Werkzeuge hier werden verwendet:
http://www.botmaster.net/more1/
Visual Confirmation und Activation-Code per Mail taugen da auch nicht mehr viel, denn diese Tools beherrschen auch das:
http://www.botmaster.net/pictocod/

Ich habe mich deshalb zu einem neuen und hoffentlich effektiveren Weg durchgerungen. Die Grundidee dabei ist die, dass ich die Feldnamen im Registrierungsformular ändere. Nun denke ich jedoch, es mach wenig Sinn, diese Feldnamen einmalig zu ändern. Da ist es dann nur eine Frage der Zeit, bis die Spambots das mitkriegen. Ich ändere also nach jeder Registrierung die Feldnamen, so dass ich dynamische Feldbezeichner im Registrierungsformular habe.

Und so mache ich das:
In der Tabelle phpbb_config unter Verwendung von PhpMyAdmin folgendes SQL-Statement ausführen:

Code: Alles auswählen

INSERT INTO phpbb_config (config_name, config_value) VALUES ('register_username',  'neuerusername')
Die common.php übernimmt ab jetzt diesen Wert in das Array $board_config[]. Jetzt muss dieser Feldname natürlich noch ins Registrierungsformular rein:
Öffne includes/usercp_register.php
Suche:

Code: Alles auswählen

	$username = ( !empty($HTTP_POST_VARS['username']) ) ? phpbb_clean_username($HTTP_POST_VARS['username']) : '';
Ersetze mit:

Code: Alles auswählen

// dynamischer Feldname für Registrierung - Formularfeldname
	$username = ( !empty($HTTP_POST_VARS[$board_config['register_username']]) ) ? phpbb_clean_username($HTTP_POST_VARS[$board_config['register_username']]) : '';
// dynamischer Feldname für Registrierung - Formularfeldname
Nach erfolgter Registrierung soll nun ein neuer Fedname generiert werden.
Suche:

Code: Alles auswählen

			if ( !($result = $db->sql_query($sql, BEGIN_TRANSACTION)) )
			{
				message_die(GENERAL_ERROR, 'Could not insert data into users table', '', __LINE__, __FILE__, $sql);
			}
Danach einfügen:

Code: Alles auswählen

// dynamischer Feldname für Registrierung - Neuen Feldnamen generieren
			$rand_username_length = 12;
			$string_letters = "abcdefghijklmnopqrstuvwxyz";
			$rand_username = "";
			for ($i=0; $i<$rand_username_length; $i++) $rand_username .= substr($string_letters, rand(0,25), 1);
			$sql = "UPDATE " . CONFIG_TABLE . " SET config_value  = '" . $rand_username . "' WHERE config_name = 'register_username'";
			if ( !$db->sql_query($sql) )
			{
				message_die(GENERAL_ERROR, 'Could not change Registration-Field-Names', '', __LINE__, __FILE__, $sql);
			}
// dynamischer Feldname für Registrierung - Neuen Feldnamen generieren
Die Variable $rand_username_length kann hier natürlich bis maximal 255 erhöht werden.

Nun fehlt noch der Platzhalter für das Template:
Suche:

Code: Alles auswählen

	$template->assign_vars(array(
		'USERNAME' => isset($username) ? $username : '',
Danach einfügen:

Code: Alles auswählen

// dynamischer Feldname für Registrierung - Template-Platzhalter
		'REGISTER_USERNAME_FIELD' => $board_config['register_username'],
// dynamischer Feldname für Registrierung - Template-Platzhalter
Dieser Platzhalter muss jetzt noch ins Template rein:
Öffne templates/subSilver/profile_add_body.tpl
Suche:

Code: Alles auswählen

		<td class="row2"><input type="hidden" name="username" value="{USERNAME}" /><span class="gen"><b>{USERNAME}</b></span></td>
Ersetze mit:

Code: Alles auswählen

		<td class="row2"><input type="hidden" name="{REGISTER_USERNAME_FIELD}" value="{USERNAME}" /><span class="gen"><b>{USERNAME}</b></span></td>
Ab jetzt sollte ein Spambot daran zu erkennen sein, dass er sich mit dem Formularfeld "name="username"" zu registrieren versucht. Wenn man jetzt lustig ist, kann man das z.B. so abfangen:
Öffne includes/usercp_register.php
Suche:

Code: Alles auswählen

	$trim_var_list = array('cur_password' => 'cur_password', 'new_password' => 'new_password', 'password_confirm' => 'password_confirm', 'signature' => 'signature');
Davor einfügen:

Code: Alles auswählen

	if ($HTTP_POST_VARS['username'])
	{
		sleep (20);
		message_die(GENERAL_MESSAGE, 'You are a Spambot', '', __LINE__, __FILE__);
	}
Nun wartet der Bot erst mal 20 Sekunden und kriegt dann die Meldung, dass er ein Spammer sei. Innerhalb dieser IF-Schleife kann man natürlich noch viel bösere Sachen mit dem Spambot anstellen, wers drauf hat, kann den Spammer in ein nettes Teergrüblein senden. :wink:

So, ich habe das mal so in einem meiner Boards eingebaut und beobachte jetzt, was passiert. Wers ausprobieren will, soll das tun, aber nicht vergessen, erst die Dateien, die verändert werden zu backupen.
Für Verbesserungsvorschläge, Hinweise, Anmerkungen und Ratschläge bin ich natürlich dankbar.

Greetz
Hamlet
senyafin
Mitglied
Beiträge: 626
Registriert: 02.06.2006 15:01
Kontaktdaten:

Beitrag von senyafin »

Ich habe war wenig Ahnung vom Coden umso mehr jedoch Probleme mit den Bots. Vor allem seit zwei Wochen ist eine wahre Invasion zu verzeichnen.

Vielen Dank für die Modifikation,
ich werde das die Tage bei mir mal integrieren und gebe Bescheid ob es die Flut etwas eindämmt.
Benutzeravatar
tas2580
Ehemaliges Teammitglied
Beiträge: 3029
Registriert: 01.07.2004 05:42
Wohnort: /home/tas2580
Kontaktdaten:

Beitrag von tas2580 »

Die gleiche Idee hatte ich auch schon mal *klick*. Allerdings hab ich das auch für die Formularfelder beim posten gemacht, so kann man auch wieder Gäste in den Foren posten lassen ohne dass man von Bots überrannt wird. Das mit den geänderten Namen funktioniert übrigends sehr gut und der normale Besucher bekommt nichts davon mit.
Heute ist ein guter Tag um dein Forum zu testen.
Ehemaliger Benutzername: [BTK] Tobi
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag von MagMo »

Hi,

theoretisch gut, praktisch hat die Sache 2 Hacken.

1) Dein zufälliger Variablenname ist 12 Zeichen lang. Du schließt mit deiner Modifikation aber nicht aus, dass ein vorhandener Feldname doppelt verwendet wird. In einem Standard-phpBB gibt es z.B. das Feld "allowsmilies" mit genau 12 Zeichen. Deine zufällige Feldbezeichnung könnte auch allowsmilies heißen. Das ist zwar unwahrscheinlicher als ein 6er im Lotto, aber dennoch unsauber gelöst.
Außerdem wer kennt schon alle MODs und weiß welche Feldname mit 12 Zeichen die alle verwenden. Du solltest in dem Zusammenhang also darauf hinweisen, dass man solche Feldbezeichnungen auch ausschließen sollte.

2) Bei wenig besuchten Boards tritt das Problem sicher nicht auf. Aber folgende Situation:
Ein Besucher füllt gerade das Registrierungsformular aus. Ein zweiter findet dein Forum ebenfalls toll, will sich auch registrieren und ruft das Registrierungsformular auf. In beiden Formularen hat das Feld nun die selbe Bezeichnung. Nun schickt der erste seine Registrierung ab. Damit wird die alte Feldbezeichnung automatisch ungültig. Was passiert nun, wenn der zweite Besucher seine Registrierung abschickt? Der Feldname in seinem Formular ist ja nicht mehr gültig.

Grüße
MagMo
Meine MODs
Kein Support via PN!
Benutzeravatar
Hamlet
Mitglied
Beiträge: 5
Registriert: 09.05.2004 09:17

Beitrag von Hamlet »

Hi MagMo,

da gebe ich Dir natürlich in beiden Fällen recht. 8)
Und es ist nicht so, dass ich über diese beiden Probleme noch nicht nachgedacht hätte, und es rumoren auch bereits Lösungsansätze im Hinterkopf rum.

1. doppelt verwendete Feldnamen:
In all meinen Boards habe ich den CustomReg-Mod drin, das ist der, wo bei der Registrierung nur Benutzername, Mailadresse und Passwort angegeben werden kann. Nun geht meine Idee dahin, dass INSERT-Statement in der usercp_register.php dahingehend zu modifizieren, dass eben nur gerade die Formularfelder an die Datenbank übergeben werden, die auch wirklich im Formular drin sind. Das heisst, es braucht da eine IF-Schleife, die prüft, ob mode=register oder nicht. Nun müsste natürlich die USERS_TABLE auf Felder geprüft werden, die NOT_NULL sind. Diesen müsste ein Standardwert zugeordnet werden. Das heisst, die USERS_TABLE modifizieren.
Das Schmalhans-Formular des CustomReg-Mod enthält ja nun nicht sooo viele Felder, dass es nicht in den Griff zu kriegen wäre, zumal ein Mod, der das Profil betrifft im CustomReg-Mod nichts verloren hat.
OK, ist auch noch nicht perfekt, könnte aber klappen.

2. Fehler bei gleichzeitiger Registrierung
Da habe ich jetzt noch keine coole Lösung. Gut, man kann den Fehler auffangen indem man:
Öffne includes/usercp_register.php
Suche:

Code: Alles auswählen

	$username = ( !empty($HTTP_POST_VARS[$board_config['register_username']]) ) ? phpbb_clean_username($HTTP_POST_VARS[$board_config['register_username']]) : '';
Danach einfügen:

Code: Alles auswählen

if ($username == "")
{
	message_die(GENERAL_MESSAGE, 'Fehler! Versuchen Sie es nochmal bla bla bla', '', __LINE__, __FILE__);
}
... oder so ähnlich. OK, nicht die feine englische Art, aber wenn ich bedenke, wie manches Posting ich schon zwei mal schreiben musste, bloss weil just beim Absenden der Server grade nicht erreichbar war. :lol:

Also wie gesagt, verbessern lässt es sich auf alle Fälle, aber es steht in meiner To-Do-Liste nicht gerade zu vorderst. :wink:

Grüsse und n schönen Abend
Hamlet
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag von fanrpg »

Deine 2. Lösung ist aber auch unsauber. :-?
Wenn das passieren sollte wären alle anderen Felder normalerweise wieder frei.

Lieber so:

Code: Alles auswählen

if( empty($username) )
{
$error = true;
$error_msg = ( ( isset($error_msg) ) ? '<br />' : '' ) . "Bitte fülle das Feld Benutzername noch einmal aus";
}
Benutzeravatar
Hamlet
Mitglied
Beiträge: 5
Registriert: 09.05.2004 09:17

Beitrag von Hamlet »

Na siehste, kommt doch. Noch ein wenig Feinarbeit dann ist es schon bald ein Mod. :D

Hamlet
Antworten

Zurück zu „phpBB 2.0: Mods in Entwicklung“