Appurato che i bots riescono, probabilmente con un algoritmo di ocr, ad eludere la conferma del Codice Visuale... ho pensato di aggiungere un meccanismo nuovo in fase di registrazione in modo da confonderli.
Si tratta di una formula, generata casualmente ad ogni tentativo di registrazione, per la quale l'utente deve calcolare il risultato e digitarlo nell'apposito campo:

Ho deciso di visualizzare i numeri in formato alfabetico per cercare di confondere il più possibile l'eventuale interpretazione da parte dei bots.
Attualmente la formula è fissa, cioè A * B + C dove A, B e C sono numeri generati casualmente ad ogni tentativo di registrazione. Sto già lavorando sulla nuova versione di questa MOD con la quale sarà possibile parametrizzare il numero delle variabili casuali e gli operatori in gioco.
Spero che la provate in tanti e mi fate sapere se funziona (cioè se non si registrano più i bots, di per se la MOD l'ho testata approfonditamente e non da alcun problema).
Consapevole che prima o poi i bots riusciranno, in qualche modo, anche a raggirare questo sistema... nel frattempo godiamocela, poi ne inventeremo un'altra.
Fatemi sapere.
- Codice: Seleziona tutto
##############################################################
## MOD Title: AntiBot Registration
## MOD Author: Davide Catini < davide@catini.it > www.catini.it
## MOD Description: Blocca la registrazione dei Bots
## MOD Version: 1.0
##
## Installation Level: Easy
## Installation Time: 10 Minutes
## Files To Edit: 3
## - includes/usercp_register.php
## - templates/subSilver/profile_add_body.tpl
## - language/lang_italian/lang_main.php
##
## License: http://opensource.org/licenses/gpl-license.php GNU General Public License v2
##############################################################
## Author Notes:
##
## Per il momento la formula è fissa: A * B + C
## Nella prossima versione la formula sarà parametrizzabile
## tramite ACP.
##
##############################################################
## MOD History:
##
## 2007-03-29 - Version 1.0
## - First public release.
##
##############################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################
#
#-----[ SQL ]------------------------------------------
#
# Remember to change the table prefix used on your database
ALTER TABLE `phpbb_confirm` ADD `davec_result` CHAR( 6 ) NOT NULL;
#
#-----[ OPEN ]------------------------------------------
#
includes/usercp_register.php
#
#-----[ FIND ]------------------------------------------
#
$strip_var_list = array('email' => 'email', 'icq' => 'icq', 'aim' => 'aim', 'msn' => 'msn', 'yim' => 'yim', 'website' => 'website', 'location' => 'location', 'occupation' => 'occupation', 'interests' => 'interests', 'confirm_code' => 'confirm_code');
#
#-----[ IN-LINE FIND ]------------------------------------------
#
);
#
#-----[ IN-LINE BEFORE, ADD ]------------------------------------------
#
, 'davec_result' => 'davec_result'
#
#-----[ FIND ]------------------------------------------
#
$sql = 'SELECT code
#
#-----[ REPLACE WITH ]------------------------------------------
#
$sql = 'SELECT code, davec_result
#
#-----[ FIND ]------------------------------------------
#
if ($row['code'] != $confirm_code)
{
$error = TRUE;
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['Confirm_code_wrong'];
}
#
#-----[ AFTER, ADD ]------------------------------------------
#
elseif ($row['davec_result'] != $davec_result)
{
$error = TRUE;
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['davec_result_wrong'];
}
#
#-----[ FIND ]------------------------------------------
#
$confirm_id = md5(uniqid($user_ip));
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Generate the davec formula
$davec_n1 = mt_rand(1,9);
$davec_n2 = mt_rand(1,9);
$davec_n3 = mt_rand(1,9);
switch( $davec_n1 )
{
case 1:
$davec_c1 = 'one';
break;
case 2:
$davec_c1 = 'two';
break;
case 3:
$davec_c1 = 'three';
break;
case 4:
$davec_c1 = 'four';
break;
case 5:
$davec_c1 = 'five';
break;
case 6:
$davec_c1 = 'six';
break;
case 7:
$davec_c1 = 'seven';
break;
case 8:
$davec_c1 = 'eight';
break;
case 9:
$davec_c1 = 'nine';
break;
}
switch( $davec_n2 )
{
case 1:
$davec_c2 = 'one';
break;
case 2:
$davec_c2 = 'two';
break;
case 3:
$davec_c2 = 'three';
break;
case 4:
$davec_c2 = 'four';
break;
case 5:
$davec_c2 = 'five';
break;
case 6:
$davec_c2 = 'six';
break;
case 7:
$davec_c2 = 'seven';
break;
case 8:
$davec_c2 = 'eight';
break;
case 9:
$davec_c2 = 'nine';
break;
}
switch( $davec_n3 )
{
case 1:
$davec_c3 = 'one';
break;
case 2:
$davec_c3 = 'two';
break;
case 3:
$davec_c3 = 'three';
break;
case 4:
$davec_c3 = 'four';
break;
case 5:
$davec_c3 = 'five';
break;
case 6:
$davec_c3 = 'six';
break;
case 7:
$davec_c3 = 'seven';
break;
case 8:
$davec_c3 = 'eight';
break;
case 9:
$davec_c3 = 'nine';
break;
}
$davec_result = $davec_n1 * $davec_n2 + $davec_n3;
#
#-----[ FIND ]------------------------------------------
#
$sql = 'INSERT INTO ' . CONFIRM_TABLE . " (confirm_id, session_id, code)
#
#-----[ IN-LINE FIND ]------------------------------------------
#
)
#
#-----[ IN-LINE BEFORE, ADD ]------------------------------------------
#
, davec_result
#
#-----[ FIND ]------------------------------------------
#
VALUES ('$confirm_id', '". $userdata['session_id'] . "', '$code')";
#
#-----[ IN-LINE FIND ]------------------------------------------
#
)
#
#-----[ IN-LINE BEFORE, ADD ]------------------------------------------
#
, $davec_result
#
#-----[ FIND ]------------------------------------------
#
'L_CONFIRM_CODE_EXPLAIN' => $lang['Confirm_code_explain'],
#
#-----[ AFTER, ADD ]------------------------------------------
#
'L_DAVEC_FORMULA_EXPLAIN' => $lang['davec_formula_explain'],
'L_DAVEC_FORMULA' => $lang['davec_formula'] . ' ' . $lang[$davec_c1] . ' * ' . $lang[$davec_c2] . ' + ' . $lang[$davec_c3] .' ?',
#
#-----[ OPEN ]------------------------------------------
#
language/lang_italian/lang_main.php
#
#-----[ FIND ]------------------------------------------
#
$lang['Confirm_code_explain'] = 'Inserisci il codice di conferma visuale come indicato nell\'immagine. Il sistema riconosce la differenza tra maiuscole e minuscole, lo zero ha una barra diagonale per distinguerlo dalla lettera O.';
#
#-----[ AFTER, ADD ]------------------------------------------
#
//
// davec formula confirmation system strings
//
$lang['davec_formula_explain'] = 'Inserisci il risultato della formula in formato numerico';
$lang['davec_formula'] = 'Quanto fa';
$lang['one'] = 'uno';
$lang['two'] = 'due';
$lang['three'] = 'tre';
$lang['four'] = 'quattro';
$lang['five'] = 'cinque';
$lang['six'] = 'sei';
$lang['seven'] = 'sette';
$lang['eight'] = 'otto';
$lang['nine'] = 'nove';
$lang['davec_result_wrong'] = 'Il risultato della formula inserito non è corretto';
#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/profile_add_body.tpl
#
#-----[ FIND ]------------------------------------------
#
<tr>
<td class="row1"><span class="gen">{L_CONFIRM_CODE}: * </span><br /><span class="gensmall">{L_CONFIRM_CODE_EXPLAIN}</span></td>
<td class="row2"><input type="text" class="post" style="width: 200px" name="confirm_code" size="6" maxlength="6" value="" /></td>
</tr>
#
#-----[ AFTER, ADD ]------------------------------------------
#
<tr>
<td class="row1"><span class="gen">{L_DAVEC_FORMULA_EXPLAIN}: *</span><br /><span class="gensmall">{L_DAVEC_FORMULA}</span></td>
<td class="row2"><input type="text" class="post" style="width: 200px" name="davec_result" size="6" maxlength="6" value="" /></td>
</tr>
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM
Zanardi ha realizzato una variante che permette di ricevere una email contenente username ed indirizzo email dei bot che cercano di registrarsi e vengono bloccati da questa MOD.
Riporto qui di seguito la sua variante (da installare solo dopo aver installato la MOD prima riportata) :
- Codice: Seleziona tutto
#
#-----[ OPEN ]------------------------------------------
#
includes/usercp_register.php
#
#-----[ FIND ]------------------------------------------
#
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['davec_result_wrong'];
#
#-----[ AFTER, ADD ]------------------------------------------
#
$destC = "TUA_EMAIL@alice.it";
$subject = "ATTENZIONE inserito risultato sbagliato nella formula x la registrazione";
$messageOrig = "ATTENZIONE, un utente ha sbagliato il calcolo della formula \n User: $username \n e-mail: $email";
mail($destC, $subject, $messageOrig);
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM
Ovviamente dovrete sostituire TUA_EMAIL@alice.it con l'indirizzo di posta al quale volete indirizzare la segnalazione!
Colgo l'occasione per ringraziare tutti quelli che stanno gratificando questa mia idea!


