Ayuda con captcha

Iniciado por DarkItachi, 10 Abril 2011, 13:39 PM

0 Miembros y 1 Visitante están viendo este tema.

DarkItachi

Hola, estoy haciendo un captcha para mi web y me ha surgido un problemilla.

Os planteo la situación, tengo los siguientes archivos:

register.php
captcha.php

El primero me muestra el captcha y mediante javascript y php en teoría tiene que decir si es correcto, el segundo me lo genera y me envía el código mediante $_SESSION['captcha'] ; naturalmente, el primero también lo lee desde $_SESSION['captcha'] .

Os preguntaréis, ¿cuál es el problema?

El problema esque $_SESSION['captcha'] me devuelve el código de captcha de la página anterior. Es decir:

- Voy a la página y se genera un captcha (E6DAS) y el código está vacio: ""
- Recargo la página y se genera otro captcha (PA9SF), pero el código es el de la página anterior (E6DAS)
- Recargo la página y se genera otro captcha (ASD4D), pero el código es el de la página anterior (PA9SF)

Antes de mostrar $_SESSION['captcha'] hago un session_start() , y creo que tendría que funcionar bien, pero no sé dónde meto la pata...

¿Alguna idea?

Saludos.
Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.

~ Yoya ~

Lo mejor seria que muestres el source de registerr y creo que no esta de mas el captcha.php
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

DarkItachi

Aquí estan :)

register.php

Código (javascript) [Seleccionar]
<script type="text/javascript" src="sha1.js"></script>
<script type="text/javascript"> //Función para validar el formulario
function verificar_correo(texto)
{
    var status = false;    
    var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
    if (texto.search(emailRegEx) != -1)
    {
 status = true;
    }
    return status;
}
function validar()
{
   var noerrors=1;
   var charset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
   var usu1=document.registro.usuario.value;
var pas1=document.registro.pass.value;
var pas2=document.registro.pass2.value;
var email=document.registro.correo.value;
if (usu1.length>3)
{
for (i=0;i<usu1.length;i++)
{
if (charset.indexOf(usu1.charAt(i),0)==-1)
{
alert("The username only can contain alphanumeric characters [a-z,A-Z,0-9], dashes [-] and underscores [_].");
noerrors=0;
break;
}
}
}
else
{
alert("The username must be equal or longer than 4 characters.");
}
if (pas1!=pas2)
{
alert("The passwords doesn't match. Please, rewrite them.");
noerrors=0;
} else if (pas1.length<4 || pas2.length<4) { alert("Password must be equal or longer than 4 characters."); noerrors=0; }
if (!(verificar_correo(email))) { alert("The email that you wrote is invalid."); noerrors=0; }
var thecaptcha=<?php echo '"'.$_SESSION['captcha'].'"'?>; //aqui hay code php
if (thecaptcha!=document.registro.captchacode.value)
{
alert(thecaptcha);
alert("Please, write again the captcha, you don't writted it properly.");
}
document.registro.js.value=1;
document.registro.pass=sha1(sha1(document.registro.pass.value));
document.registro.pass2=sha1(sha1(document.registro.pass2.value));
if (noerrors==1) { document.registro.submit(); }
}
</script>
<img src="captcha.php">


captcha.php
Código (php) [Seleccionar]
<?php
$numcaracteres
=8;
session_start();
$caracteres '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$codigo '';
$i 0;
while (
$i $numcaracteres)
{
    
$codigo .= substr($caracteresmt_rand(0strlen($caracteres)-1), 1);
    
$i++;
}
$ancho 300;
$alto 60;
$imagen ImageCreate($ancho$alto);
$color1 ImageColorAllocate($imagen000); // negro
$color2 ImageColorAllocate($imagen124159191); // azul
$color3 ImageColorAllocate($imagen25500); //rojo
ImageFill($imagen00$color2);
ImageString($imagen515030$codigo$color1);
imageline($imagen05$ancho5$color1);
imageline($imagen$ancho/40$ancho/2$alto$color1);
imageline($imagen018$ancho18$color1);
imageline($imagen46086$alto$color1);
header("Content-Type: image/png");
ImagePng($imagen);
$_SESSION["captcha"] = $codigo;
ImageDestroy($imagen);
?>
Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.

~ Yoya ~

Bueno, te explico lo que pasa.

1- Imprimes el valor de la Sesión captcha, como no existe la sesión captcha, no muestra nada pero mas abajo en
Código (html4strict) [Seleccionar]
<img src="captcha.php">
Modificas el valor de la sesión captcha y le agregas el valor que contiene la captcha.

Eso haces en el primer momento de ejecución:

1-Muestra el valor de la Sesión captcha, luego muestra la imagen y luego modificas el valor de la sesión captcha con el valor de la captcha actual.
2-Muestra el valor de la Sesión captcha (Recordando que el valor de la captcha lo modificaste por el valor de la captcha actual), luego muestra la imagen y luego modificas el valor de la sesión captcha con el valor de la captcha actual.



