Hola, tengo hecho un sistema de login (basado desde el de Cluster) y me funcionaba perfectamente. Luego quise hacer un Captcha (la tipica imagen del login.Info
AQUÍ )mediante sesiones y currandomelo con distintas variaciones como de fuente, texto, posicion de letra, angulo, etc.
Pero exactamente no queria ponerlo en el login. Si no en un formulario de reporte de Bugs que tengo echo para una aplicacion.
Y aqui llega el problema. En el formulario quiero detectar si el usuario esta registrado y entonces el campo nombre e email se cargan y no hace falta rellenarlos. Si no esta registrado, lo detecta y debe rellenarlo(ya que el reporte seria de un anonimo).
Entonces, rellena su formulario y le aparece el tipico codigo del "Captcha" para rellenar. Este funciona con sesiones y si estan las sesiones del login no funcionan y si registro antes las del captcha, no funcionan las del login, es decir, un verdadero lio. He probado a meter y registrar las variables del captcha en el login, pero claro, entonces si no esta logeado, no funciona el captcha.
LLevo ya 2 dias a full con ello y leido 20 mil articulos de sesiones y captchas y no consigo arreglarlo, por ello acudo ya al genio de la lampara aqui en foros del web a ver si podemos arreglarlo. Pongo todos los codigos (resumidos y con las partes afectadas).
login.php
Código PHP:
//...imaginen la parte en la que se hacen todas las comprobaciones y validaciones del datos y luego
if($estalogeado==true)
{
session_name("app_login");
session_start();
session_cache_limiter('nocache,private');
$_SESSION['USER_ID']=$login['id'];
$_SESSION['uNick']=$login['nick'];
$_SESSION['uPass']=$login['password'];
//...ya estaria hecha la sesion del login y logeado
}
else
{
//los tipicos mensajes de error
}
formulario.php
Aqui se envian los datos de reporte(es donde esta el conflicto del captcha y el login)
Código PHP:
session_name("app_login");//Inicio la sesion del login
session_start();
if (!isset($_SESSION['uNick']) && !isset($_SESSION['uPass'])){
session_destroy();// Borramos la sesion si no hay nick ni pass (seria un anonimo)
}
//Registro el captcha
session_name("captcha");//Inicio la sesion del login
session_start();
//Ahora la parte del formulario
if(!isset($enviar))
{
if(ser_user($uNick,$uPass))
{//Una simple funcion que si esta logeado mira en la BD si es correcto
echo "Usuario: $uNick";//Como esta logeado ponemos el user
}
else
{//No esta logeado
echo 'Usuario:
<input type="text" name="user" value="Introduce tu usuario">';
}
//Ahora vendria el campo de asunto y descripcion y al final el captcha
echo "Codigo:"
//Envio la session del captcha para generar los caracteres
echo '<img src="img_captcha.php?SID">';
//Aqui recogemos el codigo que mete el usuario
echo'<input name="captcha_ingresado" type="text">';
//El tipico submit y demas
}
elseif($enviar)//Si envia el formulario
{
//Recogemos el caracter generado en la sesion
$caracter=$HTTP_SESSION_VARS['captcha']['caracter_session'];
if($captcha_ingresado==$caracter)
{//Si coincide el codigo de captcha de usuario con el de sesion
echo "Usted ingreso el codigo correctamente.";
}
else {
echo "El texto ingresado no coincide.";
}
}
img_captcha.php
//Este fichero contiene todo el algoritmo que genera el captcha y devuelve una imagen
Código PHP:
//Creamos la imagen
$img=imagecreate(90,30);//Dimensiones del Captcha
//Le ponemos un fondo y demas
//Luego con un for generariamos los caracteres y demas codigo del captcha
//y nos queda una variable $caracter con un valor de caracteres como codigo //a introducir en el captcha, supongamos 4GH
$caracter="4GH";//Lo que nos devolveria el for y demas, lo simplifico aqui.
//Meto el codigo en una variable de sesion que luego la recogemos en el formulario
$_SESSION['captcha']['caracter_session']=$caracter;
//Devuelvo la imagen y termina ya esto
header("Content-type: image/png");
imagepng($img);
Eso seria todo, pero hay bastantes conflictos, como os comentaba al principio y me tiene ya algo desesperao porque no se por donde atacarle, a ver si conseguis decirme alguna nueva linea de ataque para que me ponga a ello y lo solucione. Gracias