Haz sido victima de los Bots?, se registran en tu web masivamente y dejan publicados mensajes -non gratos- en tu foro?, ¿como logran registrarse?.
Hoy en día los programas maliciosos que recoletan información de páginas web han proliferado con algoritmos más sofisticados que detectan y vulneran los métodos tradicionales de registro de algunos portales de contenido (CMS) , tal es el caso de Joomal, Php nuke , entre otros.
Y como podemos evitar esta situación? ,les voy a explicar como implementar un captcha con acceso a base de datos y no únicamente con métodos GET o POST haciendo uso del mod SecImages ( hecho por truden para foros php-nuke) y que podemos aplicar en otros módulos o CMS, nos vamos a enfocar en el registro de nuevos usuarios (Your_Account) y el contactame (feedback) de php nuke.
Descarga el módulo Security Images (140 descargas ) , descomprímelo y copialo en el root de tu nuke
Debes crear en tu base de datos la siguiente tabla
CREATE TABLE `security_images` ( `ID` int(11) NOT NULL auto_increment, `insertdate` datetime NOT NULL default '0000-00-00 00:00:00', `referenceid` varchar(100) NOT NULL default '', `hiddentext` varchar(100) NOT NULL default '', PRIMARY KEY (`ID`) ) TYPE=MyISAM;
En este caso es altamente recomendable que edites el archivo config.php para cambiar la siguiente variable :
$gfx_chk = 0;
Las siguientes dos funciones debes insertarlas en tu mainfile.php (preferentemente) o el modulo que vayas a proteger
//Define function to insert security image function insertSecurityImage($inputname) { $refid = md5(mktime()*rand()); $insertstr = "\n "; return $insertstr; } //Define function to check security image confirmation function checkSecurityImage($referenceid, $enteredvalue) { global $stop, $user_prefix, $db; $referenceid = mysql_real_escape_string($referenceid); $enteredvalue = mysql_real_escape_string($enteredvalue); if ($db->sql_numrows($db->sql_query("SELECT ID FROM security_images WHERE referenceid='".$referenceid."' AND hiddentext='".$enteredvalue."'")) > 0) { return true; } else { return false; } }
Campos a modificar en el archivo securityimage.php :
- “localhost” es tu localhost (generalmente este no cambia)
- “user” username de la base
- “password” password de la base
- “dbname” nombre de la base
Para conocer los valores de dichos campos , abre el config.php del root de tu nuke.
mysql_connect("localhost", "user", "password") or die(mysql_error()); mysql_select_db("dbname");
Puedes incluso cambiar los valores incluyendo letras y numeros o solo numeros(lenght = longitud, chars = caracteres a considerar) :
//Generate the random string $chars = array("a","A","b","B","c","C","d","D","e","E","f","F","g", "G","h","H","i","I","j","J","k", "K","l","L","m","M","n","N","o","O","p","P","q","Q", "r","R","s","S","t","T","u","U","v", "V","w","W","x","X","y","Y","z","Z","1","2","3","4", "5","6","7","8","9"); $length = 8; If you change it to this: //Generate the random string $chars = array("1","2","3","4", "5","6","7","8","9","0"); $length = 6;
Ahora ubica la funcion confirmNewUser(), a la cual le agregarás el campo $security_try en el parámetro , en la declaración de variables globales de la misma función y en el case.
function confirmNewUser($username, $user_email, $user_password, $user_password2, $random_num, $gfx_check,$security_try) { global $stop, $EditedMessage, $sitename, $module_name, $minpass,$security_try;
Ahora en el case queda así :
case "new user": confirmNewUser($username, $user_email, $user_password, $user_password2, $random_num, $gfx_check,$security_try); break;
Bien, ahora ubica el siguiente bloque (dentro de la misma función ConfirmNewUser()
if (!$stop) { $datekey = date("F j"); $rcode = hexdec(md5($_SERVER['HTTP_USER_AGENT'] . $sitekey . $_POST['random_num'] . $datekey)); $code = substr($rcode, 2, 6); if (extension_loaded("gd") and $code != $gfx_check and ($gfx_chk == 3 or $gfx_chk == 4 or $gfx_chk == 6 or $gfx_chk == 7)) { title("" . _NEWUSERERROR . ""); OpenTable(); echo "" . _SECCODEINCOR . " "; CloseTable(); include ("footer.php"); die(); }
" . "" . _GOBACK . "
Posterior al bloque mencionado, introducimos la validación del captcha, estamos haciendo uso de dos variables vitales para este proceso ya que estamos generando el codigo en la base y ligada a una referencia :
$security_refid = $_POST[security_refid]; $security_try = $_POST[security_try]; $checkSecurity = rcheckSecurityImage($security_refid, $security_try); if (!$checkSecurity){ title(""._NEWUSERERROR.""); OpenTable(); echo ""._SECCODEINCOR." "; CloseTable(); include("footer.php"); die(); }
" .""._GOBACK."
Si seguiste las indicaciones tu función completa debe apreciarse asi (considerando que solo tienes este mod)
function confirmNewUser($username, $user_email, $user_password, $user_password2, $random_num, $gfx_check,$security_try) { global $stop, $EditedMessage, $sitename, $module_name, $minpass,$security_try; include("header.php"); include("config.php"); $username = filter($username, nohtml); $user_email = filter($user_email, nohtml); $user_viewemail = "0"; userCheck($username, $user_email); if (!$stop) { $datekey = date("F j"); $rcode = hexdec(md5($_SERVER[HTTP_USER_AGENT] . $sitekey . $_POST[random_num] . $datekey)); $code = substr($rcode, 2, 6); if (extension_loaded("gd") AND $code != $gfx_check AND ($gfx_chk == 3 OR $gfx_chk == 4 OR $gfx_chk == 6 OR $gfx_chk == 7)) { title(""._NEWUSERERROR.""); OpenTable(); echo ""._SECCODEINCOR." "; CloseTable(); include("footer.php"); die(); } $security_refid = $_POST[security_refid]; $security_try = $_POST[security_try]; $checkSecurity = rcheckSecurityImage($security_refid, $security_try); if (!$checkSecurity){ title(""._NEWUSERERROR.""); OpenTable(); echo "
" .""._GOBACK.""._SECCODEINCOR." "; CloseTable(); include("footer.php"); die(); } if ($user_password == "" AND $user_password2 == "") { $user_password = makepass(); } elseif ($user_password != $user_password2) { title(""._NEWUSERERROR.""); OpenTable(); echo "
" .""._GOBACK.""._PASSDIFFERENT." "; CloseTable(); include("footer.php"); die(); } elseif ($user_password == $user_password2 AND strlen($user_password) "._YOUPASSMUSTBE." $minpass "._CHARLONG."
"._GOBACK."
"._GOBACK.""; CloseTable(); include("footer.php"); die(); } title("$sitename: "._USERREGLOGIN.""); OpenTable(); echo ""._USERFINALSTEP."
$username, "._USERCHECKDATA."
" ."
"._UUSERNAME.": $username |
"._EMAIL.": $user_email |
" ."
"; echo "$stop
"._GOBACK."
Continuamos, ahora sigue la función new_user()
function new_user() { global $my_headlines, $module_name, $db, $gfx_chk;
A la que tambien le agregaremos la variable $security_try :
function new_user() { global $my_headlines, $module_name, $db, $gfx_chk,$security_try;
Ubica en dicha funcion el siguiente bloque :
if (extension_loaded("gd") AND ($gfx_chk == 3 OR $gfx_chk == 4 OR $gfx_chk == 6 OR $gfx_chk == 7)) { echo "\n" ." "._SECURITYCODE.": \n" ."\n"; } "._TYPESECCODE.":
El bloque anterior queda sin efecto siempre y cuando hayas cambiado el valor en el config.php, posterior a dicho bloque inserta:
$imagenseguridad = insertSecurityImage('security_refid'); echo "\n" ." "._SECURITYCODE.": $imagenseguridad \n"; "._TYPESECCODE.":
El bloque debe ser semejante a esto (la validacion debe quedar dentro del form) -pon atención a la variable $imagenseguridad
echo "\n" ."
\n"
Con esto concluimos la modificación para evitar que bots se registren automáticamente en tu web php nuke, este mod puede ser instalado en cualquier portal (ya presentare casos de prueba).