[Tutorial]Registro basico vía web

Necesitas imagenes, audio, botones, infinidades de cosas para tu web? Este es tu lugar!
Reglas del Foro
Reglas:

1. Usa [Recurso] para cualquier recurso (imagenes, botones, bla bla bla xD)
2. Usa [Tutorial] para cualquier tutorial
3. Nada de Webs para "Ganar Dinero"
4. Si vas a postear aplicaciones, debes seguir las mismas reglas que el subforo de PROGRAMAS

[Tutorial]Registro basico vía web

Notapor elvago » Jue Feb 18, 2010 12:09 am

Bueno.. Ya había posteado esto en SA-MP Forum y porqué no postearlo acá?.. Es para los servers que estan conectado vía MySQL.. Solo tendrán que cambiar algunos datos.. Espero que les sirva de algo ;)

Registro / Login de usuarios.

Comenzando...
Primero debemos saber qué datos necesitará nuestro usuario para registrarse. Lo más usual es Nick, Contraseña y Correo. Comenzaremos creando una base de datos MySQL (O usando una que tengamos creada ya, a gusto) y añadiendo una nueva tabla, que llamaremos jugadores. La tabla tendrá 4 campos (pueden ser más dependiendo el caso): id, nick, contra, correo. Donde id será int(32), y el resto tinytext. Puedes crearla manualmente ó automáticamente ejecutando la siguiente sentencia sql:

Código: Seleccionar todo
CREATE  TABLE `jugadores` ( `id` INT( 32  )  UNSIGNED NOT  NULL  AUTO_INCREMENT  PRIMARY  KEY ,
`nick` TINYTEXT NOT  NULL ,
`contra` TINYTEXT NOT  NULL ,
`correo` TINYTEXT NOT  NULL
) ENGINE  =  MYISAM


Bien. Eso habrá creado una tabla con los 4 campos, asignando al campo id como campo primario y de auto-incremento (Es decir, no será necesario especificar un valor para este campo por cada usuario, se asignará solo).

El formulario
Ya teniendo la tabla en nuestra base de datos, es necesario hacer el formulario por el cual los usuarios ingresarán sus datos para registrarse, para luego insertarlos. Esta es la parte más sencilla. Haremos un formulario que envíe los datos a registrar.php por medio del método POST, y que conste de 4 campos: Nick, Contraseña, Confirmar contraseña y Correo.

Código: Seleccionar todo
<form method="post" action="registrar.php">
  Usuario:<br />
  <input type="text" name="r_user" /><br />
  Contraseña:<br />
  <input type="password" name="r_pass" /><br />
  Confirmar contraseña:<br />
  <input type="password" name="r_pass_c" /><br />
  Correo:<br />
  <input type="text" name="r_mail" /><br />
  <br />
  <input type="submit" value="Registrarse" />
</form>


Hay que prestar atención al nombre de cada campo (El atributo 'name'), porque ese será el nombre del elemento cuando lo manipulemos con php. Bien, ahora pasamos al código php.

El archivo registrar.php
Este archivo, al que se le enviarán las variables, constará de 3 partes: Comprobación, ejecución y confirmación (Que lindo ha quedado :P ). En la primera parte, nos aseguraremos de que se compruebe que los datos son correctos, en la segunda, añadiremos los usuarios a la base de datos, y en la tercera mostraremos el mensaje de éxito.
Comenzamos con la comprobación:

Código: Seleccionar todo
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$r_user = htmlentities($_POST['r_user'], ENT_QUOTES);
$r_pass = htmlentities($_POST['r_pass'], ENT_QUOTES);
$r_pass_c = htmlentities($_POST['r_pass_c'], ENT_QUOTES);
$r_mail = htmlentities($_POST['r_mail'], ENT_QUOTES);

// Comprobamos que se haya escrito un nombre de usuario
if($r_user != "") {
  // Ahora comprobamos lo mismo para el mail
  if($r_mail != "") {
    // Para la contraseña... {
    if($r_pass != "") {
      // Bien, ahora comprobaremos que las 2 contraseñas escritas sean iguales:
      if($r_pass === $r_pass_c) {
        /* Todo comprobado. Aquí irá el código de ejecución.
        Pero antes, cerraremos los ifs con el mensaje de error */
      } else {
        echo 'Las contraseñas ingresadas no coinciden.<br /><a href="history.back();return false;"<< Atrás</a>';
      }
    } else {
      echo 'Debes ingresar una contraseña.<br /><a href="history.back();return false;"<< Atrás</a>';
    }
  } else {
    echo 'Debes ingresar una dirección de correo electrónico.<br /><a href="history.back();return false;"<< Atrás</a>';
  }
} else {
  echo 'Debes ingresar un nombre de usuario.<br /><a href="history.back();return false;"<< Atrás</a>';
}
?>


Ahora pasamos al centro de los ifs, donde ha quedado el espacio para la ejecución. Simplemente habrá que ejecutar una sentencia sql y mostrar el mensaje de confirmación. Veamos:

Código: Seleccionar todo
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$r_user = htmlentities($_POST['r_user'], ENT_QUOTES);
$r_pass = htmlentities($_POST['r_pass'], ENT_QUOTES);
$r_pass_c = htmlentities($_POST['r_pass_c'], ENT_QUOTES);
$r_mail = htmlentities($_POST['r_mail'], ENT_QUOTES);

// Comprobamos que se haya escrito un nombre de usuario
if($r_user != "") {
  // Ahora comprobamos lo mismo para el mail
  if($r_mail != "") {
    // Para la contraseña... {
    if($r_pass != "") {
      // Bien, ahora comprobaremos que las 2 contraseñas escritas sean iguales:
      if($r_pass === $r_pass_c) {
        // Todo comprobado.
        // Ejecutamos la sentencia
        mysql_query("INSERT INTO jugadores(nick, contra, correo) VALUES('{$r_user}','{$r_pass}','{$r_mail}')");
        // Ahora mostramos la confirmación:
        echo 'Te has registrado con éxito. Ahora puedes iniciar sesión con tu usuario y contraseña';
      } else {
        echo 'Las contraseñas ingresadas no coinciden.<br /><a href="history.back();return false;"<< Atrás</a>';
      }
    } else {
      echo 'Debes ingresar una contraseña.<br /><a href="history.back();return false;"<< Atrás</a>';
    }
  } else {
    echo 'Debes ingresar una dirección de correo electrónico.<br /><a href="history.back();return false;"<< Atrás</a>';
  }
} else {
  echo 'Debes ingresar un nombre de usuario.<br /><a href="history.back();return false;"<< Atrás</a>';
}
?>


Y así es como hemos logrado un sistema simple de usuarios. Claro que se pueden agregar muchas más comprobaciones avanzadas, como comprobar la sintaxis del mail (Que contenga @ y punto, etc), que el usuario/contraseña sea de más de 3 caracteres, que el usuario no exista antes, envío de correo de activación de cuenta y demás. Pero eso será para otro día :P

Ahora viene la parte más interesante. Iniciar sesión y proteger páginas...
Inicio de sesión
Comenzaremos creando un formulario más simple que el de registro, usuario y contraseña. Que envíe los datos a login.php.

Código: Seleccionar todo
<form method="post" action="login.php">
  Usuario:<br />
  <input type="text" name="l_user" /><br />
  Contraseña:<br />
  <input type="password" name="l_pass" /><br />
  <br />
  <input type="submit" value="Iniciar sesión" />
</form>


Fácil, ¿No? Bien, ahora el archivo login.php:

Código: Seleccionar todo
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$l_user = htmlentities($_POST['l_user'], ENT_QUOTES);
$l_pass = htmlentities($_POST['l_pass'], ENT_QUOTES);
// Ahora creamos una sentencia sql en busca del usuario ingresado:
$select = mysql_query("SELECT * FROM jugadores WHERE nick='{$l_user}'");
// Ahora comprobamos que el usuario exista.
if(mysql_num_rows($select) != 0) {
  // Bien, ahora que sabemos que existe, creamos un bucle para obtener los datos...
  while($row = mysql_fetch_array($select)) {
    /* Ahora con los datos obtenidos, comprobamos que la contraseña sea correcta. */
    if($l_pass) {
      // En caso de que esté correcto, establecemos la sesión como iniciada. Para ello, usamos cookies.
      setcookie('session', md5($row['user'] . $row['pass']), time()+3600);
      // También creamos una cookie con la id del usuario...
      setcookie('session_id', $row['id'], time()+3600);
      // El contenido de la cookie es usuario+contraseña encriptados, y durará una hora.
      // Ahora cerramos los ifs, con sus respectivos mensajes opuestos.
    } else {
      echo 'Usuario encontrado, pero la contraseña es incorrecta.<br /><a href="history.back();return false;"<< Atrás</a>';
    }
    // La siguiente llave cierra el bucle while, no necesita else.
  }
} else {
  echo 'El usuario no existe.<br /><a href="history.back();return false;"<< Atrás</a>';
}
?>


Ya tenemos nuestro login. ¿Qué más? Listo, esto está terminado...
No molesten...
Dije que no...
Ok, hagamos el logout para completar esto.

Cerrar sesión
Para cerrar la sesión, simplemente nos aseguramos de que las cookies que hemos insertado hayan caducado. Para esto, las "sobrescribimos" y modificamos su fecha límite a una fecha pasada. Bastará con un enlace al archivo logout.php para esto.
logout.php:

Código: Seleccionar todo
<?php
// Comprobamos que haya alguna sesión iniciada.
if($_COOKIE['session']) {
  // Ahora sobreescribimos las cookies.
  setcookie('session', 'dada', time()-3600);
  setcookie('session_id', 'dada', time()-3600);
  // Mensaje de confirmación.
  echo 'Sesión cerrada exitosamente.';
}?>


El contenido de las cookies modificada no importa, pues se eliminarán instantáneamente.

Bien... Ahora terminamos esto al fin con la función para proteger páginas. La siguiente función php debe ser incluida por las páginas protegidas.

Código: Seleccionar todo
<?php
function isonline() {
  // Comprobamos que existan las cookies..
  if($_COOKIE['session'] && $_COOKIE['session_id']) {
    // Transformamos las cookies en entidades html para evitar inyecciones sql
    $session = htmlentities($_COOKIE['session'], ENT_QUOTES);
    $session_id = htmlentities($_COOKIE['session_id'], ENT_QUOTES);
    // Armamos con la id guardada la sentencia sql para buscar el usuario.
    $find = mysql_query("SELECT * FROM jugadores WHERE id='{$session_id}'");
    // Comprobamos que el usuario exista.
    if($mysql_num_rows($find) != 0) {
      // Armamos el bucle para obtener la información del usuario..
      while($row = mysql_fetch_array($find)) {
        // Comprobamos que la cookie 'session' coincida con los datos guardados..
        if(md5($row['user'] . $row['pass']) == $_COOKIE['session']) {
          // Devolvemos true.
          return 1;
        }
      }
    }
  }
}
?>


Ok. Ahora, para proteger una página, debemos llamar la función dentro de una comprobación. Antes de mostrar el contenido oculto, escribimos esto:

Código: Seleccionar todo
<?php
if(isonline()) {
?>


Escribimos todo el contenido privado, y finalmente cerramos el if:


Código: Seleccionar todo
<?php
}
?>


También podemos agregar un else con un cartel que diga que es necesario iniciar sesión.

Eso es todo, amigos. No he probado nada del tutorial, lo he escrito así simplemente. Si encuentran algún error, agradecería que me lo dijeran
Que quede claro que esto es algo básico y quizá algo inseguro, pero es solamente para que se den una idea, mejorarlo queda en ustedes :P

Saludos. :roto2:
Volviendo a www.sa-mp.es ;)
Avatar de Usuario
elvago
   
   
 
Mensajes: 1499
Registrado: Dom Sep 28, 2008 6:38 pm
Ubicación: 127.0.0.1

Re: [Tutorial]Registro basico vía web

Notapor ncv » Jue Feb 18, 2010 4:19 am

Buen tutorial :D yo trabajo con Sesiones pero podria meterme a las cookies xD Buena seguridad...
GM LSDC: 55%
Web LSDC: 13%

LS DC:
Un nuevo GM que revolucionará la era SA:MP. ¿Os digo un par de palabras clave? Poderes, BattleGround, Gremios, Diversión!
Proximamente...
Avatar de Usuario
ncv
Full User
 
Mensajes: 45
Registrado: Mié Dic 16, 2009 1:11 pm


Volver a Recursos y tutoriales

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado