Foros del Web » Programando para Internet » PHP »

Captcha PHP

Estas en el tema de Captcha PHP en el foro de PHP en Foros del Web. Hola, tengo un problema con un captcha para un formulario de contacto, el problema es que luego de enviar el mensaje, no cambia el captcha, ...
  #1 (permalink)  
Antiguo 03/06/2014, 14:51
Avatar de omar10594  
Fecha de Ingreso: junio-2013
Ubicación: Mexico
Mensajes: 26
Antigüedad: 10 años, 10 meses
Puntos: 3
Pregunta Captcha PHP

Hola, tengo un problema con un captcha para un formulario de contacto, el problema es que luego de enviar el mensaje, no cambia el captcha, asi que sigue siendo el mismo cuando vuelvo a la pagina, intente cambiando el tipo de captcha, como nose nada de php, simplemente busque por internet alguno que fuera libre de usar y lo implemente, uno de sumas, y otro de letras, pero en ambos pasa lo mismo, la verdad nose si esto se solucione por medio de php, o a lo mejor debo implementar algo en javascrip que me detecte cuando ya se envio el mensaje, y que "recarge" la pagina para que asi me genere un captcha nuevo.



El código de la imagen de captcha es el siguiente:
Código PHP:
Ver original
  1. <?php
  2.     session_start();
  3.    
  4.     // Creo los valores aleatorios y guardo el resultado
  5.     $Valor1 = rand(1,10);
  6.     $Valor2 = rand(1,10);
  7.     $_SESSION["ResultadoCaptcha"] = $Valor1 + $Valor2;
  8.     // Creo una imagen vacia de 120x30 a la que pintaremos el fondo transparente y los valores en negro
  9.     $Imagen = imagecreatetruecolor(120, 30);
  10.     $Color_Fondo = imagecolorallocate($Imagen, 255, 255, 255);
  11.     imagefill($Imagen, 0, 0, $Color_Fondo);
  12.     $Color_Texto = imagecolorallocate($Imagen, 0, 0, 0);
  13.     imagestring($Imagen, 4, 5, 5,  $Valor1." + ".$Valor2." =", $Color_Texto);
  14.    
  15.     // Cabecera para la imagen PNG
  16.     header('Content-Type: image/png');
  17.    
  18.     // Imprimo la imagen
  19.     imagepng($Imagen);
  20.    
  21.     // Liberar memoria
  22.     imagedestroy($Imagen);
  23. ?>
Como dije, este código lo saque de internet. Es un captcha que genera una imagen de suma, también use este otro.
Código PHP:
Ver original
  1. <?php
  2.     ###########################################################################################
  3.     #
  4.     #  CAPTCHA FÁCIL 1.0
  5.     #
  6.     #  Autor: Alejandro Martín Núñez
  7.     #  Contact: alemnunez at gmail dot com
  8.     #  Date: October 10, 2009
  9.     #
  10.     #  COMO USAR CAPTCHA FÁCIL
  11.     #
  12.     #  FORMULARIO
  13.     #  En el formulario que deseas validar, inserta el siguiente código:
  14.     #  
  15.     #  <img src="captcha.php" /><br/>
  16.     #  <input type="text" size="12" name="captcha" />
  17.     #
  18.     #
  19.     #  VERIFICACIÓN
  20.     #  Al procesar el formulario, compara el contenido del campo que
  21.     #  completó el usuario con el contenido de $_SESSION["captcha"]
  22.     #  que generó este programa:
  23.     #
  24.     #  session_start();
  25.     #  if(strtoupper($_REQUEST["captcha"]) == $_SESSION["captcha"]){
  26.     #    // REMPLAZO EL CAPTCHA USADO POR UN TEXTO LARGO PARA EVITAR QUE SE VUELVA A INTENTAR
  27.     #    $_SESSION["captcha"] = md5(rand()*time());
  28.     #    // INSERTA EL CÓDIGO EXITOSO AQUI
  29.     #  }else{
  30.     #    // REMPLAZO EL CAPTCHA USADO POR UN TEXTO LARGO PARA EVITAR QUE SE VUELVA A INTENTAR
  31.     #    $_SESSION["captcha"] = md5(rand()*time());
  32.     #    // INSERTA EL CÓDIGO DE ERROR AQUÍ
  33.     #  }
  34.     #
  35.     #  
  36.     #  OLVIDÁ EL SPAM!
  37.     #
  38.     ###########################################################################################
  39.    
  40.     #create image and set background color
  41.     $captcha = imagecreatetruecolor(120,35);
  42.     $color = rand(128,160);
  43.     $background_color = imagecolorallocate($captcha, $color, $color, $color);
  44.     imagefill($captcha, 0, 0, $background_color);
  45.    
  46.     #draw some lines
  47.     for($i=0;$i<10;$i++){
  48.         $color = rand(48,96);
  49.         imageline($captcha, rand(0,130),rand(0,35), rand(0,130), rand(0,35),imagecolorallocate($captcha, $color, $color, $color));
  50.     }
  51.    
  52.     #generate a random string of 5 characters
  53.     $string = substr(md5(rand()*time()),0,5);
  54.  
  55.     #make string uppercase and replace "O" and "0" to avoid mistakes
  56.     $string = strtoupper($string);
  57.     $string = str_replace("O","B", $string);
  58.     $string = str_replace("0","C", $string);
  59.  
  60.     #save string in session "captcha" key
  61.     session_start();
  62.     $_SESSION["captcha"]=$string;
  63.  
  64.     #place each character in a random position
  65.     putenv('GDFONTPATH=' . realpath('.'));
  66.     $font = 'arial.ttf';
  67.     for($i=0;$i<5;$i++){
  68.         $color = rand(0,32);
  69.         if(file_exists($font)){
  70.             $x=4+$i*23+rand(0,6);
  71.             $y=rand(18,28);
  72.             imagettftext  ($captcha, 15, rand(-25,25), $x, $y, imagecolorallocate($captcha, $color, $color, $color), $font, $string[$i]);
  73.         }else{
  74.             $x=5+$i*24+rand(0,6);
  75.             $y=rand(1,18);
  76.             imagestring($captcha, 5, $x, $y, $string[$i], imagecolorallocate($captcha, $color, $color, $color));
  77.         }
  78.     }
  79.    
  80.     #applies distorsion to image
  81.     $matrix = array(array(1, 1, 1), array(1.0, 7, 1.0), array(1, 1, 1));
  82.     imageconvolution($captcha, $matrix, 16, 32);
  83.  
  84.     #avoids catching
  85.     header("Expires: 0");
  86.     header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  87.     header("Cache-Control: private",false);
  88.  
  89.     #return the image
  90.     header("Content-type: image/gif");
  91.     imagejpeg($captcha);
  92. ?>

La validación la hago en un archivo php separado del HTML , la validación funciona perfectamente, y como dije, nose de PHP, asi que intente hacer lo que pude con los conocimientos que tenia.

Código PHP:
Ver original
  1. <?php
  2. $nombre = $_POST['nombre'];
  3. $email = $_POST['email'];
  4. $mensaje = $_POST['mensaje'];
  5. $asunto = $_POST['asunto'];
  6. $news = $_POST['newsletter'];
  7. $titulo = $asunto;
  8. $header = 'From: ' . $email;
  9. $msjCorreo = "Nombre: $nombre\n E-Mail: $email\n Asunto: $asunto\n Mensaje:\n $mensaje";
  10. if ($_POST['submit']) {
  11.     if ($_POST["captcha"] == $_SESSION["ResultadoCaptcha"]) {
  12.         if(mail($para, $titulo, $msjCorreo, $header)&&
  13.            mail($email,'Contacto Movimiento Aztlan',"Gracias por su mensaje \n En breve nos comunicaremos con usted para darle una respuesta",'From: '.$para)){
  14.             if( $news == 'SI' ){
  15.                 mail($new,'Nuevo contacto para Newsletter',"Este es un nuevo contacto para la lista de Newsletter",$header);
  16.             }
  17.         echo "<script language='javascript'>
  18.         window.location.href = 'mensaje_enviado.html';
  19.         </script>";
  20.         } else {
  21.         echo "<script language='javascript'>
  22.         window.location.href = 'error_mensaje.html'
  23.         </script>";
  24.         }
  25.     } else {
  26.         echo "<script language='javascript'>
  27.         window.location.href = 'captcha_incorrecto.html';
  28.         </script>";
  29.     }
  30. }
  31. ?>

La razón por la que pongo "window.location.href", es porque crei que si después de mandar el correo, o de que se equivoque, lo mande a otra pagina, donde espera 5 segundos para que lo redireccione a otra pagina, y de esta forma, tuviera que volver a "contacto" y que ahí recargara la pagina, pero claro que no funciono, D:


El HTML lo tengo asi, solo es el fragmento donde esta el formulario:

Código HTML:
Ver original
  1. <form action="contacto.php" method="post">
  2.                 <label for="nombre">Nombre:</label>
  3.                 <input class="form" id="nombre" type="text" name="nombre" placeholder="Nombre y Apellido (opcional)" />
  4.                 <label for="email">Email:</label>
  5.                 <input class="form" id="email" type="email" name="email" placeholder="[email protected]" required/>
  6.                 <label for="asunto">Asunto:</label>
  7.                 <input class="form" id="asunto" type="text" name="asunto" placeholder="Ej. Sugerencia, Queja, Pedido, etc. (opcional)" />
  8.                 <label for="mensaje">Mensaje:</label>
  9.                 <textarea class="form"id="mensaje" name="mensaje" placeholder="Mensaje" required></textarea>
  10.                 <label for"new">¿Desea suscribirse a nuestro boletín de novedades?:</label>
  11.                 <input id="news" type="radio" name="newsletter" value="SI" style="width:16px;height:16px;background:#eee;margin:0 1em;">Si, quiero suscribirme.<br>
  12.                 <input id="news" type="radio" name="newsletter" value="NO" style="width:16px;height:16px;background:#eee;margin:0 1em;" checked="">No, gracias.<br>
  13.                 <label for="captcha">Codigo de Seguridad:</label>
  14.                
  15.                 <img id="img-captcha" src="captcha.php"><br><input id="captcha" type="text" name="captcha" placeholder="Introduce las letras de la imagen." required autocomplete="off" >
  16.                 <input class="form" id="submit" type="submit" name="submit" value="Enviar" />

Si me pudieran ayudar, se los gradeceria mucho, :D

Lo vuelvo a decir, no tengo conocimientos en php, tampoco en javascrip, pero si logro entender su funcionamiento. :D

Etiquetas: captcha, formulario, html
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 08:52.