Ejemplo de lo que haces:
Código (php) [Seleccionar]
<?php
session_start
();

echo 
$_SESSION['a'];//Muestro la Session a

$_SESSION['a'] = $_GET['x'];//Modifico la Session por otro valor

echo "<br>".$_SESSION['a']; //Muestro el nuevo valor de la Session a

?>


Otro ejemplo:
Código (php) [Seleccionar]
<?php

$var 
'hola mundo';

echo 
$var;

$var '<br>Adios mundo';

echo 
$var;

?>




Por lo tanto, siempre el primer valor que imprimo sera diferente al segundo.

Lo que tienes que hacer, es mostrar primero la captcha antes de mostrar el valor que contiene la captcha.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

DarkItachi

#4
¿Y cómo puedo conseguir eso?, no consigo ver la manera de cambiarlo  :-\

Saludos :)

PD: Así el código lo he puesto esquemático, pero en la web real hay muchos tags HTML y texto de por medio antes de poner la imagen del captcha, y naturalmente lo mismo después de este.
Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.

~ Yoya ~

Ps ya sabes porque causa que se muestra el valor de la capcha anterior, nose como podría decirte como lo pudieras cambiar ya que no veo el source completo. Y si es muy largo no creo que alguien intente entender el source...


  • Lo mejor seria que trates de resolver el problema, sabes la causa y solo queda pensarlo ya que el problema es lógico.
  • Otra opción, seria que nos muestre el algoritmo completo que usas pero seria muy tedioso escribirlo xD y siempre esta la opción que se te olvide algo.

Lo mejor es que lo trates de resolver y te serviría de experiencia.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

DarkItachi

Código (javascript) [Seleccionar]
<html>
<script type="text/javascript" src="sha1.js"></script>
<script type="text/javascript"> //Función para validar el formulario
function verificar_correo(texto)
{
     var status = false;     
     var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
     if (texto.search(emailRegEx) != -1)
     {
  status = true;
     }
     return status;
}
function validar()
{
    var noerrors=1;
    var charset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
    var usu1=document.registro.usuario.value;
var pas1=document.registro.pass.value;
var pas2=document.registro.pass2.value;
var email=document.registro.correo.value;
if (usu1.length>3)
{
for (i=0;i<usu1.length;i++)
{
if (charset.indexOf(usu1.charAt(i),0)==-1)
{
alert("The username only can contain alphanumeric characters [a-z,A-Z,0-9], dashes [-] and underscores [_].");
noerrors=0;
break;
}
}
}
else
{
alert("The username must be equal or longer than 4 characters.");
}
if (pas1!=pas2)
{
alert("The passwords doesn't match. Please, rewrite them.");
noerrors=0;
} else if (pas1.length<4 || pas2.length<4) { alert("Password must be equal or longer than 4 characters."); noerrors=0; }
if (!(verificar_correo(email))) { alert("The email that you wrote is invalid."); noerrors=0; }
var thecaptcha=<?php echo '"'.$_SESSION['captcha'].'"'?>;
if (thecaptcha!=document.registro.captchacode.value)
{
alert(thecaptcha);
alert("Please, write again the captcha, you don't writted it properly.");
}
document.registro.js.value=1;
document.registro.pass=sha1(sha1(document.registro.pass.value));
document.registro.pass2=sha1(sha1(document.registro.pass2.value));
if (noerrors==1) { document.registro.submit(); }
//activacion del correo
}
</script>
<head>
<link rel="shortcut icon" href="/images/favicon.ico" />
<style type="text/css">
body {
font-family: "Agency FB";
font-style: bold;
color: black;
background-color: #7c9fbf;
}
.cuadro {
background-color: #FFFFFF;
border: #666666;
border-style: solid;
border-top-width: 5px;
border-right-width: 5px;
border-bottom-width: 5px;
border-left-width: 5px;
border-color: #8ec1da;
-moz-border-radius: 15px;
margin:10px 10px 10px 10px;
}
</style>
<title>Fast Click URL</title>
</head>
<body>
<br> <br>
<center> <img src="/images/logo3.png"</center>
<br> <br>
<table width="600" class="cuadro" align="center" style="font-size:40px;text-align:center"> <form name="registro" method="post" action="check.php">
<input type="hidden" name="js" value="0">
<tr> <td>
Username: <br><input type="text" name="usuario" width="80" class="cuadro" style="text-align:center;font-size:30px;font-family:Calibri">
</td> </tr>
<tr> <td>
Password: <br><input type="password" name="pass" width="80" class="cuadro" style="text-align:center;font-size:30px;font-family:Calibri">
</td> </tr>
<tr> <td>
Repeat Password: <br> <input type="password" name="pass2" width="80" class="cuadro" style="text-align:center;font-size:30px;font-family:Calibri">
</td> </tr>
<tr> <td>
E-mail: <br> <input type="text" name="correo" width="80" class="cuadro" style="text-align:center;font-size:30px;font-family:Calibri">
</td> </tr>
<tr> <td>
Captcha code: <br> <input type="text" name="captchacode" width="80" class="cuadro" style="text-align:center;font-size:30px;font-family:Calibri">
</td> </tr>
<tr> <td> <img src="captcha.php"> </tr> </td>
EL CAPTCHA LLEGA ATRASADO, SIEMPRE LLEGA EL ANTERIOR
<tr> <td>
<script type="text/javascript">
document.write('</tr> </td><tr> <td> <center> <input type="button" width="80" onclick="validar()" value="   Register   " style="text-align:center;font-size:30px;font-weight:bold;border-color:#2f57a9;background-color:#d9d9d9" class="cuadro"> </center> </tr></td> </tr>');
</script>
<noscript>
<td> <tr>
<center> <input type="submit" width="80"  value="   Register   " style="text-align:center;font-size:30px;font-weight:bold;border-color:#2f57a9;background-color:#d9d9d9" class="cuadro"> </center>
</tr> <td>
</noscript>
</form> </table>
<table width="100" class="cuadro" align="center" style="font-size:30px;text-align:center;margin-top:10px"> <tr>
<td> <a href="index.php"><img src="/images/arrow.png"></a>
</td> </tr> </table>
</head>
</body>


