[Tutorial] Login y registro basico sin unas base de datos

Iniciado por HckDrk, Mayo 17, 2011, 04:22:15 PM

Tema anterior - Siguiente tema

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

Mayo 17, 2011, 04:22:15 PM Ultima modificación: Marzo 27, 2014, 05:51:55 PM por Expermicid
hola!

jojo, aqui uno de mis pequeños aportes xD

les traigo amm un "tutorial" de un login y registro basico sin usar base de datos com mysql (el mas usado en php), oracle o algun otro tipo de DB

espero le entiendan, esta muy comentado, en casi todas las lineas, sino entienden algo solo me dicen! :)

ok, consistira de 3 paginas php, el primero sera el index.php, donde se mostrara el contenido, sino estas logueado nos redireccionara al login.php

Código: php

<?php
session_start();

if($_SESSION['login']!="ok"){ //si la variable de sesion login es diferente a "ok"

header("Location: login.php"); //redirgimos al login.php

}else{ //si la variable es igual a "ok" mostramos el contenido..
?>

<html>
<head>
<title>aqui el contenido para usuarios registrados</title>
</head>
<body bgcolor="#000000" text="#FFFFFF">
<p align="right">Bienvenido <b><?php echo $_SESSION['usuario']; ?></b> | <a href="login.php?action=logout">Cerrar Sesion</a></p><hr><br>
<center>
<h1>Aqui iria el contenido para los usuarios registrados</h1>
blablabla xD<br>Visita <a href="http://zone-hack.net" target="_blank">http://zone-hack.net</a>
</body>
</html>
<?php
}
?>


despues sigue el archivo registrar.php donde crearemos unas carpetas con el nombre del usuario, y ahi adentro crearemos un archivo con los datos del usuario. PD: hay que crear una carpeta que se llame "users" (sin comillas)

Código: php

<?php

//sistema de des/encriptacion por HckDrk, Zone-Hack.Net
function des_encriptacion_zh($action,$cadena){ //primer parametro, encriptacion o desencriptacion. el segundo es la cadena a encriptar o desencriptar

if($action=="encriptacion"){

$valor=file_get_contents("http://tools.zone-hack.net/Apis/Encriptacion/index.php?action=$action&cadena=$cadena");
$valor=html_entity_decode($valor);

}else if($action=="desencriptacion"){

$valor=file_get_contents("http://tools.zone-hack.net/Apis/Encriptacion/index.php?action=$action&cadena=$cadena");
$valor=html_entity_decode($valor);

}else{

exit("Error en la funcion </i>des_encriptacion_zh<i>, en el primer parametro solo se premite introducir \"encriptacion\" o \"desencriptacion\" ");

}

return $valor;

}

if($_POST['action']=="enviar"){ //si mandamos el formulario...

if($_POST['usuario']=="" || $_POST['email']=="" || $_POST['pregunta']=="" || $_POST['r_secreta']=="" || $_POST['pass']=="" || $_POST['pass2']==""){ //si los campos estan vacios

echo"<script>alert('debe rellerar todos los campos')</script>"; //mostramos error

}else{ //sino estan vacios...

if($_POST['pass']!=$_POST['pass2']){ //si los password no coinciden
echo "<script>alert('los password no coinciden!')</script>"; //mostramos mensaje de error
}else{ //si coinciden..

if(!file_exists("./users/".$_POST['usuario'])){ //si no existe el usuario..

mkdir("users/".$_POST['usuario'], 0777) or die("no se pudo crear el usuario "); //creamos una carpeta
$fp=fopen("users/".$_POST['usuario']."/datos.php","w+") or die("no se pudo crear el usuarioo"); //creamos el archivo datos.php donde se guardara su user y su pass
fputs($fp,"<?php\n");
fputs($fp,"\$email=\"".strip_tags($_POST['email'])."\";\n"); //eliminamos etiquetas html, y guardamos el correo
fputs($fp,"\$pregunta=\"".strip_tags($_POST['pregunta'])."\";\n"); //eliminamos etiquetas html, y guardamos la pregunta para cambiar pass
fputs($fp,"\$r_secreta=\"".strip_tags($_POST['r_secreta'])."\";\n"); //eliminamos etiquetas html, y guardamos el user
fputs($fp,"\$user=\"".strip_tags($_POST['usuario'])."\";\n"); //eliminamos etiquetas html, y guardamos el user
fputs($fp,"\$pass=\"".des_encriptacion_zh("encriptacion",strip_tags($_POST['pass']))."\";\n"); //eliminamos etiquetas html, encriptamos con nuestro propio sistema de encriptamiento y guardamos el pass
fputs($fp,"?>\n");
echo "<script>alert('registro completo!')</script>"; //mostramos que todo salio bien
echo "<meta http-equiv=\"refresh\" content=\"0;url=login.php\">";


}else{ //si ya existe el usuario
echo "<script>alert('ya existe el usuario ".$_POST['usuario']."')</script>"; //mostramos que ya existe el usuario
}
}
}
}



