Registro de usuarios desde cero.

No sé, sería un poco recordar dos contraseñas no?

No sería más fácil sólo permitir loguearse X veces durante X tiempo?
Si, la verdad es que es lo mismo que duplicar el tamaño de la contraseña y parece menos molesro....ok, no he dicho nada ;=)
Jeje, pero la idea es original :-)

Podemos buscar para que si falla por ejemplo 5 veces no pueda intentarlo hasta dentro de 15 minutos, como pasa en los foros VB
Buena idea también Doodleo. Lo apunto en la lista de mejoras por aplicar que he puesto en el mensaje inicial, oki? Ah! y si sabes ya hacerlo, no dudes en empezar a contarnos! je je je
lantiga escribió:No sabia que estuvieras haciéndote un CMS ; pero supongo que lo harás en XML por su facilidad en el traspaso de datos;
Hey no tengo ni idea de la relación del XML con el CMS. De XML solo se hacer los sitemaps, disculpa mi palurdísmo! Me iluminas un poco? O bueno, mejor me veo tus videotutos! je je je.

lantiga escribió:En cuanto al login usuarios por que no haces una doble petición en un archivo html? por un lado una petición ajax para que al pulsar un botón te enseñe el formulario y por otro lado la peticion al servidor para que los datos se almacenen en la base de datos creo que es lo más logico. Haber si lego tengo tiempo y te pongo un ejemplo sencillo de como hacerlo
Sería de agradecer ese ejemplo simple. Tengo decidido aplicarle AJAX, o cualquier otra cosa que le de un poco de dinamismo y evite la recarga de la página al formulario de registro y logeo.

lantiga escribió:solo una pregunta tonta has trasteado algo con Json? He visto que es más recomendable cuando hay que pasarle muchos datos a una solicitud ajax, te ahorras mucho peso en los archivos y sobrecargas menos el navegador .
En principio no son muchos los datos a pasar, creo. Pero no, no he trasteado mucho con el Json. Al menos, no he sido consciente (aunque sin saberlo, fijo que lo he trasteado). Me lo anoto para leer sobre su uso.
Bien si en cuanto a seguridad contra fuerza bruta se refiere les aconsejo usar DES O RC4(creo que mejor esta con contraseñas) , rc4 es un metodo de encryptacion indesencryptable contra fuerza bruta, si se usa caracteres especiales en la contraseña se tardaria alrededor de miles de años en desencriptarla varias computadoras trabajando , porque no solo encrypta la contraseña si no que para encriptar algo debes ingresar una contraseña aparte, el md5 es muy vulnerable, con un G-PU ojo con esto el G-pu seria el reemplazo al CPU porque combina la potencia del cpu con la tarjeta de video y se le denomina G-PU , no todas las tarjetas de video pueden generar el gpu , son solo algunas como Nvidia gforce 7000+ o ati 5800 hd+ y con un cpu de doble nucleo , podria desencriptar por fuerza bruta un md5 en tan solo 20 minutos (si se incluye caracteres especiales,numeros y mayusculas) en caso contrario le toma 1 minuto xD, y para rc4 le toma un par de miles de años xD (si no se sabe cifrar tambien es muy inseguro) , si es necesario mas seguridad les recomiendo AES :
http://es.wikipedia.org/wiki/Advanced_Encryption_Standard

Es uno de los mas seguros hay muchos metodos, hasta se le pueden pasar varios, por ejemplo TRIPLE DES > RC4 > AES y para desencriptar empezar con AES > RC4 > TRIPLE DES = sistema seguro! xD

En cuanto a Ajax yo podria ayudar tiene tiempo que no lo practico pero se muy bien sobre eso .

Saludos!
Bueno Jorge como ya habia pensado en echarte un cable con lo de el login ya he empezado con los video pero los cojo desde html dom acceso a a nodos de arbol; ayer colge la primera parte que basicamente es como manipular los objetos o nodos hijos de un form; desde javascript es una pequeña intro a como establecer o devolver el valor de los atributos. Te lo paso aquí ok; luego a la tarde haré otro:

http://www.youtube.com/watch?v=V_ZLHMO_rRQ
Otra pequeña gran duda.