He probado a resolverlo por mi mismo pero no lo consigo, el código que postee era todo el código JS y PHP. Ahora añado el HTML para que veas que no se como arreglarlo, a ver si se te ocurre algo.

Saludos
Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.

~ Yoya ~

No creo que vaya a leer todo el código xD, te toca pensarlo man.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

DarkItachi

Porfavor, necesito ayuda, ¡no hay manera de conseguirlo!

Saludos :(
Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.

.mokk.

Ya vi tu codigo y a como lo veo esque luego de dar click llamas la funcion y ahi todo bien pero al mismo tiempo recarga la web y ahi ya cambia de nuevo el valor.

Bueno aqui te dejo mi codigo que tengo en mi web, puede que encuentres codigo demas, pero ahi puedes checar que luego de dar click al boton, el form no recarga, es lo primero que hace el code que si se le dio click haga el codigo sino muestra el form

Código (php) [Seleccionar]
<?php
if(isset($_POST['reset']))
{
$user clean($_POST['user']);
$tmp clean($_POST['captch']);
if(empty($user) || empty($tmp))
{
alertbox("No dejes espacios vacios","index.php?do=reset");
}
if($tmp != $_SESSION['tmptxt'])
{
alertbox("El codigo es incorrecto","index.php?do=reset");
}
$q mssql_query("SELECT * FROM Account WHERE UserID='".$user."'");
if(!mssql_num_rows($q))
{
alertbox("El UserID No Existe","index.php?do=reset");
}else{
$r mssql_fetch_object($q);
if($r->Code != || $r->Code != ""){
alertbox("Ya Hay Un Codigo, Disponible en tu cuenta, revisa tu correo, Checa que podria estar en la zona Spam","index.php");
}
}

do{
$code random1(40);
$q mssql_query("SELECT * FROM Login Where Code='".$code."'");
if(mssql_num_rows($q))
{
$y 1;
}else{
$y 0;
}
}while($y == 1);
mssql_query("UPDATE Login SET CodeFecha=GETDATE(), Code='".$code."' WHERE AID='".$r->AID."'");
$texto "Se te ha enviado un correo con la direccion donde podras cambiar tu contraseña, <br> Este Link Solo es valido 1 vez
http://"
.getUrl()."/index.php?do=reset2&code=".$code."&aid=".$r->AID."<br>El codigo es valido por 15 dias";
enviarmail($r->Email,"Reset Contraseña",$texto);
alertbox("Se te ha enviado un correo con las instrucciones para cambiar tu contraseña, El codigo es valido por 15 dias","index.php");
}else{
?>

<form name="resetz" method="post">
<center><font color="#00FF00">
Ingresa el UserID: <br>
<input type="text" name="user"><br>
Codigo de Verificacion:<br><br>
<img src="./modulos/captcha.php" width="100" height="30" vspace="3"><br>
<input type="text" name="captch"><br><br>
<input type="submit" name="reset" value="Reset Contraseña">
</font></center>
</form>
<? } ?>[/php]

captcha.php
[code=php]
<?php
session_start
();
function 
randomText($length) {
    
$pattern "1234567890abcdefghijklmnopqrstuvwxyz";
    for(
$i=0;$i<$length;$i++) {
      
$key .= $pattern{rand(0,35)};
    }
    return 
$key;
}

$_SESSION['tmptxt'] = randomText(8);
$captcha imagecreatefromgif("bgcaptcha.gif");
$colText imagecolorallocate($captcha000);
imagestring($captcha5167$_SESSION['tmptxt'], $colText);

header("Content-type: image/gif");
imagegif($captcha);
?>


Espero te ayude si aun asi no puedes ahi te hecho una mano n_n[/code]