?>
<html>
<head>
<title>Registro de usuarios sin base de datos</title>
</head>
<body bgcolor="#000000" text="#FFFFFF">

<br>
<?php

if($_SESSION['login']!="ok"){ //si la variable de sesion es diferente a ok entonces mostraremos el formulario de registro

?>
<center>
<h1>Registro de usuarios sin base de datos</h1>
<table border="0" align="center">
<form method="post" action="registrar.php">
<tr><td>usuario: </td><td><input type="text" name="usuario"></td></tr>
<tr><td>E-mail: </td><td><input type="text" name="email"></td></tr>
<tr><td>password: </td><td><input type="password" name="pass"></td></tr>
<tr><td>repita el pass: </td><td><input type="password" name="pass2"></td></tr>
<tr><td>pregunta seguridad: (<a href="javascript:alert('se te preguntara esta pregunta y su respuesta en caso de que olvides tu password')">?</a>)</td><td><select name="pregunta"><option value="">selecciona una pregunta</option><option value="mascota favorita">mascota favorita</option><option value="mejor amigo">mejor amigo</option><option value="pelicula favorita">pelicula favorita</option></select></td></tr>
<tr><td>respuesta secreta: </td><td><input type="text" name="r_secreta"></td></tr>
<input type="hidden" name="action" value="enviar">
<tr><td colspan="2"><center><input type="submit" value="registrarse!"></center></td></tr>
<tr><td colspan="2"><center><a href="login.php">Iniciar Sesion</a></center></td></tr>
</form>
</table>
<?php
}else{ //si la varieble de sesion es igual a ok entonces redirigimos al index

header("Location: index.php");

}
?>
</body>
</html>


y por ultimo el login.php donde crearemos variables de sesion para poder ver el contenido del index, tambien aqui podremos recuperar el password, pos si se nos olvido..

Código: php

<?php
session_start();

//sistema de des/encriptacion por HckDrk, Zone-Hack.Net
function des_encriptacion_zh($action,$cadena){ //primer parametro, encriptacion o desencriptacion. el segundo es la cadena a encriptar o desencriptar

if($action=="encriptacion"){

$valor=file_get_contents("http://tools.zone-hack.net/Apis/Encriptacion/index.php?action=$action&cadena=$cadena");
$valor=html_entity_decode($valor);

}else if($action=="desencriptacion"){

$valor=file_get_contents("http://tools.zone-hack.net/Apis/Encriptacion/index.php?action=$action&cadena=$cadena");
$valor=html_entity_decode($valor);

}else{

exit("Error en la funcion </i>des_encriptacion_zh<i>, en el primer parametro solo se premite introducir \"encriptacion\" o \"desencriptacion\" ");

}

return $valor;

}

