Foros del Web » Programando para Internet » PHP »

Problemas codigo antispam

Estas en el tema de Problemas codigo antispam en el foro de PHP en Foros del Web. Hola amigos soy yo denuevo, lo q pasa es q tengo un problema con un codigo antispam que quiero insertar en mi formulario de registro, ...
  #1 (permalink)  
Antiguo 23/08/2011, 23:38
 
Fecha de Ingreso: mayo-2010
Mensajes: 185
Antigüedad: 14 años, 6 meses
Puntos: 2
Problemas codigo antispam

Hola amigos soy yo denuevo, lo q pasa es q tengo un problema con un codigo antispam que quiero insertar en mi formulario de registro, ya q deje la web por un tiempo y de repente ya tenia 7000 robots xD, pero el problema es q no me muestra el texto antispam, me muestra la imagen, pero no el texto estos son mis codigos:

reg.php

Código PHP:
 <?
include('config.php'); //incluimos el config.php que contiene los datos de la conexión a la db
$ip $REMOTE_ADDR

$cadena "";

for(
$i 0$i 10$i++)
  
$cadena .= chr(rand(6590));

if(!isset(
$_SESSION[usuario]) )//comprobamos que no existe la session, es decir, que no se ha logeado, y mostramos el form
{

//Creamos el form k irá a registrar.php para comprobar y introducir los datos a la tabla users
echo '<form action="registrar.php" method="POST">
Usuario:<br><input type="text" name="nick" size="30"><br>
Password:<br><input type="password" name="pass" size="30" ><br>
Repite password:<br><input type="password" name="pass1" size="30" ><br>
Email:<br><input type="text" name="email" size="30"><br>
Apellidos:<br><input type="text" name="apellidos" size="30"><br>
Nombre:<br><input type="text" name="nombre" size="30"><br>
Edad:<br><input type="text" name="edad" size="30"><br>
Link de tu imagen(incluyendo http://):<br><input type="text" name="avatar" size="30"><br>
Mensaje personal:<br> <textarea name="rollo" cols="30" rows="10"></textarea><br>
Antispam:  <img src="antispam.php?texto=<?echo $cadena?>" alt="" >
<input type="submit" name="submit" value="Enviar"></form>'
;
   echo       
"Beneficios del registro:<br>";
    echo     
"Podras añadir las letras de tus canciones favoritas<br>";
    echo      
"Podras añadir bases<br>";
    echo      
"Tendras un perfil personalizado<br>";
          
}else{
echo 
"No te puedes registrar si has iniciado sesion";
}
?>
antispam.php

Código PHP:
<?php
  $cadena 
"";
  
$cadena $_GET['texto'];

  if(
$cadena != "")
  {
    
// Crea una imagen de 110*24
    
$im imagecreate(11024);

    
// Fondo azul claro y texto azul oscuro
    
$fondo imagecolorallocate($im220230255);
    
$colortexto imagecolorallocate($im100110205);

    
// Escribe la cadena en la imagen
    
imagestring($im5104$cadena$colortexto);

    
// Muestra la imagen
    
header('Content-type: image/png');
    
imagepng($im);
    
imagedestroy($im);
  }
?>
  #2 (permalink)  
Antiguo 23/08/2011, 23:43
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Problemas codigo antispam

Hola @Arcana! Si ya estás en un echo de PHP no puedes abrir PHP adentro:

Código PHP:
Ver original
  1. Antispam:  <img src="antispam.php?texto=<?echo $cadena?>" alt="" >

concatena la variable $cadena.

O sino puedes salir de PHP:

Código PHP:
Ver original
  1. <?php
  2.  
  3. include('config.php'); //incluimos el config.php que contiene los datos de la conexión a la db
  4. $ip = $_SERVER['REMOTE_ADDR'];
  5.  
  6. $cadena = "";
  7.  
  8. for ($i = 0; $i < 10; $i++)
  9.     $cadena .= chr(rand(65, 90));
  10.  
  11. if (! isset($_SESSION['usuario'])) //comprobamos que no existe la session, es decir, que no se ha logeado, y mostramos el form
  12. {
  13. ?>
  14. <form action="registrar.php" method="POST">Usuario:<br>
  15. <input type="text" name="nick" size="30"><br>
  16. Password:<br>
  17. <input type="password" name="pass" size="30"><br>
  18. Repite password:<br>
  19. <input type="password" name="pass1" size="30"><br>
  20. Email:<br>
  21. <input type="text" name="email" size="30"><br>
  22. Apellidos:<br>
  23. <input type="text" name="apellidos" size="30"><br>
  24. Nombre:<br>
  25. <input type="text" name="nombre" size="30"><br>
  26. Edad:<br>
  27. <input type="text" name="edad" size="30"><br>
  28. Link de tu imagen(incluyendo http://):<br>
  29. <input type="text" name="avatar" size="30"><br>
  30. Mensaje personal:<br>
  31. <textarea name="rollo" cols="30" rows="10"></textarea><br>
  32. Antispam: <img src="antispam.php?texto=<?php
  33.     echo $cadena; ?>" alt=""> <input
  34.     type="submit" name="submit" value="Enviar"></form>
  35. <?php
  36.     echo "Beneficios del registro:<br>";
  37.     echo "Podras añadir las letras de tus canciones favoritas<br>";
  38.     echo "Podras añadir bases<br>";
  39.     echo "Tendras un perfil personalizado<br>";
  40.  
  41. } else {
  42.     echo "No te puedes registrar si has iniciado sesion";
  43. }
  44. ?>

Edit: Si te fijas te cambie $ip = $REMOTE_ADDR; por $ip = $_SERVER['REMOTE_ADDR'];

__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 23/08/2011 a las 23:56
  #3 (permalink)  
Antiguo 24/08/2011, 00:00
 
Fecha de Ingreso: mayo-2010
Mensajes: 185
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: Problemas codigo antispam

Gracias man! Ahora tengo otra duda, esta si no tengo casi idea, ya funciona y todo pero ahoraa lo que quiero hacer es comprobar que los caracteres escritos sean los mismos de la imagen, pero no se como hacerle, estos son mis codigos:

reg.php

Código PHP:
<?php
     
    
include('config.php'); //incluimos el config.php que contiene los datos de la conexión a la db
    
$ip $_SERVER['REMOTE_ADDR'];
     
    
$cadena "";
     
    for (
$i 0$i 10$i++)
        
$cadena .= chr(rand(6590));
     
    if (! isset(
$_SESSION['usuario'])) //comprobamos que no existe la session, es decir, que no se ha logeado, y mostramos el form
    
{
    
?>
    <form action="registrar.php" method="POST">Usuario:<br>
    <input type="text" name="nick" size="30"><br>
    Password:<br>
    <input type="password" name="pass" size="30"><br>
    Repite password:<br>
    <input type="password" name="pass1" size="30"><br>
    Email:<br>
    <input type="text" name="email" size="30"><br>
    Apellidos:<br>
    <input type="text" name="apellidos" size="30"><br>
    Nombre:<br>
    <input type="text" name="nombre" size="30"><br>
    Edad:<br>
    <input type="text" name="edad" size="30"><br>
    Link de tu imagen(incluyendo http://):<br>
    <input type="text" name="avatar" size="30"><br>
    Mensaje personal:<br>
    <textarea name="rollo" cols="30" rows="10"></textarea><br>
    Antispam: <br><img src="antispam.php?texto=<?php
        
echo $cadena?>" alt=""> </br> 
Inserta el codigo de arriba:<br>
    <input type="text" name="antispam" size="30"><br>


<input
        type="submit" name="submit" value="Enviar"></form>
    <?php
        
echo "Beneficios del registro:<br>";
        echo 
"Podras añadir las letras de tus canciones favoritas<br>";
        echo 
"Podras añadir bases<br>";
        echo 
"Tendras un perfil personalizado<br>";
     
    } else {
        echo 
"No te puedes registrar si has iniciado sesion";
    }
    
?>
registrar.php

Código PHP:
<?
function getRealIP() {
 
    if (
$_SERVER['HTTP_X_FORWARDED_FOR'] != '') {
        
$client_ip =
                (!empty(
$_SERVER['REMOTE_ADDR']) ) ?
                
$_SERVER['REMOTE_ADDR'] :
                ( (!empty(
$_ENV['REMOTE_ADDR']) ) ?
                        
$_ENV['REMOTE_ADDR'] :
                        
"unknown" );
 
        
$entries split('[, ]'$_SERVER['HTTP_X_FORWARDED_FOR']);
 
        
reset($entries);
        while (list(, 
$entry) = each($entries)) {
            
$entry trim($entry);
            if (
preg_match("/^([0-9]+.[0-9]+.[0-9]+.[0-9]+)/"$entry$ip_list)) {
 
                
$private_ip = array(
                    
'/^0./',
                    
'/^127.0.0.1/',
                    
'/^192.168..*/',
                    
'/^172.((1[6-9])|(2[0-9])|(3[0-1]))..*/',
                    
'/^10..*/');
 
                
$found_ip preg_replace($private_ip$client_ip$ip_list[1]);
 
                if (
$client_ip != $found_ip) {
                    
$client_ip $found_ip;
                    break;
                }
            }
        }
    } else {
        
$client_ip =
                (!empty(
$_SERVER['REMOTE_ADDR']) ) ?
                
$_SERVER['REMOTE_ADDR'] :
                ( (!empty(
$_ENV['REMOTE_ADDR']) ) ?
                        
$_ENV['REMOTE_ADDR'] :
                        
"unknown" );
    }
 
    return 
$client_ip;
}
//tomada de desarrolloweb


include('config.php'); //incluimos el config.php que contiene los datos de la conexión a la db


//Comprobamos que los campos nick, pass y pass1 se han rellenado en el form de reg.php, sino volvemos al form
if(($_POST[nick] == ' ') or ($_POST[pass] == ' ') or ($_POST[pass1] == ' ') )
{
Header("Location: reg.php"); //enviamos al form de registro que esta en reg.php
}else{

//Comprobamos que la pass y pass1 son iguales, sino, volvemos a reg.php
if($_POST[pass] != $_POST[pass1])
{
echo 
'Las passwords no son iguales';
}else{

//quitamos el codigo malicioso de $_POST[nick] y $_POST[pass]
$user stripslashes($_POST["nick"]);
$user strip_tags($user);
$pass stripslashes($_POST["pass"]);
$pass strip_tags($pass);
//comprobamos que el usuario no existe en la db
$usuarios=mysql_query("SELECT nick FROM users WHERE nick='$user' ");
if(
$user_ok=mysql_fetch_array($usuarios))
{
echo 
'El usuario ya esta registrado';
mysql_free_result($usuarios); //liberamos la memoria del query a la db
}else{
//quitamos todo el codigo malicioso de las demas variables del form de registro
$email stripslashes($_POST["email"]);
$email strip_tags($email);

$rollo stripslashes($_POST["rollo"]);
$rollo strip_tags($rollo);
$rollo str_replace("\n\r","<br>",$rollo); //se cambian los saltos de linea por <br>
$rollo str_replace("\r\n","<br>",$rollo);
$rollo str_replace("\n","<br>",$rollo);


$fecha time();
$level "1"//usaremos level 1 para admins, level 2 para los demas (se cambia manualmente desde phpmyadmin)
$ip getRealIP();

//introducimos el nuevo registro en la tabla users
mysql_query("INSERT INTO users (nick,pass,email,level,rollo,apellidos,nombre,edad, avatar, ip) values ('$user','$pass','$email','$level','$rollo', '".$_POST['apellidos']."', '".$_POST['nombre']."', '".$_POST['edad']."', '".$_POST['avatar']."', '$ip') ");
echo 
'Usuario registrado con éxito';
}

}

}
?>
  #4 (permalink)  
Antiguo 24/08/2011, 00:06
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Problemas codigo antispam

En la página donde generas la imagen crea una nueva sesión con el código generado y es posible con md5. y cuando vayas a validar el código compara la sesión con lo que se metió en el campo del captcha.

Esto va en antispam.php

Código PHP:
Ver original
  1. $_SESSION['captcha'] = md5($cadena);

Luego en donde vayas a validar el captcha haces algo así:

Código PHP:
Ver original
  1. if (md5($POST[antispam]) == $_SESSION['captcha']) {
  2.     echo 'El captcha es correcto lo que tenga que hacer';
  3. } else {
  4.     echo 'Ingrese correctamente el captcha';
  5. }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 24/08/2011, 00:08
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 6 meses
Puntos: 322
Respuesta: Problemas codigo antispam

Ese antispam no te servirá de mucho..
Código HTML:
Ver original
  1. <img src="antispam.php?texto=<?php echo $cadena?>" alt="">
Cómo que escribes la respuesta en el mismo HTML!? Cualquier bot que entre, puede parsear la página y obtenerlo

Debes usar un captcha que genere una cadena aleatoria y la guarde en una sesión (preferiblemente cifrada en, no sé, base64) para, en la página de acción, comparar la sesión descifrada y el campo del captcha.

Saludos!
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #6 (permalink)  
Antiguo 24/08/2011, 00:10
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Problemas codigo antispam

No me dejaste editar Sourcegeek...

Me falto decirte que muevas esta parte a antispam.php:

Código PHP:
Ver original
  1. for ($i = 0; $i < 10; $i++)
  2.         $cadena .= chr(rand(65, 90));

y donde vayas a mostrar la imagen simplemente deja:

Código HTML:
Ver original
  1. <img src="antispam.php" alt="">
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #7 (permalink)  
Antiguo 24/08/2011, 00:45
 
Fecha de Ingreso: mayo-2010
Mensajes: 185
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: Problemas codigo antispam

intente ponerlo asi, pero la pagina se queda en blanco

registrar.php

Código PHP:
<?
function getRealIP() {
 
    if (
$_SERVER['HTTP_X_FORWARDED_FOR'] != '') {
        
$client_ip =
                (!empty(
$_SERVER['REMOTE_ADDR']) ) ?
                
$_SERVER['REMOTE_ADDR'] :
                ( (!empty(
$_ENV['REMOTE_ADDR']) ) ?
                        
$_ENV['REMOTE_ADDR'] :
                        
"unknown" );
 
        
$entries split('[, ]'$_SERVER['HTTP_X_FORWARDED_FOR']);
 
        
reset($entries);
        while (list(, 
$entry) = each($entries)) {
            
$entry trim($entry);
            if (
preg_match("/^([0-9]+.[0-9]+.[0-9]+.[0-9]+)/"$entry$ip_list)) {
 
                
$private_ip = array(
                    
'/^0./',
                    
'/^127.0.0.1/',
                    
'/^192.168..*/',
                    
'/^172.((1[6-9])|(2[0-9])|(3[0-1]))..*/',
                    
'/^10..*/');
 
                
$found_ip preg_replace($private_ip$client_ip$ip_list[1]);
 
                if (
$client_ip != $found_ip) {
                    
$client_ip $found_ip;
                    break;
                }
            }
        }
    } else {
        
$client_ip =
                (!empty(
$_SERVER['REMOTE_ADDR']) ) ?
                
$_SERVER['REMOTE_ADDR'] :
                ( (!empty(
$_ENV['REMOTE_ADDR']) ) ?
                        
$_ENV['REMOTE_ADDR'] :
                        
"unknown" );
    }
 
    return 
$client_ip;
}
//tomada de desarrolloweb


include('config.php'); //incluimos el config.php que contiene los datos de la conexión a la db



//Comprobamos que los campos nick, pass y pass1 se han rellenado en el form de reg.php, sino volvemos al form
if(($_POST[nick] == ' ') or ($_POST[pass] == ' ') or ($_POST[pass1] == ' ') )
{
Header("Location: reg.php"); //enviamos al form de registro que esta en reg.php
}else{

//Comprobamos que la pass y pass1 son iguales, sino, volvemos a reg.php
if($_POST[pass] != $_POST[pass1])
{
echo 
'Las passwords no son iguales';
}else{

if (
md5($POST[antispam]) !! $_SESSION['captcha'])
        echo 
'El codigo es incorrecto';
    } else {

//quitamos el codigo malicioso de $_POST[nick] y $_POST[pass]
$user stripslashes($_POST["nick"]);
$user strip_tags($user);
$pass stripslashes($_POST["pass"]);
$pass strip_tags($pass);
//comprobamos que el usuario no existe en la db
$usuarios=mysql_query("SELECT nick FROM users WHERE nick='$user' ");
if(
$user_ok=mysql_fetch_array($usuarios))
{
echo 
'El usuario ya esta registrado';
mysql_free_result($usuarios); //liberamos la memoria del query a la db
}else{
//quitamos todo el codigo malicioso de las demas variables del form de registro
$email stripslashes($_POST["email"]);
$email strip_tags($email);

$rollo stripslashes($_POST["rollo"]);
$rollo strip_tags($rollo);
$rollo str_replace("\n\r","<br>",$rollo); //se cambian los saltos de linea por <br>
$rollo str_replace("\r\n","<br>",$rollo);
$rollo str_replace("\n","<br>",$rollo);


$fecha time();
$level "1"//usaremos level 1 para admins, level 2 para los demas (se cambia manualmente desde phpmyadmin)
$ip getRealIP();

//introducimos el nuevo registro en la tabla users
mysql_query("INSERT INTO users (nick,pass,email,level,rollo,apellidos,nombre,edad, avatar, ip) values ('$user','$pass','$email','$level','$rollo', '".$_POST['apellidos']."', '".$_POST['nombre']."', '".$_POST['edad']."', '".$_POST['avatar']."', '$ip') ");
echo 
'Usuario registrado con éxito';
}

}

}
?>
  #8 (permalink)  
Antiguo 24/08/2011, 00:47
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Problemas codigo antispam

Colocaste mal esa parte es así:

Código PHP:
Ver original
  1. if (md5($_POST['antispam']) != $_SESSION['captcha']) {
  2.         echo 'El codigo es incorrecto';
  3.     } else {
  4.         //Código correcto
  5.     }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #9 (permalink)  
Antiguo 24/08/2011, 00:53
 
Fecha de Ingreso: mayo-2010
Mensajes: 185
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: Problemas codigo antispam

ahora ya funciona man gracias! Pero el problema es q siempre dice q el codigo es incorrecto jejeje no se como hacerle para solucionarlo
  #10 (permalink)  
Antiguo 24/08/2011, 00:57
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Problemas codigo antispam

Tienes que colocar en tu archivo antispam.php y registrar.php al inicio:

Código PHP:
Ver original 

Luego generar el código en antispam.php:

Código PHP:
Ver original
  1. for ($i = 0; $i < 10; $i++)
  2.         $cadena .= chr(rand(65, 90));

y almacenas la cadena en la sesión en antispam.php:

Código PHP:
Ver original
  1. $_SESSION['captcha'] = md5($cadena);
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Etiquetas: antispam, arcana, robots
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:03.