Foros del Web » Programando para Internet » PHP »

Cómo implementar captcha en formulario HTML+PHP

Estas en el tema de Cómo implementar captcha en formulario HTML+PHP en el foro de PHP en Foros del Web. Hola a todos y gracias por acogerme en vuestra comunidad. He estado dando vueltas a ciegas por toda la red con este asunto y no ...
  #1 (permalink)  
Antiguo 23/09/2010, 01:37
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 14 años, 1 mes
Puntos: 0
Cómo implementar captcha en formulario HTML+PHP

Hola a todos y gracias por acogerme en vuestra comunidad.

He estado dando vueltas a ciegas por toda la red con este asunto y no he encontrado una solución que me funcione.
Me refiero a la implantación de captcha en un formulario html que utiliza php para envío del mensaje, algo muy normal y utilizado.

El problema lo tengo en el tipo de web (gestor de contenidos comercial) que utilizo. Es un sistema muy cerrado y que da muy poco margen de uso. El servidor donde se encuentra alojado soporta PHP y JavaScript.
He intentado implantar recaptcha y script similares pero no funcionan, me dejan la página en blanco.

La única solución que he encontrado es la implantación tradicional: alojar en el directorio un generador de capcha en php, hacer la llamada a éste desde el formulario HTML y cuando se ejecute la accion enviar.php, que el archivo php verifique, además de la disponibilidad de los datos del formulario, además compruebe la validez del captcha.

Este es el código que utilizo para el formulario (muy sencillo):

Código HTML:
<html>

<head>

</head>

<body>

<form name="fvalida" action="enviar.php" method="post">
Nombre y apellidos
<!--webbot bot="Validation" s-data-type="String" b-allow-letters="TRUE" b-value-required="TRUE" i-minimum-length="10" i-maximum-length="60" --> 
<input type="text" name="Nombre" size="71" maxlength="60" /><br>
<br>
D.N.I.
<!--webbot bot="Validation" b-value-required="TRUE" i-minimum-length="7" i-maximum-length="12" --> 
<input type="text" name="DNI" size="18" maxlength="12" />&nbsp; Correo 
electrónico
<!--webbot bot="Validation" b-value-required="TRUE" i-minimum-length="8" --> 
<input type="text" name="Correo" size="40"><br>
<br>

<br>
Mensaje
<!--webbot bot="Validation" b-value-required="TRUE" i-minimum-length="25" --> 
<textarea rows="3" name="Mensaje" cols="69"></textarea><br>
<br>
<input type="submit" value="  Enviar  ">
<input type="reset" value="Borrar" name="REESTABLECER">
</form>

</body>
</html> 
Y este es el código php:

Código PHP:
<?php

// Configuracion
$conf['mailDestinatario'] = '[email protected]';
$conf['mailAsunto'] = 'Buzon';
$conf['url_error'] = 'http://www.dominio.es/pages.php?pageid=112&menu_id=';
$conf['url_ok'] = 'http://www.dominio.es/pages.php?pageid=111&menu_id=';

######################################################################
# codigo de verificacion
######################################################################

// Validar argumentos
if(!$_POST) {
  
header('Location: '.$conf['url_error']);
  exit;
}

// Limpiar input de usuario
foreach($_POST as $id=>$value) {
  
$var[$id] = strip_tags(trim($value));
}

// Definir cuerpo del email
foreach($var as $id=>$value) {
  
$mailCuerpo .= "$id : $value\r\n";
}

// Enviar correo
if(mail($conf['mailDestinatario'], $conf['mailAsunto'], $mailCuerpo)) {
  
header('Location: '.$conf['url_ok']);
} else {
  
header('Location: '.$conf['url_error']);
}

?>
El caso es que no se como ni donde (ni tampoco cual) tengo que poner el código en php para que verifique el captcha. Si es correcta la imagen captcha, que redireccione a la página 'url_ok' y si no es correcta a 'url_error'. Estas dos url redireccionan a páginas html que informan del envío correcto del mensaje o no, y finalmente, cada una de ellas redirecciona al index de la web.

Espero haberme explicado correctamente. De todas formas, espero vuestas sugerencias.

Muchas gracias a todos por vuestra ayuda.
  #2 (permalink)  
Antiguo 23/09/2010, 02:27
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Respuesta: Cómo implementar captcha en formulario HTML+PHP

Hola:

La forma que tengo de implementar los captcha esusando sesiones, la misma imagen captcha generada con php y las librerías GD asignan el valor aleatorio a una variable de sisión:

$_SESSION["captcha"] = $codigoCaptcha;

Luego en el formulario se pone el típico campo de "código de seguridad", por ejemplo:
<input type="text" name="captcha" />

Y luego la validación del server sería:

if ($_SESSION["captcha"] == $_POST["captcha"]) // aquí el resto de validaciones y gestiones
else // lo rechaza...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 23/09/2010, 02:53
Avatar de igualacero  
Fecha de Ingreso: septiembre-2010
Mensajes: 296
Antigüedad: 14 años, 1 mes
Puntos: 16
Respuesta: Cómo implementar captcha en formulario HTML+PHP

Hola buenas, hace poco yo he tenido problemas con los spam en formularios de mi página, no se si es ese el motivo por el cual quieres incluir un captcha. Pero investigando por el google encontré una solución muy buena y que funciona realmente. Si te has fijado la mayoría de las web no tienen ya el captcha para agregar un comentario y esto hace más fácil para los usuarios rellenarlo.
El método es el siguiente en el formulario incluyes un campo más te inventas el nombre yo le llamé filtro, te pongo el codice del html:
<input name="filtro" class="xd" />
y luego con css le das la propiedad de que no sea visible en el navegador
.xd{ display:none;}
y luego con php solo tienes que comprobar si el campo está vacio:
if ($_POST['filtro'] == "") {
El spam no es capaz de diferenciar el campo oculto y lo rellena, una persona no lo ve deja vacio el campo.
Espero que te sirva,funciona de verdad, un saludo.
  #4 (permalink)  
Antiguo 23/09/2010, 03:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Cómo implementar captcha en formulario HTML+PHP

Gracias por las respuestas

Respecto a la respuesta de caricatos, supongo que la variable de sesión habrá que colocarla al inicio del código php. Pero ¿no abría que cerrar la sesión de alguna manera?
  #5 (permalink)  
Antiguo 23/09/2010, 03:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Cómo implementar captcha en formulario HTML+PHP

Cita:
Iniciado por igualacero Ver Mensaje
Hola buenas, hace poco yo he tenido problemas con los spam en formularios de mi página, no se si es ese el motivo por el cual quieres incluir un captcha. Pero investigando por el google encontré una solución muy buena y que funciona realmente. Si te has fijado la mayoría de las web no tienen ya el captcha para agregar un comentario y esto hace más fácil para los usuarios rellenarlo.
El método es el siguiente en el formulario incluyes un campo más te inventas el nombre yo le llamé filtro, te pongo el codice del html:
<input name="filtro" class="xd" />
y luego con css le das la propiedad de que no sea visible en el navegador
.xd{ display:none;}
y luego con php solo tienes que comprobar si el campo está vacio:
if ($_POST['filtro'] == "") {
El spam no es capaz de diferenciar el campo oculto y lo rellena, una persona no lo ve deja vacio el campo.
Espero que te sirva,funciona de verdad, un saludo.
Muchas gracias por la respuesta pero esta solución ya la he usado y no funciona. El spam se cuela igualmente.
  #6 (permalink)  
Antiguo 23/09/2010, 07:00
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 9 meses
Puntos: 772
Hola joankass

Muevo tu tema al foro de PHP desde Web general.

Saludos,
  #7 (permalink)  
Antiguo 24/09/2010, 03:57
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Cómo implementar captcha en formulario HTML+PHP

Hola de nuevo.

Ya he encontrado una solución que me funciona, no está nada mal y es sencilla.

La imagen captcha la genero con este código, aunque hay otros que también funcionan: (nombre archivo: captcha:php)

Código PHP:
<?php
 
function randomText($length) { 
$pattern "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
for(
$i=0;$i<$length;$i++) { $key .= $pattern{rand(0,62)}; } 
return 
$key


session_start(); 

// PARAMETROS DE LA IMAGEN ////////////////////////////// 
$ancho 100// Ancho de la imágen 
$alto 30// Alto de la imágen 
$lineas 6// Cantidad de lineas de relleno 
$chars 6// Cantidad de caracteres del captcha 

// CREO EL OBJETO IMAGEN Y LOS COLORES A UTILIZAR /////// 
$imagen imagecreate($ancho,$alto); 
$cLineas imagecolorallocate($imagen,140,140,140); 
$cFondo imagecolorallocate($imagen,200,200,200); 
$cTexto imagecolorallocate($imagen,000,000,000); 

// PINTO EL FONDO /////////////////////////////////////// 
imagefill($imagen00$cFondo); 

// AGREGO UNAS LINEAS DE RELLENO //////////////////////// 
for($c=0$c <= $lineas$c++) { 
$x1=rand(0,$ancho); 
$y1=rand(0,$alto); 
$x2=rand(0,$ancho); 
$y2=rand(0,$alto); 
imageline($imagen,$x1$y1$x2$y2$cLineas); 



// GENERO EL TEXTO ALEATORIO //////////////////////////// 
$_SESSION['tmptxt'] = randomText($chars); 

// AGREGO EL TEXTO ALEATORIO A LA IMAGEN //////////////// 
imagestring($imagen5257$_SESSION['tmptxt'], $cTexto); 

// DEVUELVO LA IMAGEN GENERADA ////////////////////////// 
header("Content-type: image/jpeg"true); 
imagejpeg($imagen); 

// DESTRUYO EL OBJETO IMAGEN PARA LIBERAR MEMORIA /////// 
imagedestroy($imagen); 

?>
En el formulario coloco la siguiente línea para presentar la imagen captcha:

Código HTML:
<br>
<img src="http://www.aytoquintanar.org/images/captcha.php" width="100" height="30"> <input name="tmptxt" type="text"> 
Código de seguridad (mayúsculas, minúsculas y números)<br>
<br> 
y el código php de verificación del captcha y formulario quedaría así: (nombre archivo: enviar:php)

Código PHP:
<?php

session_start
();

// Configuracion 
$conf['mailDestinatario'] = '[email protected]'
$conf['mailAsunto'] = 'Buzon'
$conf['url_error'] = 'http://www.dominio.es/---cambiar por la página de error---'
$conf['url_ok'] = 'http://www.dominio.es/---cambiar por la página de ok---';

######################################################################
# codigo de verificacion
######################################################################

// Validar argumentos y captcha
if(!$_POST) {
  
header('Location: '.$conf['url_error']);
  exit;
}

if (
$_SESSION['tmptxt'] != $_POST['tmptxt']) { 
  
header('Location: '.$conf['url_error']); 
  exit; 
}

// Limpiar input de usuario
foreach($_POST as $id=>$value) {
  
$var[$id] = strip_tags(trim($value));
}

// Definir cuerpo del email
foreach($var as $id=>$value) {
  
$mailCuerpo .= "$id : $value\r\n";
}

// Enviar correo
if(mail($conf['mailDestinatario'], $conf['mailAsunto'], $mailCuerpo)) {
  
header('Location: '.$conf['url_ok']);
} else {
  
header('Location: '.$conf['url_error']);
}

?>
Quiero agradecer vuestra ayuda e interés, y espero que estos códigos que os dejo sirvan a alquien que los necesite.

Saludos.
  #8 (permalink)  
Antiguo 31/10/2010, 11:39
 
Fecha de Ingreso: julio-2009
Mensajes: 75
Antigüedad: 15 años, 4 meses
Puntos: 2
Respuesta: Cómo implementar captcha en formulario HTML+PHP

Gracias joankass.
Andaba tratando de incluir el reCaptcha y no me lo permite por algún problema que ya no controlo (y creo que le sucede a más gente). He dado con tu código y te lo agradezco mucho porque creo que me puede ir bien. Únicamente que no consigo desentrañar el problema de la línea 90. ¿Me puedes indicar dónde reside el conflicto? Se me escapa y no lo veo.

Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. // Configuracion  
  5. $conf['mailDestinatario'] = '[email protected]';  
  6. $conf['mailAsunto'] = 'Buzon';  
  7. $conf['url_error'] = 'http://www.esparte.es/pg10_correoesparte_noes.php'; //---cambiar por la página de error---  
  8. $conf['url_ok'] = 'http://www.esparte.es/pg10_correoesparte_sies.php'; //---cambiar por la página de ok---
  9.  
  10.  
  11. ?>
  12. <html>
  13.  
  14. <head>
  15.  
  16.  
  17. <meta http-equiv="Content-Language" content="es">
  18. <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
  19. <title>Dirección de esparte</title>
  20. <meta http-equiv="Page-Enter" content="blendTrans(Duration=1.0)">
  21. <meta name="keywords" content="esparto,artesania,cursos,tradiciones,esparte,cesteria,capazos,alfombras">
  22. <meta name="description" content="Artesania de esparto;esparte.Cursos para aprender a elaborar cestas,capazos,alfombras,paneras">
  23.  
  24.  
  25. <script language="javascript" type="text/javascript" src="validaesparte_es.js"></script>
  26. <link rel="stylesheet" href="styleesparte.css" type="text/css">
  27.  
  28.  
  29. <!--mstheme--><link rel="stylesheet" type="text/css" href="_themes/pleita2/plei1011.css"><meta name="Microsoft Theme" content="pleita2 1011, default">
  30. </head>
  31.  
  32. <body >  <!-- </body>oncontextmenu="return false" onselectstart="return false">    -->
  33.  
  34. <div align="left">
  35.    
  36.     <div align="left">
  37.         <table border="0" width="625" cellspacing="0" cellpadding="0" id="table16">
  38.             <tr>
  39.                 <td>
  40.                 <p style="text-align: left"><font size="2">&nbsp;&nbsp; Si lo deseas puedes enviar tu mensaje a
  41.                 través de este formulario.</font>
  42.                
  43.                 </p>
  44.                 <form name="esparte" action="pg10_correoesparte_es.php" method="post">
  45. <fieldset style="width: 635px; height: 320px">
  46. <legend align="center"><b><font size="2" color="#800000">&nbsp;&nbsp;Datos del mensaje&nbsp;&nbsp;</font></b><p>&nbsp;</legend>
  47. </p>
  48. <table border=0 width="600">
  49.    
  50.     <tr>
  51.     <td class="formulario">&nbsp;&nbsp;Nombre:</td>
  52.     <td align="left"><input type="text" name="nombre" size="50" maxlength="50" onDblClick="borrartext(this)"></td>
  53.     </tr>
  54.    
  55.     <tr>
  56.     <td class="formulario">&nbsp;&nbsp;Apellidos:</td>
  57.     <td align="left"><input type="text" name="apellidos" size="50" maxlength="50" onDblClick="borrartext(this)"></td>
  58.     </tr>
  59.  
  60.     <tr>
  61.     <td class="formulario">&nbsp;&nbsp;Correo electrónico:</td>
  62.     <td align="left"><input name="correo" size="50" maxlength="50" onDblClick="borrartext(this)"></td>
  63.     </tr>
  64.  
  65.         <tr>
  66.         <td colspan="2"></div><textarea cols="110" rows="7" name="comentarios" onDblClick="borrartext(this)">&nbsp;&nbsp;&nbsp;Aquí puedes escribir lo que desees. [Doble click - Borrar]</textarea>
  67.         <br>
  68.         <br>
  69.         <br>
  70. &nbsp;<p>&nbsp;
  71.  
  72. </tr>
  73.  
  74. <tr>
  75. <td colspan="2">
  76.  
  77. <br>
  78. <img src="http://www.esparte.es/captcha.php" width="100" height="30"> <input name="tmptxt" type="text" class="textcaptcha" width="100" height="30">
  79. <font size="2" color="#800000">Código de seguridad (mayúsculas, minúsculas y números)</font><br>
  80. <br>
  81.  
  82. <?php
  83. ######################################################################
  84. # codigo de verificacion
  85. ######################################################################
  86.  
  87. // Validar argumentos y captcha
  88. if(!$_POST) {
  89.   header('Location: '.$conf['url_error']);
  90.   exit;
  91. }
  92.  
  93. if ($_SESSION['tmptxt'] != $_POST['tmptxt']) {  
  94.   header('Location: '.$conf['url_error']);  
  95.   exit;  
  96. }
  97.  
  98. // Limpiar input de usuario
  99. foreach($_POST as $id=>$value) {
  100.   $var[$id] = strip_tags(trim($value));
  101. }
  102.  
  103. // Definir cuerpo del email
  104. foreach($var as $id=>$value) {
  105.   $mailCuerpo .= "$id : $value\r\n";
  106. }
  107.  
  108. // Enviar correo
  109. if(mail($conf['mailDestinatario'], $conf['mailAsunto'], $mailCuerpo)) {
  110.   header('Location: '.$conf['url_ok']);
  111. } else {
  112.   header('Location: '.$conf['url_error']);
  113. }
  114. ?>
  115.  
  116.  
  117. </td>
  118. </tr>
  119.  
  120.     <tr>
  121.     <td colspan="2" align="center">
  122.     <button type="submit" name="formularioesparte"  onClick="return total()"> Enviar <img src="flena3.gif" alt="Enviar Formulario"> </button>
  123.     &nbsp;&nbsp;&nbsp;&nbsp;
  124.     <button type="reset"> Borrar <img src="goma1.gif" alt="Borrar los datos"></button></td>
  125.     </tr>
  126.    
  127. </table>
  128. </fieldset>
  129.  
  130. </form>
  131.    
  132.                 </td>
  133.             </tr>
  134.     <tr>
  135.     <td><br><br><br><br>
  136.     </td>
  137.     </tr>
  138.        
  139.         </table>
  140.         <p>&nbsp;</div>
  141.    
  142.            
  143.  
  144. </body>
  145. <!-- Inicio - Doble página - fuera del body y antes de /html-->
  146. <script language="JavaScript" src="menu_right10.js"></script>
  147.  
  148. <!-- Evitar pinchar para activar el control -->
  149. <script type="text/javascript" src="ieupdate.js"></script>
  150.  
  151.  
  152. </html>
__________________
Gracias de antemano por la ayuda.
Saludos.
Caminantejm.

Etiquetas: captcha, implementar, formulario
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 15:31.