Es posible que nos estemos enparanollando con esto de la encriptación? he leido que el algoritmo MD5 no es ya tan seguro. He leido que combinar el hash (con sha256) y el salt (para el salt usé md5) es mucho mejor. Pero ahora me decís que si crypt(), que si RC4...... me va a merecer la pena investigar tanto? O nos estamos pasando?

A ver si estamos colocando una puerta blindada en una casa con ventanas de plástico! je je je. Lo digo por tanta protección a las contraseñas de los usuarios registrados, en un hosting con un cpanel que a saber qué tipo de encriptación tiene.... empiezo a pensar que no es tan robusto como los que proponeis con esos modos de encriptación. O me equivoco?

qué tipo de seguridad aplica un foro phpBB o un vBulletin, por ejemplo?

No es que deje de interesarme, es solo por aprovechar el tiempo mejor. Si es tan necesario adelante, pero no sea que nos estamos pasando. Me iluminais?
Pues como lo dices, vbulletin entonces ya no seria tan seguro en cuando a las encriptaciones de contraseña, pero no hay que tener en cuenta solo eso , es decir evitar inyecciones sql, es lo que hace vbulletin cerrar agujeros de seguridad, pero si es casualidad de que penetren toda esta seguridad y lleguen a las hashes entonces las podran desencriptar en poco tiempo, en fin es mejor reforzar todos los puntos posibles xD
Lantiga , se nota que tienes un nivel avanzado de lo comun , muy bien ese tema del DOM y el uso con ajax. muy importante en muchas ocasiones y en eso del dinamismo(lo digo por experiencia)

Saludos!
vale tienes razón solo en parte; lo cierto es que se le ha dado mucho bombo a esta de la seguridad pero bueno eso siempre es bueno para el tema de atraer nuevos foreros. Pero el tema de la seguridad importa; en cuanto a el método bueno siempre es bueno no caer en la redes de los malintencionados de turno por eso es bueno saber como hacerles dificil el puteara la peña; en cuanto a los foros phpbb y a vBulletin tienes que pensar que van actualizando su seguridad según van viendo cosas raras pues tienes gente que esta pendiente de estas cosas; en cuanto al tipo de encriptación lo que se busca es que el acceso a tu servidor sea lo menos accesible por eso en parte cuando haces un formulario optas por post y no get o usas un atributo enctype que por defecto ya te codifica de manera sencilla los diferentes caracteres antes de enviarlos al servidor, lo que pasa muchas veces es que con esta manera de enviar datos no siempre tiene la seguridad apropiada con lo cual el deber de un buen programador y más si se quiere autogestionar su web es fortalecerla lo máximo posible.

en cuanto al tema de lo servidores y más si son de pago el tema de seguridad entra centro del precio obviamente. con lo cual si hay alguna historia por un hacker a entrado en un servidor normalmente la empresa de hosting suele tener copias de seguridad por si acceden a uno de sus servidor pues normalmente tiene varios con lo cual de cara al cliente osea tu los daños son minimos dado que una vez se detecta el fallo o el acceso del hacker se cierra o se pone en curenta el servidor en cuentión.

Es por ello que normalmente la gente cuando empieza a programa opta por hosting de pago o gratuitos y por la opción de gestionar una web desde su propio ordenador mediante paquetes o programas de tipo XAMP;LAMP o WAMP.

Espero que te haya ayudado la parrafada.
@SurKaiser mercy es solo la primera parte de esta tercera parte del DOM luego subiré la segunda parte para hablar de las Jquery haber si tengo tiempo luego y creo que para mañana lo podreis ver y de paso critrcarme; tengo pensado darle algo de bola a este tuto y ampliar un poco la explicación y abarcar conocimientos varios en este ejemplo de form y hacer un tuto copilatorio que sirve de referencia para que luego salga una aplicación más o menos estable.
Bien , espero el tuto y por ahi complemento lo que falte en caso de faltar,

PD: (Hoy en dia veo a un cctw mas avanzado que hace algunos años creo que ya era hora , aunque solo sean unos pocos xD).
Bueno, he estado investigando pero no consigo sacar mucho en claro. Así que, para no despistarme voy a intentar continuar con el Sistema de Registro de Usuarios dejando la encriptación de la contraseña como indiqué. Es que no le saco punta a lo que leo, sorry.

Si alguien sabe y se anima, le invito a que retoque lo que corresponda y nos lo indique acá. Me refiero a si encuentra un modo más seguro de encriptar la contraseña. Si lo encuentra y nos lo pasa ya hecho, y si es más seguro que lo que tenemos, lo acoplamos y listo, seguimos para adelante con esa mejora.

Lo mismo para cualquier otra cosa de este sistema de registro de usuarios, claro, cualquier mejora es bienvenida.

Bueno, ahora que casi estaba listo y funcionando, voy a ver cómo lo mejoro. Si no se me olvida nada pendiente, pasaré a estudiar cómo aplicarle Ajax para evitar la recarga de la página en cada uno de los pasos. Seguramente aplique Ajax a través de jQuery, que lo acabo de conocer y me parece un invento genial. Además, prometen que funciona en todo tipo de navegadores.... amos a verlo....

Me pongo en ello!!!
Estoy pensando en ir cortando algunos trozos de código de algunos archivos del ejemplo que llevamos hasta el momento, y pegarlos en archivos aparte, para luego añadirlos al documento principal con un include. Creo que de este modo veremos los archivos más claritos y por otro lado, nos permite actualizar o mejorar esos archivos aislados, sin perdernos demasiado.

Por ejemplo. En uno de los archivos tengo una buena ristra de líneas para validar las direcciones de correo que ponga el usuario en el formulario. Si corto todas esas líneas y las pego en un nuevo documento llamado por ejemplo validar_email.php, puedo añadir ese contenido en el documento que lo contenia con un simple include. Así no solo veo el código más clarito, sino que si alguna vez quiero mejorar la validación de emails, me basta con trabajar sobre el archivo validar_email.php, o si a alguien del foro se le ocurre una mejora, puede pegarnos acá el contenido de ese archivo solamente, sin necesidad de copiar todo.

Es algo así como programar por módulos. Os parece bien? Seguro que sí.

Un abrazo, sigo al lio!
De modo que.... par verlo como ejemplo, recorto el código del archivo registro.php correspondiente a la validación de emails, y lo pego en este archivo:

Nombre del archivo: verificar_email.php

<?php

// incluida en registro.php

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;
   }

;?>

Y en el archivo registro.php, en lugar de ese código, coloco esta lína:

Estracto del archivo registro.php:

..................
.....................
if ( !empty($error) )
{
   header("Refresh: 2; URL=formulario.php");
   echo "<p>ERROR. Los datos introducidos no tienen un formato correcto.</p>";
   die;
}

include_once('verificar_email.php');

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

//Comprobamos que la password y password2 son iguales, sino, volvemos a registro.php
..........................
.........................

Si te fijas, en el archivo verificar_email.php, je añadido un comentario indicando qué otros archivos usan ese código, no sea que un día se me olvide y me interese saber quiénes lo usan.
Antes de meterme con el ajax... a ver si consigo añadir un cambio. Quiero que antes de proceder al registro del usuario en la tabla de la base de datos, la página envíe un correo de confirmación al usuario, al correo que dió, con un código de confirmación y que si hace clic en el enlace del mensaje, se registre finalmente al usuario.

Esto está muy bien, pues nos quitamos usuarios que no aportan su correo verdadero, normalmente spammers.

Lo conseguiré? En teoría se lo suficiente como para hacerlo, creo.... a ver....

Acepto consejos!!! je je je
La idea inicial para programar esto es, antes de incluir los datos en la tabla, es decir, una vez verificado que todo es correcto, enviar el correo. Cuando el correo llegue al destinatario, leerá un mensaje con un link. Al pulsarlo visitará una página, un archivo nuevo que tendremos que hacer que leerá el código que irá en la url del enlace. Si es igual al que se le envió procede a la inserción de los datos en la tabla y por tanto se ejecuta el registro. En caso contrario se deniega.

Convendra eliminar el código una vez visita esa página, para evitar que se registre dos veces o que un cracker haga algún intento reiterado.

