Regresar a la página www.ComoCrearTuWeb.com
Página 4 de 12 PrimerPrimer 12345678 ... ÚltimoÚltimo
Resultados 46 al 60 de 166

Tema: Registro de usuarios desde cero.

  1. #46
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    Oki! Creo que lo voy pillando.

    Gracias lantiga!

  2. #47
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    Vaya, aún tenemos bastantes fallos. Por ejemplo, alguien podría registrarse escribiendo espacios en blanco en el login, contraseña, email.... hay que inventar algo que verifique que los datos que se introducen en el formulario son consistentes, es decir, tienen sentido, que tienen toda la pinta de ser datos reales. Se nos podrían ocurrir cientos de posibilidades de datos falsos, pero escribir líneas de código para cada uno de esos casos promete ser algo terrible, verdad?

    Vamos a pensar un poco y a determinar algún modo de evitar ese tipo de datos en el formulario. Establezcamos primero qué normas han de cumplir cada uno de los datos solicitados, oki?

    - Nick: Podríamos decidir que solo se pudieran usar números y letras mayúsculas y minúsculas. Sin espacios en blanco ni carácteres extraños tales como acentos, barras, símbolos usados para las etiquetas de código como < y > (con esto además evitamos que nos metan códigos maliciosos mediante el formulario).

    - Email: Podría contener tan solo letras minúsculas y números, pero además ha de contener la arroba y terminar en un punto seguido de la extensión. Si no se cumple eso, seguro que no es un correo real, verdad?

    - Contraseña: En este caso podríamos admitir números y letras mayúsculas y minúsculas y, además, permitir algunos otros carácteres a los que suelo llamar raros. Colocando alguno de esos carácteres, disminuimos la posibilidad de que algún malvado la adivine (es múcho más segura la contraseña "se-cre-_to" que "secreto", de modo que en este caso admitiremos algunos carácteres "raros".

    Dejadme que lo piense un poco y os cuento cómo solucionar esta papeleta. Seguramente crearemos un archivo que se encargue de esto, de verificar la integridad de estos datos.

    Un abrazo!

  3. #48
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    [TUTORIAL :: SISTEMA DE REGISTRO DE USUARIOS :: PARTE 14]

    Parece que he conseguido algo. Con unas cuantas líneas de código ahora consigo eliminar cualquier carácter extraño del nick y de la contraseña. Si el usuario las introduce, las elimino y le muestro con que nick y password ha sido registrado.

    Para el email, uso una función que he encontrado por la red. Con ella nos aseguramos de que cumple con el formato normal de email, aunque por el momento no podemos saber si el correo está o no dado de alta. Posteriormente podemos hacer que el usuario tenga que responder a algún correo para validar su cuenta, por lo que en ese momento sabremos si el correo es totalmente válido, pero por ahora sabemos que el formato es correcto.

    El archivo registro.php queda por tanto de este modo:

    Código PHP:
    <?php

    //incluimos configuracion.php con los datos de conexión
    include_once('configuracion.php');

    function 
    limpia($cadena)
        {
        return (
    ereg_replace('[^A-Za-z0-9_-ñÑ]'''$cadena));
        }

    // definimos las variables
    $nick     limpia($_POST['nick'])     ;
    $email    $_POST['email']            ;
    $password limpia($_POST['password']) ;
    $password2limpia($_POST['password2']);

    // Si hay algún campo vacio abortamos y avisamos del error
    if ( empty($nick) OR empty($email) OR empty($password) OR empty($password2) )
    {
       
    header("Refresh: 5; URL=formulario.php");
       echo 
    "<p>ERROR. Los datos introducidos no tienen un formato correcto.</p>";
       die;
    }

    function 
    verificar_email($email
       {
       
    // Verificamos que no hay más de una arroba y que las longitudes son normales
       
    if (!ereg("^[^@]{1,64}@[^@]{1,255}$"$email)) 
          {
          return 
    false;
          }
       
    $email_array explode("@"$email);
       
    $local_array explode("."$email_array[0]);
       for (
    $i 0$i sizeof($local_array); $i++) 
          {
          if (!
    ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$"$local_array[$i])) 
             {
             return 
    false;
             }
          } 
       
    // se revisa si el dominio es una IP. Si no, debe ser un nombre de dominio válido
       
    if (!ereg("^\[?[0-9\.]+\]?$"$email_array[1])) 
          { 
          
    $domain_array explode("."$email_array[1]);
          if (
    sizeof($domain_array) < 2
             {
             return 
    false// No son suficientes partes para ser un dominio
             
    }
          for (
    $i 0$i sizeof($domain_array); $i++) 
             {
             if (!
    ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$"$domain_array[$i])) 
                {
                return 
    false;
                }
             }
          }
          return 
    true;
       }

       if ( 
    verificar_email($email)==false )
          {
          
    header("Refresh: 5; URL=formulario.php");
          echo 
    "<p>ERROR. El Email $email no parece ser real.</p>";
          die;
          }

    //Comprobamos que la password y password2 son iguales, sino, volvemos a registro.php
    if($password != $password2)
        {
        echo 
    'ERROR. Las passwords no coinciden';
        }
    else
        {
        
    //cuantos usuarios hay ya con ese nick?
        
    $cuantosnicks=mysql_query("SELECT nick FROM ".$tabla." WHERE nick='".$nick."' ");
        
    //cuantos usuarios hay ya con ese email?
        
    $cuantosemails=mysql_query("SELECT email FROM ".$tabla." WHERE email='".$email."' ");
        
    $nickrepetido mysql_num_rows($cuantosnicks);
        
    $emailrepetido mysql_num_rows($cuantosemails);
        if(
    $nickrepetido >= 1)
            {
            echo 
    'El nick propuesto ya estaba registrado. Escoge otro.';
            
    // damos la opcion de registrarse de nuevo
            
    echo '<br /><a href="formulario.php">Quieres intentarlo con otro nick?</a>'
            }
        else if(
    $emailrepetido >= 1)
            {
            echo 
    'El email propuesto ya estaba registrado. Escoge otro.';
            
    // damos la opcion de registrarse de nuevo
            
    echo '<br /><a href="formulario.php">Quieres intentarlo con otro email?</a>';
            }
        else
            {
            
    //introducimos el nuevo registro en la tabla users
            
    mysql_query("INSERT INTO $tabla (nick,password,email) values ('$nick','$password','$email') ");
            echo 
    "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p>";
            
    // damos la opcion de logerase
            
    echo '<br /><a href="login.php">Quieres logearte?</a>';
            }
        
    mysql_free_result($cuantosnicks);  //liberamos memoria
        
    mysql_free_result($cuantosemails); //liberamos memoria
       
    }
    ?>

  4. #49
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    Sigo atento a vuestros comentarios sobre el uso de las constantes. Seguro que si se pueden aprovechar en esta aplicación, le daremos buen uso.

    En cuanto a la posibilidad de logearse desde el movil.... no deshecho la idea, desde luego. Aunque habrá que ir pasito a pasito, je je je.

    Para la próxima, quiero añadir algunas líneas que envian algo así como testigos, para asegurarse de que los datos provienen del formulario y no de algún craker. Lo maduro un poco más y os lo muestro en la próxima parte. Ahora a la cama que ya es hora, je je je.

    Gracias a todos por colaborar!

  5. #50
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    28 jun, 08
    Mensajes
    499
    Poder de Reputación
    16
    Todo bien, solo un comentario, las funciones del tipo ereg() estan declaradas obsoletas apartir de PHP 5.3.0 y por lo tanto su uso no es recomendado amenos que trabajes con php 4, en su lugar se usaria preg_match().

  6. #51
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    Gracias Serverdns. Miraré cómo reemplazarlo. Lo intenté cambiando el comando sin más pero no funcionaba. Tendré que estudiar su sintaxis mejor. Tomo nota para actualizarlo, gracias!

  7. #52
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    [TUTORIAL :: SISTEMA DE REGISTRO DE USUARIOS :: PARTE 15]

    Vamos a aplicar un método sencillo al formulario para mejorar su seguridad. Con él, nos aseguraremos de que los datos enviados a la tabla provienen tan solo del formulario y no de cualquier otro lugar.

    Como sabréis, en el formulario podemos colocar campos ocultos a los que nosotros mismos le damos el valor que queramos. Ese campo y valor no lo ven los usuarios, pero es enviado junto con el resto de campos que sí rellena.

    La idea es añadir un campo oculto llamado por ejemplo, testigo, al que daremos el valor valido mediante esta línea:
    Código PHP:
    <input type="hidden" name="testigo" value="valido" /> 
    El archivo formulario quedará entonces así:

    Nombre del archivo: formulario.php

    Código PHP:
    <?php

    //incluimos configuracion.php con los datos de conexión
    include_once('configuracion.php');

    //Creamos el formulario de registro
    echo '
    <form action="registro.php" method="POST">
    Nick: <input type="text" name="nick" size="25" /><br />
    Contraseña: <input type="password" name="password" size="40" /><br />
    Repite la contraseña: <input type="password" name="password2" size="40" /><br />
    E-mail: <input type="text" name="email" size="60" /><br />
    <input type="hidden" name="testigo" value="valido" />
    <input type="submit" name="submit" value="Registrar" />
    </form>
    '
    ;

    // Damos la opción de volver a la página de login si no desea registrarse
    echo '<br /><a href="login.php">Login</a>'

    ?>
    Seguido de esto, añadimos una condición en el archivo registro.php con la que abortaremos el proceso si el valor de testigo no es igual a valido. Por ejemplo, colocando la línea if ( ($_POST['testigo]) != "valido") {$error = true;} al principio del archivo. Con ella, si testigo no tiene el valor valido, damos a la variable $error el valor true, que provoca que se aborte el proceso en el siguiente if que hay pocas líneas más abajo.

    Nombre del archivo: registro.php

    Código PHP:
    <?php

    //incluimos configuracion.php con los datos de conexión
    include_once('configuracion.php');

    if ( (
    $_POST['testigo]) != "valido") {$error = true;}

    function limpia($cadena)
        {
        return (ereg_replace('
    [^A-Za-z0-9_-ñÑ]', '', $cadena));
        }

    // definimos las variables
    $nick     = limpia($_POST['
    nick'])     ;
    $email    = $_POST['
    email']            ;
    $password = limpia($_POST['
    password']) ;
    $password2= limpia($_POST['
    password2']);
    // marcamos el error
    if ( empty($nick) OR empty($email) OR empty($password) OR empty($password2) ) {$error = true;}
    // si eliminando caráteres raros queda algún campo vacio, generamos un error y devolvemos al formulario
    if ( !empty($error) )
    {
       header("Refresh: 2; URL=formulario.php");
       echo "<p>ERROR. Los datos introducidos no tienen un formato correcto.</p>";
       die;
    }

    function verificar_email($email) 
       {
       // Verificamos que no hay más de una arroba y que las longitudes son normales
       if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) 
          {
          return false;
          }
       $email_array = explode("@", $email);
       $local_array = explode(".", $email_array[0]);
       for ($i = 0; $i < sizeof($local_array); $i++) 
          {
          if (!ereg("^(([A-Za-z0-9!#$%&'
    *+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$"$local_array[$i])) 
             {
             return 
    false;
             }
          } 
       
    // se revisa si el dominio es una IP. Si no, debe ser un nombre de dominio válido
       
    if (!ereg("^\[?[0-9\.]+\]?$"$email_array[1])) 
          { 
          
    $domain_array explode("."$email_array[1]);
          if (
    sizeof($domain_array) < 2
             {
             return 
    false// No son suficientes partes para ser un dominio
             
    }
          for (
    $i 0$i sizeof($domain_array); $i++) 
             {
             if (!
    ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$"$domain_array[$i])) 
                {
                return 
    false;
                }
             }
          }
          return 
    true;
       }

       if ( 
    verificar_email($email)==false )
          {
          
    header("Refresh: 5; URL=formulario.php");
          echo 
    "<p>ERROR. El Email $email no parece ser real.</p>";
          die;
          }

    //Comprobamos que la password y password2 son iguales, sino, volvemos a registro.php
    if($password != $password2)
        {
        echo 
    'ERROR. Las passwords no coinciden';
        }
    else
        {
        
    //cuantos usuarios hay ya con ese nick?
        
    $cuantosnicks=mysql_query("SELECT nick FROM ".$tabla." WHERE nick='".$nick."' ");
        
    //cuantos usuarios hay ya con ese email?
        
    $cuantosemails=mysql_query("SELECT email FROM ".$tabla." WHERE email='".$email."' ");
        
    $nickrepetido mysql_num_rows($cuantosnicks);
        
    $emailrepetido mysql_num_rows($cuantosemails);
        if(
    $nickrepetido >= 1)
            {
            echo 
    'El nick propuesto ya estaba registrado. Escoge otro.';
            
    // damos la opcion de registrarse de nuevo
            
    echo '<br /><a href="formulario.php">Quieres intentarlo con otro nick?</a>'
            }
        else if(
    $emailrepetido >= 1)
            {
            echo 
    'El email propuesto ya estaba registrado. Escoge otro.';
            
    // damos la opcion de registrarse de nuevo
            
    echo '<br /><a href="formulario.php">Quieres intentarlo con otro email?</a>';
            }
        else
            {
            
    //introducimos el nuevo registro en la tabla users
            
    mysql_query("INSERT INTO $tabla (nick,password,email) values ('$nick','$password','$email') ");
            echo 
    "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p>";
            
    // damos la opcion de logerase
            
    echo '<br /><a href="login.php">Quieres logearte?</a>';
            }
        
    mysql_free_result($cuantosnicks);  //liberamos memoria
        
    mysql_free_result($cuantosemails); //liberamos memoria
       
    }
    ?>
    Qué os parece?

  8. #53
    Esto empieza a ser un vicio... Habitante Avatar de lantiga
    Fecha de Ingreso
    23 feb, 11
    Mensajes
    905
    Poder de Reputación
    14
    Jorge creo que tendrias que poner un limite de caracteres en los campos del formulario por seguridad pues te pueden pasar un script ejecutable e incluso robarte la web.
    Suscribete a Los videotutoriales de Lantiga y podre hacer vídeos más largos y con mejor calidad.

  9. #54
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    Ok, gracias lantiga, se me pasó por alto. Añadiré un maxlength="XX" en los campos del formulario.

    Gracias una vez más!

  10. #55
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    [TUTORIAL :: SISTEMA DE REGISTRO DE USUARIOS :: PARTE 16]

    Gracias al aporte de Lantiga, vamos a limitar la cantidad de carácteres que admiten los campos del formulario. Con eso limitamos la cantidad de código malicioso que un craker pueda inyectarnos y por tanto, limitamos el poder malicioso del ataque, pues no podrá hacer tantas cosas con un número tan limitado de carácteres.

    Para ello basta con colocar un maxlength en cada campo, igual al número máximo de carácteres que le hemos definido anteriormente.

    Quedaría así por tanto el archivo formulario.php.

    Código PHP:
    <?php

    //incluimos configuracion.php con los datos de conexión
    include_once('configuracion.php');

    //Creamos el formulario de registro
    echo '
    <form action="registro.php" method="POST">
    Nick: <input type="text" name="nick" maxlength="25" size="25" /><br />
    Contraseña: <input type="password" name="password" maxlength="40" size="40" /><br />
    Repite la contraseña: <input type="password" name="password2" maxlength="40" size="40" /><br />
    E-mail: <input type="text" name="email" maxlength="60" size="60" /><br />
    <input type="hidden" name="testigo" value="valido" />
    <input type="submit" name="submit" value="Registrar" />
    </form>
    '
    ;

    // Damos la opción de volver a la página de login si no desea registrarse
    echo '<br /><a href="login.php">Login</a>'

    ?>

  11. #56
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    [TUTORIAL :: SISTEMA DE REGISTRO DE USUARIOS :: PARTE 17]

    Nos toca ahora mejorar la seguridad de las contraseñas. Parece que es de locos guardar las contraseñas en la tabla tal cuál. Se hace imprescindible encriptarlas de algún modo. Existen varios métodos para ello. Yo he leido sobre HASH y SALT por ahora y se me ocurre aplicar ambas a la vez. Quizás sea exagerar, pero por el momento es lo que se me ocurre mientras alguno de vosotros no me proponga algo mejor :=)

    Mediante el HASH, convertimos la contraseña propuesta por el usuario en una cadena de 64 carácteres mediante un algoritmo que transforma la entrada en una cadena única, es decir, siempre que se aplica ese algoritmo a esa contraseña, se obtiene la misma ristra final. El algoritmo se llama Sha256 y se aplica simplemente de este modo:

    Código PHP:
    $hasheada hash('sha256'$password); 
    El segundo método que os comentaba, el SALT, minimiza la posibilidad de que por fuerza bruta (brute force) puedan descifrar la contraseña a la que habíamos aplicado el HASH. El SALT es una cadena de carácteres aleatoria que se añade al resultado de aplicar el HASH. Esto lo podemos hacer mediante esta función:

    Código PHP:
    function saltear ()
    {
    $cadena md5 (uniqid(rand(), true));
    return 
    substr($cadena03);

    que definiremos en el archivo registro.php. Además de definirla, claro, hay que utilizarla, no? Definimos en ese mismo archivo una variable que guarde la contraseña salteada, es decir, con el salt aplicado. Posteriomente, aplicamos el hash a esa variable y guardamos el resultado en la variable $hasheada. Terminado esto, en lugar de guardar en la tabla la variable $password, guardaremos la variable $hasheada y la variable $salteada.

    Fíjate que tenemos que añadir un campo más en la tabla de la base de datos, llamado salteada para guardar el valor de la variable $salteada. Para ello basta con acceder a la lengüeta llamada SQL del PhpMyAdmin e introducir estas líneas en el recuadro:

    Código:
    ALTER TABLE `usuarios` ADD `salteada` VARCHAR( 3 ) NOT NULL
    Además, tenemos que modificar las características del campo password pues ahora va a guardar un valor con más carácteres que los 40 que habíamos indicado al principio. Para ello, en esa misma ventana de SQL ejecutamos esta otra línea:

    Código:
    ALTER TABLE `usuarios` CHANGE `password` `password` VARCHAR( 64 ) NOT NULL
    En el campo password de la tabla no guardaremos la contraseña tal cuál la introdujo el usuario, sino su valor "hasheado", con lo que realmente no estamos guardando el valor propio de la contraseña que es lo que queríamos evitar. Por eso, en el archivo registro.php tendremos que modificar la línea que envía los datos a la tabla y, añadir un par de líneas antes de esa, en la que definimos el valor de las variables $salteada y $hasheada antes de meterlas en la tabla:

    Código PHP:
    $hasheadahash('sha256'$password) ;
    $salteada saltear();
    $hasheada hash('sha256'$salteada $hasheada);
    mysql_query("INSERT INTO $tabla (nick,password,salteada,email) values ('$nick','$hasheada','$salteada','$email') "); 
    Por último, cuando un usuario ya registrado pretenda logearse tendremos que cambiar el modo de verificar su contraseña, pues ya no podemos pretender que la que introduzca en el formulario de login sea igual a la guardada en la tabla, pues ha sido hasheada y salteada, verdad? Modificamos entonces el modo de verificar esos valores, la contraseña que indica el usuario registrado y la guardada en la tabla.

    Para empezar cazamos los datos provenientes del formulario de login en el archivo chequeo.php. Si no existen las variables password o salteada para el nick dado, será que no existe ese usuario, claro, de modo que se muestra una advertencia al visitante y en 4 segundos se le reenvia de nuevo a la página de login.

    Si existen esos valores, le hacemos un hash mediante el algoritmo sha256 a una cadena formada por la concatenación del salt que había en la tabla, seguido de un hash hecho a la contraseña indicada por el usuario mediante el algoritmo sha256. De este modo, obtenemos los valores de las variables $hash, procedente de los datos dados por el usuario al intentar logearse, y de la variable $datosdeusuario[password] que es la contraseña encriptada que hay guardada en la tabla para ese nick. Si todo es correcto, deberían coincidir, no? En ese caso le abrimos sesión al usuario monstrándole un mensaje. Si no coinciden, se lo indicamos y lo mandamos al archivo login.php por si quiere intentarlo de nuevo.

    Todo este rollo dicho en código es lo que sigue...

    Nombre del archivo: chequeo.php

    Código PHP:
    . . . . . . . . 
    // Chequeamos que el usuario existe y que la contraseña es correcta
    $nick$_POST['nick']; // cazamos el valor de nick del formulario
    $password $_POST['password']; // cazamos el valor de la contraseña del formulario
    //sacamos los valores correspondientes a ese nick de las variables $password (que está hasheada) y $salteada
    $consultamysql_query("SELECT * FROM ".$tabla." WHERE nick='".$nick."' ");
    if(
    mysql_num_rows($consulta) < 1//si no existe el usuario...
    {
       
    header("Refresh: 4; URL=login.php");
       echo 
    "<p>ERROR. El nick dado no existe.</p>";
       die;
    }
    $datosdelusuariomysql_fetch_array($consultaMYSQL_ASSOC);
    $hash hash('sha256'$datosdelusuario['salteada'] . hash('sha256'$password) );  //aplicamos el algoritmo a la contraseña dada por el usuario en el login para poder compararla con la que tenemos guardada
    if($hash != $datosdelusuario['password']) //si la contraseña es incorrecta...
    {
       
    header("Refresh: 4; URL=login.php");
       echo 
    "<br /><p>ERROR. La contraseña no es válida.</p>";
       die;
    }
    // login correcto, continuamos... 
    . . . . . . . . . 
    Aún no he probado, os aviso cuando lo haga. Es mucho cambio y quizás haya metido la pata en algo, je je je. Mientras podemos comentar, claro.

  12. #57
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    [TUTORIAL :: SISTEMA DE REGISTRO DE USUARIOS :: PARTE 18]

    El contenido de los archivos modificados en la parte 17 quedarían de este modo:

    Nombre del archivo: registro.php

    Código PHP:
    <?php

    include_once('configuracion.php');

    if ( (
    $_POST['testigo']) != "valido") {$error true;}

    function 
    limpia($cadena)
        {
        return (
    ereg_replace('[^A-Za-z0-9_-ñÑ]'''$cadena));
        }

    function 
    saltear ()
    {
    $cadena md5 (uniqid(rand(), true));
    return 
    substr($cadena03);
    }

    // definimos las variables
    $nick     limpia($_POST['nick'])     ;
    $email    $_POST['email']            ;
    $password limpia($_POST['password']) ;
    $password2limpia($_POST['password2']);

    // marcamos el error
    if ( empty($nick) OR empty($email) OR empty($password) OR empty($password2) ) {$error true;}
    // si eliminando caráteres raros queda algún campo vacio, generamos un error y devolvemos al formulario
    if ( !empty($error) )
    {
       
    header("Refresh: 2; URL=formulario.php");
       echo 
    "<p>ERROR. Los datos introducidos no tienen un formato correcto.</p>";
       die;
    }

    function 
    check_email_address($email
    {
        
    // Primero, checamos que solo haya un símbolo @, y que los largos sean correctos
      
    if (!ereg("^[^@]{1,64}@[^@]{1,255}$"$email)) 
        {
            
    // correo inválido por número incorrecto de caracteres en una parte, o número incorrecto de símbolos @
        
    return false;
      }
      
    // se divide en partes para hacerlo más sencillo
      
    $email_array explode("@"$email);
      
    $local_array explode("."$email_array[0]);
      for (
    $i 0$i sizeof($local_array); $i++) 
        {
        if (!
    ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$"$local_array[$i])) 
            {
          return 
    false;
        }
      } 
      
    // se revisa si el dominio es una IP. Si no, debe ser un nombre de dominio válido
        
    if (!ereg("^\[?[0-9\.]+\]?$"$email_array[1])) 
        { 
         
    $domain_array explode("."$email_array[1]);
         if (
    sizeof($domain_array) < 2
             {
            return 
    false// No son suficientes partes o secciones para se un dominio
         
    }
         for (
    $i 0$i sizeof($domain_array); $i++) 
             {
            if (!
    ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$"$domain_array[$i])) 
                    {
               return 
    false;
            }
         }
      }
      return 
    true;
    }

    if ( 
    check_email_address($email)==false )
    {
       
    header("Refresh: 5; URL=formulario.php");
       echo 
    "<p>ERROR. El Email $email no parece ser real.</p>";
       die;
    }

    //Comprobamos que la password y password2 son iguales, sino, volvemos a registro.php
    if($password != $password2)
        {
        echo 
    'ERROR. Las passwords no coinciden';
        }
    else
        {
        
    //cuantos usuarios hay ya con ese nick?
        
    $cuantosnicks=mysql_query("SELECT nick FROM ".$tabla." WHERE nick='".$nick."' ");
        
    //cuantos usuarios hay ya con ese email?
        
    $cuantosemails=mysql_query("SELECT email FROM ".$tabla." WHERE email='".$email."' ");
        
    $nickrepetido mysql_num_rows($cuantosnicks);
        
    $emailrepetido mysql_num_rows($cuantosemails);
        if(
    $nickrepetido >= 1)
            {
            echo 
    'El nick propuesto ya estaba registrado. Escoge otro.';
            
    // damos la opcion de registrarse de nuevo
            
    echo '<br /><a href="formulario.php">Quieres intentarlo con otro nick?</a>'
            }
        else if(
    $emailrepetido >= 1)
            {
            echo 
    'El email propuesto ya estaba registrado. Escoge otro.';
            
    // damos la opcion de registrarse de nuevo
            
    echo '<br /><a href="formulario.php">Quieres intentarlo con otro email?</a>';
            }
        else
            {
            
    //introducimos el nuevo registro en la tabla users
            
    $hasheadahash('sha256'$password) ;
            
    $salteada saltear();
            
    $hasheada hash('sha256'$salteada $hasheada);
            
    mysql_query("INSERT INTO ".$tabla." (nick,password,salteada,email) values ('$nick','$hasheada','$salteada','$email') ");  
            echo 
    "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p>";
            
    // damos la opcion de logerase
            
    echo '<br /><a href="login.php">Quieres logearte?</a>';
            }
        
    mysql_free_result($cuantosnicks);  //liberamos memoria
        
    mysql_free_result($cuantosemails); //liberamos memoria
       
    }
    ?>


    Nombre del archivo: chequeo.php

    Código PHP:
    <?php

    include_once('configuracion.php');

    // Chequeamos que el usuario existe y que la contraseña es correcta
    $nick$_POST['nick']; // cazamos el valor de nick del formulario
    $password $_POST['password']; // cazamos el valor de la contraseña del formulario
    //sacamos los valores correspondientes a ese nick de las variables $password (que está hasheada) y $salteada
    $consultamysql_query("SELECT * FROM ".$tabla." WHERE nick='".$nick."' ");
    if(
    mysql_num_rows($consulta) < 1//si no existe el usuario...
    {
       
    header("Refresh: 4; URL=login.php");
       echo 
    "<p>ERROR. El nick dado no existe.</p>";
       die;
    }
    $datosdelusuariomysql_fetch_array($consultaMYSQL_ASSOC);
    $hash hash('sha256'$datosdelusuario['salteada'] . hash('sha256'$password) );  //aplicamos el algoritmo a la contraseña dada por el usuario en el login para poder compararla con la que tenemos guardada
    if($hash != $datosdelusuario['password']) //si la contraseña es incorrecta...
    {
       
    header("Refresh: 4; URL=login.php");
       echo 
    "<br /><p>ERROR. La contraseña no es válida.</p>";
       die;
    }
    // login correcto, continuamos... 

    session_register("usuario"); //registramos la variable usuario que contendrá el nick del user
    session_register("idusuario"); //registramos la variable idusuario que contendrá la id del user
    $_SESSION[usuario] = $datosdelusuario["nick"]; //damos el nick a la variable usuario
    $_SESSION[idusuario] = $datosdelusuario["id"]; //damos la id del user a la variable idusuario
    header("Refresh: 4; URL=login.php");
    echo 
    '<br /><p>Logeado compañero'.$_SESSION[usuario].'</p>';

    ?>

  13. #58
    Esto empieza a ser un vicio... Habitante Avatar de Doodleo
    Fecha de Ingreso
    25 abr, 11
    Ubicación
    Galicia (España)
    Mensajes
    1,329
    Poder de Reputación
    17
    Jorgens, qué te parece usar md5 en vez de hash?

    Código PHP:
    $password $_POST[password];
    $password strip_tags($password);
    $password md5($password); 
    Yo siempre uso ese código en los formularios con contraseña

  14. #59
    Esto empieza a ser un vicio... Habitante Avatar de lantiga
    Fecha de Ingreso
    23 feb, 11
    Mensajes
    905
    Poder de Reputación
    14
    Interesante aporte sobre encriptación en php; Quizás sea interesante ampliar la info:

    Como bien dice Jorge la seguridad es importante tanto que en php podemos utilizar las funciones criptográficas hash (basadas en algoritmos de la familia SHA-2 http://es.wikipedia.org/wiki/Secure_Hash_Algorithm ); pero siempre es bueno saber lo que estos algoritmos son fiables por eso es mejor leer esto:

    http://es.php.net/manual/es/faq.pass...words.fasthash

    antes de dar por hecho que nuestro codigo no nos dará problemas.
    Última edición por lantiga; 16/11/2011 a las 16:51
    Suscribete a Los videotutoriales de Lantiga y podre hacer vídeos más largos y con mejor calidad.

  15. #60
    Administrador CCTW Webmaster de CCTWHabitante Avatar de Jorgens_CCTW
    Fecha de Ingreso
    30 ene, 11
    Ubicación
    Cartagena, Murcia, España.
    Mensajes
    1,188
    Poder de Reputación
    10
    Doodleo, uso como ves MD5, pero solo para obtener el SALT, de tres carácteres.


    Olvidad el texto de acá abajo, pues el problema lo he solucionado y he corregido ya el código de las partes correspondientes.

    Mientras leo eso, solo comentar que no me funciona aún. Demasiado código para no liarse un poco, je je je.
    En el archivo chequeo.php comparo si son iguales o no la variable
    $hash = hash('sha256', $datosdelusuario['salteada'] . hash('sha256', $password) );
    (la que indica el usuario que se quiere logear)
    y la variable
    $hash != $datosdelusuario['password']
    (la que guarda la tabla).
    Seguramente no hago bien la transformación y no coinciden los valores. Seguiré mirando dónde está el error y leeré lo que me comentais. Cualquier ayuda para arreglar este fallo será bienvenida!
    Gracias!

Temas Similares

  1. Empezando desde cero
    Por May en el foro Foro General
    Respuestas: 3
    Último Mensaje: 28/08/2011, 17:17
  2. Iniciando desde Cero
    Por Are$ en el foro Foro General
    Respuestas: 7
    Último Mensaje: 06/01/2011, 06:45
  3. Crear un foro desde cero
    Por Abel_Melero en el foro Foros
    Respuestas: 1
    Último Mensaje: 16/12/2009, 23:01

Etiquetas para este Tema

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •