Comunidad de diseño web y desarrollo en internet online

Maneja segura de iniciar sesión

Citar            
MensajeEscrito el 20 May 2015 04:39 pm
Buenas a todos, soy nuevo acá y la verdad quiero quedarme mucho más tiempo.. Bueno, yendo al grano:

Estoy haciendo un panel administrativo y del usuario también para un servidor de un juego el cual estoy haciendo, el punto es que ¿cual sería la manera correcta de iniciar sesión segura? ¿como debería programarla? siempre programé básicamente, seleccionando nombre y password del usuario, enviando los $_POST con addlashes para evitar al inyección. Pero en verdad no sé cual sería la manera segura de hacer un login

Por Juance

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 20 May 2015 06:15 pm
Primero tendrías que definir qué es "manera segura" de hacer un login. Es la preservación de las credenciales?, fortaleza de las contraseñas?, mantener la misma sesión para el mismo cliente?, evitar un ataque tipo "man-in-the-middle"?. No está claro qué quieres decir con "manera segura".

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 20 May 2015 08:19 pm
Primero quiero aclarar que es "manera" y no "maneja" jajaja. Por otra parte, primero que nada evitar las inyecciones SQL, eso lo hago con mysqli_real_escape_string y uso addlashes para los campos de texto en el que el usuario enviaría cierto tipo de información mediante un input. Seguridad básica, ya que no será un sitio de gran gama, sino algo pequeño. También quería saber si de la forma en la que yo hago el inicio de sesión es correcta o existe una mejor.

Dejo el código:

Código PHP :

if(isset($_POST['username'])) {

   $username = mysqli_real_escape_string($mysqli, $_POST['username']);
   $password = hash("sha1",mysqli_real_escape_string($mysqli, $_POST['password']));

   //Realizar consulta
   $query = "SELECT Username, Password FROM accounts WHERE Username = '".$username."' AND Password = '".$password."' LIMIT 1" or die("Error:" .mysqli_error($mysqli));

   //Ejecutamos la consulta
   $result = $mysqli->query($query);

   if($result->num_rows == 1) {
      //Usuario y contraseña son correctos
      header("Location: ../index.php");
      $_SESSION['username'] = $username;
   } else {
      header("Location: ..index.php?err=1");
   }

   mysqli_free_result($query);
} else {
   header("Location: ..login.php");
}

Por Juance

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 May 2015 12:39 pm
Si lo que haz hecho funciona tal como esperas, entonces está correcto. No hay formas incorrectas de escribir un programa, simplemente o hace lo que tiene que hacer o no lo hace.

Ahora bien, respecto a la seguridad en el tratamiento de las variables que participan en la sentencia SQL, no es suficiente con usar real_escape_string. Todavía se puede hacer un exploit simplemente floodeando la petición POST.

El campo 'username' y 'password' así como cualquier otro campo de la tabla SQL tiene un tamaño fijo. Debes asegurarte que el dato en las variables de trabajo no excedan ese tamaño:

Código PHP :

$username = substr($_POST['username'],0,32); // Suponiendo un ancho de 32 caracteres

Aún así, cada campo tiene un significado semántico dentro del programa. En este caso el nombre de usuario no puede ser cualquier rastra de caracteres, así que es buena idea validar que contiene solo los caracteres permitidos:

Código PHP :

// Adminitmos letras en ambos caps, números, el guión, el guión bajo y el punto, al menos un caracter de ancho.
if (preg_match("/^[A-Za-z0-9_\-\.]+$/i", $username) !== 1) {
   echo '<p>Nombre de usuario no válido.</p>';
   return;
}

La contraseña tendrá su propia validación con expresiones regulares.

Y así con cualquier variable que luego participe en una sentencia SQL.

Saludos.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 21 May 2015 10:17 pm
Primero agradecerte por tu respuesta y por tomarte la molestia de darme algunos consejos que me serviran mucho. Ahora, no entendí los de los caracteres, si o si en cada campo tengo que hacer un máximo de caracteres? 32 creo que sería suficiente.

Con respecto al flood en los campos, podría hacer que al intentar 5 veces y fallar todas (en el inicio de sesión) bloquear la cuenta de alguna manera y enviar información al email de esa cuenta generando un link para reestablecer la misma.

¿Cómo podría hacer eso? ¿es posible?

Gracias.

Por Juance

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 May 2015 11:47 pm
Por cada Intento guardas un dato en la base de datos.

- Si son intentos fallidos, consultas la base de datos y le sumas 1 a la cantidad de intentos
- Si llego al maximo de intentos ya lo bloqueas o envias el email

- Si el intento es correcto, consultas a la base de datos y regresas a 0 la cantidad de intentos.

Para enviar un correo, puedes intentar con este tutorial.




http://www.youtube.com/watch?v=GfSATRCRoSE

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

chrome
Citar            
MensajeEscrito el 22 May 2015 02:59 am
Les agradezco muchísimo los aportes, me sirven muchísimo. Pero como haría para bloquearla en caso de que llegue a los 5 fallidos? , tenia pensado bloquear la ip, pero no, en verdad no tengo idea.

Edit: Tenía pensado hacer una variable en la base de datos (block) la cual si está activada no lo deje ingresar aún si los datos son correctos ¿o que otra forma me sugieren? muchas gracias por el apoyo!!

Por Juance

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 May 2015 01:27 pm
Si optas por bloquear por reintentos, antes de leer si las credenciales son correctas, lee si está bloqueado. Además debes guardar el momento en que se bloqueó la cuenta, así le podrás decir al usuario cuándo ocurrió el intento fallido.

Aunque con "flood" me refería a intentar meter un dato gigante en un campo pequeño... Cuando has creado la tabla de la base de datos debiste darle un ancho a los campos, a ese tamaño me refería.

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.