El código será un número aleatorio, claro.

Sigo!
Yo encontré este código por Google, lo pego tal cual está:

[COLOR=#0000BB][FONT=monospace]
<?php 
$usuario [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$_POST[/FONT][/COLOR][COLOR=#007700][FONT=monospace][[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]'usuario'[/FONT][/COLOR][COLOR=#007700][FONT=monospace]]; 
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$correo [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$_POST[/FONT][/COLOR][COLOR=#007700][FONT=monospace][[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]'correo'[/FONT][/COLOR][COLOR=#007700][FONT=monospace]]; 
[/FONT][/COLOR][COLOR=#FF8000][FONT=monospace]//... 

//<-- Tus rutinas para validar los datos, si están completos etc... 

[/FONT][/COLOR][COLOR=#007700][FONT=monospace]if(empty([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$usuario[/FONT][/COLOR][COLOR=#007700][FONT=monospace])){ 
    echo [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Debes poner algo como usuario"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 
    exit; 
} 

[/FONT][/COLOR][COLOR=#FF8000][FONT=monospace]//--> 

[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$aleatorio [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]uniqid[/FONT][/COLOR][COLOR=#007700][FONT=monospace](); [/FONT][/COLOR][COLOR=#FF8000][FONT=monospace]//Genera un id único para identificar la cuenta a traves del correo. 
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$contrasena [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]rand[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1999[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]9999[/FONT][/COLOR][COLOR=#007700][FONT=monospace]); [/FONT][/COLOR][COLOR=#FF8000][FONT=monospace]//Devuelve un número aleatorio entre los dos rangos. Lo usuaremos como 
                                //Contraseña temporal. 
                                 
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$sql [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Insert Into tabla (usuario, contrasena, correo, codigo, activo) Values ('$usuario', '$contrasena', '$correo', '$aleatorio', 0)"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 

[/FONT][/COLOR][COLOR=#FF8000][FONT=monospace]//Tus rutinas para insertar en la base de datos. 

[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$mensaje [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Registro en tuweb.com\n\n"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$mensaje [/FONT][/COLOR][COLOR=#007700][FONT=monospace].= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Estos son tus datos de registro:\n"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$mensaje [/FONT][/COLOR][COLOR=#007700][FONT=monospace].= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Usuario: $usuario.\n"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$mensaje [/FONT][/COLOR][COLOR=#007700][FONT=monospace].= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Contraseña: $contrasena.\n\n"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$mensaje [/FONT][/COLOR][COLOR=#007700][FONT=monospace].= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Debes activar tu cuenta pulsando este enlace: http://www.tuweb.com/activacion.php?id=$aleatorio"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 

[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$asunto [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Activación de tu cuenta en tuweb.com"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 

if([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]mail[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$correo[/FONT][/COLOR][COLOR=#007700][FONT=monospace],[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$asunto[/FONT][/COLOR][COLOR=#007700][FONT=monospace],[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$mensaje[/FONT][/COLOR][COLOR=#007700][FONT=monospace])){ 
    echo [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Se ha enviado un mensaje a tu correo electronico con el código de activación"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 
}else{ 
    echo [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Ha ocurrido un error y no se puede enviar el correo"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; 
} 

[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]?>
[/FONT][/COLOR]
Bien bien, no había pensado en ese nuevo campo "Activo" para almacenar los datos antes del correo y darle permisos de entrada cuando haga clic en el mensaje (pasando a ser activo en lugar de inactivo). Buena idea.

Creo que puedo hacerlo. Allá voy!
Empezamos creando ese nuevo campo. Se llamará estado y podrá tener los valores activo o inactivo.

Para añadir ese campo a la tabla nos vamos a la ventana de SQL del phpMyAdmin y ejecutamos esta línea:

ALTER TABLE`usuarios` ADD `estado` ENUM( 'activo', 'inactivo' ) NOT NULL AFTER `salteada`


Esa línea añade el campo 'estado' a la tabla 'usuarios' después del campo existente llamado 'salteada'. Es de tipo no nulo (es obligatorio que tenga un valor) y admite solamente los valores 'activo' e 'inactivo'.