Posted by SirAntuans on Mar 30, 2010
Antibot : bloquea Spam en tu web efectivamente

Antibot : bloquea Spam en tu web efectivamente

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 (171 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 = "\"Security\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 :

  1. “localhost” es tu localhost (generalmente este no cambia)
  2. “user”  username  de la base
  3. “password”  password de la base
  4. “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 . "

" . "" . _GOBACK . "
";             CloseTable();             include ("footer.php");             die();         }

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."

"    .""._GOBACK."
";    CloseTable();    include("footer.php");    die();    }       

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."

"    .""._GOBACK."
";    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 "
"._SECCODEINCOR."

"    .""._GOBACK."
";    CloseTable();    include("footer.php");    die();    }                  if ($user_password == "" AND $user_password2 == "") {    $user_password = makepass();   } elseif ($user_password != $user_password2) {    title(""._NEWUSERERROR."");    OpenTable();    echo "
"._PASSDIFFERENT."

"._GOBACK."
";    CloseTable();    include("footer.php");    die();   } elseif ($user_password == $user_password2 AND strlen($user_password) < $minpass) {    title(""._NEWUSERERROR."");    OpenTable();    echo "
"._YOUPASSMUSTBE." $minpass "._CHARLONG."

"._GOBACK."
";    CloseTable();    include("footer.php");    die();   }   title("$sitename: "._USERREGLOGIN."");   OpenTable();   echo "
"._USERFINALSTEP."

$username, "._USERCHECKDATA."


"   .""   .""   ."
"._UUSERNAME.": $username
"._EMAIL.": $user_email


"   ."
"._NOTE." "._YOUWILLRECEIVE."";   echo "
"   .""   .""   .""   .""   .""   ."

"   ."   "._GOBACK."
";   CloseTable();  } else {   OpenTable();   echo "
Registration Error!

";   echo "$stop
"._GOBACK."
";   CloseTable();  }  include("footer.php"); }

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 ""._SECURITYCODE.":"._SECURITYCODE."\n"
         .""._TYPESECCODE.":\n"
         ."\n";
 }

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 ""._SECURITYCODE.":$imagenseguridad\n"
   .""._TYPESECCODE.":\n";

El bloque debe ser semejante a esto (la validacion debe quedar dentro del form) -pon atención a la variable $imagenseguridad

  echo "
\n"   .""._REGNEWUSER." ("._ALLREQUIRED.")

\n"   ."\n"   ."\n"   ."\n"   ."\n"   ."\n";   if (extension_loaded("gd") AND ($gfx_chk == 3 OR $gfx_chk == 4 OR $gfx_chk == 6 OR $gfx_chk == 7)) {    echo "\n"    ."\n"    ."\n";   }                 $imagenseguridad = insertSecurityImage('security_refid');            echo "\n"    ."\n";          echo "
"._NICKNAME.":
"._EMAIL.":
"._PASSWORD.":
"._RETYPEPASSWORD.":
("._BLANKFORAUTO.")
"._SECURITYCODE.":"._SECURITYCODE."
"._TYPESECCODE.":
"._SECURITYCODE.":$imagenseguridad
"._TYPESECCODE.":
\n"   ."\n"   ."\n"   ."
\n"   ."
\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).




               
Post a Comment

Comments are closed.

Pin It on Pinterest

Share This