Neue Kampfansage gegen Spambot-Registrierungen
Verfasst: 26.11.2006 15:57
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:
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:
Ersetze mit:
Nach erfolgter Registrierung soll nun ein neuer Fedname generiert werden.
Suche:
Danach einfügen:
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:
Danach einfügen:
Dieser Platzhalter muss jetzt noch ins Template rein:
Öffne templates/subSilver/profile_add_body.tpl
Suche:
Ersetze mit:
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:
Davor einfügen:
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. 
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
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')
Öffne includes/usercp_register.php
Suche:
Code: Alles auswählen
$username = ( !empty($HTTP_POST_VARS['username']) ) ? phpbb_clean_username($HTTP_POST_VARS['username']) : '';
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
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);
}
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
Nun fehlt noch der Platzhalter für das Template:
Suche:
Code: Alles auswählen
$template->assign_vars(array(
'USERNAME' => isset($username) ? $username : '',
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
Ö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>
Code: Alles auswählen
<td class="row2"><input type="hidden" name="{REGISTER_USERNAME_FIELD}" value="{USERNAME}" /><span class="gen"><b>{USERNAME}</b></span></td>
Ö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');
Code: Alles auswählen
if ($HTTP_POST_VARS['username'])
{
sleep (20);
message_die(GENERAL_MESSAGE, 'You are a Spambot', '', __LINE__, __FILE__);
}

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