if($_SESSION['login']=="ok"){ //si la variable de sesion login es igual a "ok"

if($_GET['action']=="logout"){ //si el action obtenido de la ur es igual a logout destruimos las sessiones
Session_destroy();
header("Location: index.php");
exit();
}else{ //sino es ninguna accion redirigimos al index

header("Location: index.php");
exit();
}

}else{ //sino es igual a ok

if($_GET['action']=="remember"){ //si el action tomado del url es igual a remember


if($_POST['remember']=="enviar"){ //si enviamos el formulario de recordar pass
if($_POST['usuario']=="" || $_POST['email']=="" || $_POST['pregunta']=="" || $_POST['r_secreta']==""){ //si los campos estan vacios..
echo "<script>alert('debe rellenar todos los campos')</script>"; //mostramos mensaje de error
echo "<meta http-equiv=\"refresh\" content=\"0;url=login.php?action=remember\">"; //y redirigimos de nuevo al formulario
}else{ //si los campos no estan vacios
if(file_exists("./users/".$_POST['usuario'])){ //si existe el usuario
include("./users/".$_POST['usuario']."/datos.php"); //incluimos los datos
if($email==$_POST['email']){ //si el email del login coincide con el del registro
if($pregunta==$_POST['pregunta'] && $r_secreta==$_POST['r_secreta']){ //si la pregunta de seguridad y el email coinciden con los del registro
$encabezados = "From: [email protected]\nReply-To: [email protected]\nContent-Type: text/html; charset=iso-8859-1";
$mensaje= "tu usuario es: ".$_POST['usuario']."<br><br>Tu password es: ".des_encriptacion_zh("desencriptacion",$pass);
if(mail($_POST['email'], "has solicitado tu password",$mensaje, $encabezados)){ //mandamos el email con los datos
echo "<script>alert('tu pass ha sido enviado a tu correo')</script>";
}else{ //sino se pudo mandar el email
echo "<script>alert('tu password es: ".des_encriptacion_zh("desencriptacion",$pass)."')</script>"; //mostramos el password
echo "<meta http-equiv=\"refresh\" content=\"0;url=index.php\">"; //redirigimos al index
}
}else{ //si la pregunta o respuesta secreta no coindicen con los del registro...
echo "<script>alert('la pregunta o respuesta secreta no coinciden con la pregunta o respuesta del registro')</script>"; //mostramos error
echo "<meta http-equiv=\"refresh\" content=\"0;url=login.php?action=remember\">"; //redirigimos al formulario
}
}else{ //si el email no coindide con el del registro
echo"<script>alert('el email no coincide con el del registro')</script>"; //mostramos error
echo "<meta http-equiv=\"refresh\" content=\"0;url=login.php?action=remember\">"; //redirigimos al formulario
}

}else{ //si el usuario no existe..
echo"<script>alert('el usuario no existe!')</script>"; //mostramos error
echo "<meta http-equiv=\"refresh\" content=\"0;url=login.php?action=remember\">"; //redirigimos al formulario
}
}
}else{ //sino se ha enviado el formulario de recordar pass mostramos el formulario..
?>
<html>
<head>
<title>Remeber Password</title>
</head>
<body bgcolor="#000000" text="#FFFFFF">
<center>
<h1>recordar pass</h1>
<table border="0" align="center">
<form method="post" action="login.php?action=remember">
<tr><td>usuario: </td><td><input type="text" name="usuario"></td></tr>
<tr><td>E-mail: </td><td><input type="text" name="email"></td></tr>
<tr><td>pregunta seguridad: (<a href="javascript:alert('la pregunta que elegiste cuando te registraste')">?</a>)</td><td><select name="pregunta"><option value="">selecciona una pregunta</option><option value="mascota favorita">mascota favorita</option><option value="mejor amigo">mejor amigo</option><option value="pelicula favorita">pelicula favorita</option></select></td></tr>
<tr><td>respuesta secreta: </td><td><input type="text" name="r_secreta"></td></tr>
<input type="hidden" name="remember" value="enviar">
<tr><td colspan="2"><center><input type="submit" value="Obtener Password"></center></td></tr>
<tr><td colspan="2"><center><a href="login.php">Iniciar Sesion</a></center></td></tr>
</form>
</table>
</body>
</html>
<?php
}
}else{ //si el action obtenido de la url no es remember


if($_POST['action']=="enviar"){ //si enviamos el formulario del login

if($_POST['usuario']=="" || $_POST['pass']==""){ //si los campos estan vacios
echo"<script>alert('debe introducir todos los datos!')</script>"; //mostramos error
}else{ //sino estan vacios

if(file_exists("./users/".$_POST['usuario'])){ //si existe el usuario
include("./users/".$_POST['usuario']."/datos.php"); //incluimos los datos
if($pass==des_encriptacion_zh("encriptacion",$_POST['pass'])){ //si el pass del login coincide con el del rgistro
$_SESSION['usuario']=strip_tags($_POST['usuario']); //creamos una variable de sesion con el nombre del usuario
$_SESSION['login']="ok"; //creamos la variable de sesion login con el valor de ok
header("Location: index.php"); //redirigimos al index
}else{ //si no coinciden los pass
echo"<script>alert('los datos son incorrectos!')</script>"; //mostramos que no son correctos los datos
}

}else{ //sino existe el usuario
echo "<script>alert('el usuario no existe!')</script>"; //mostramos que no existe el usuario
}

}

}

}

}
if($_GET['action']!="remember"){ //si action obtenido de la url es diferente a remember mostramos el formulario de login
?>
<html>
<head>
<title>Login</title>
</head>
<body bgcolor="#000000" text="#FFFFFF">
<center>
<h1>Login de usuarios</h1>
<table border="0" align="center">
<form method="post" action="">
<tr><td>Usuario:</td><td><input type="text" name="usuario"></td></tr>
<tr><td>Pass:</td><td><input type="password" name="pass"></td></tr>
<input type="hidden" name="action" value="enviar">
<tr><td colspan="2"><center><input type="submit" value="Enviar"></center></td></tr>
</form>
<tr><td><center><a href="registrar.php">Registrarse</a></td><td><center><a href="login.php?action=remember">Olvido su Password?</a></td></tr>
</table>
</body>
</html>
<?php
}
?>

¿Es seguro?, ¿Qué pasa si en vez de meter etiquetas HTML y suponiendo que tienes las magic_quotes() OFF pongo ' o "? tu datos.php pasaría a verse porque daría un error de sintáxis, por lo demás esta muy bueno, te recomiendo que cuando utilizes solo string utilizes comillas simples para evitar poner la diagonal invertida:

Tu línea:
Código: php

<?php
fputs($fp,"\$email=\"".strip_tags($_POST['email'])."\";\n");
?>


Mi línea:
Código: php

<?php
fputs($fp,'$email="'.strip_tags($_POST['email']).'";'."\n");
?>


Solo uso comillas dobles en el \n ya que las comillas simples no lo procesan, saludos.

P.D. Buen método.
Cada vez que me das Karma me motivas

Buenas, decir que me parece muy bueno el código y que si pudiera usarlo para un proyecto.

un saludo!

saludos soy nuevo en e foro y en programacion, probe el cdigo y me aparecen los siguientes errores, Notice: Undefined index: login , Notice: Undefined index: action
uso windows wampserver y visualizo el codigo en locahost. ayuda por favor y gracias

Me parece muy buen post, solo tengo una pregunta según lo que vi del código el mismo código crea la carpeta, pero y como o donde le ponemos el usuario y la contraseña, la duda es en la linea 40 y 41 de registrar.php, en caso de ser así, y si no pues de plano no entendí nada, si me pudieras echar una mano HckDrk. gracias. ;D

La verdad (sin ofender a HckDrk) no recomiendo hacer un login y registro de esta manera; en unos momentos trataré de subir uno más actualizado y explicando batantes cosas.

Saludos.
Cada vez que me das Karma me motivas

Noviembre 19, 2011, 04:40:32 AM #6 Ultima modificación: Noviembre 19, 2011, 04:43:11 AM por s00rk
Para esto prefiero hacer una clase, luego crear el objeto y de ahi crear una de-serializacion segun lo que ocupe y ya. (Esto en PHP nunca lo he hecho, pero he leido que tambien existe tal funcion y si se puede tratar como lo he hecho en C# es posible y bastante sencillo)

O tambien hacerlo directamente todo en un xml.

pues espero ese tuto Xt3mP, si furas tan amable de avisar cuando este listo. gracias.

Yo te aviso rabulu.
Cada vez que me das Karma me motivas

Ok Xt3mP espero......  tic tac tic tac............
saludos.

concuerdo con Xt3mP
nadie con experiencia usaria ese codigo, pero es un claro ejemplo de como manejar las sesiones
PD: las contraseñas no son necesesarias, solo son medidas de seguridad para evitar el rovo de identidad

Así es, aunque no recomiendo hacer login sin base de datos; te expones más en términos de seguridad.

En cuanto logre montar videos HD haré un tutorial de como crear un login básico con sesiones + DB.

P.D. Aprovecho el post para saber si alguien sabe como puesto que cambie de camtasia y de resolución... y ver videos pantalla completa no me favorece porque el código no se aprecia bien.
Cada vez que me das Karma me motivas