Login de usuario seguro en PHP

Después de leer un post en forosdelweb y de ver muchas veces que webs son “hackeadas” o “manipuladas” por el sistema de login de las webs, me propongo hacer un tutorial y explicación de como hacer un login seguro.

Primero, tenemos una tabla en nuestra base de datos llamada “usuarios” y contiene estos campos (id, usuario, password (codificada en md5) ). Ahora cuando se envía un formulario debemos obtener los datos y comprobar si existe, recordar que antes ya tiene que estar realizada la conexión con la base de datos.

[cc lang=”php”]

$usuario = mysql_real_escape_string($_POST[‘u’]);
$password = mysql_real_escape_string($_POST[‘p’]);

$consulta = mysql_query(“SELECT * FROM usuarios WHERE usuario='{$usuario}'”);
$row=mysql_fetch_array($consulta);

if(is_numeric($row[‘id’]) AND $row[‘id’]>0) {
$passactual=md5($row[‘password’]);
$passenviada=md5(md5($password));
if($passactual==$passenviada) {
$_SESSION[‘usuario’] = $row[‘id’].”_”.$row[‘password’];
}
}[/cc]

de esta forma, si los valores enviados en el formulario (usuario es u y la contraseña es p) son correctos, creara la sesión (deberás tener al inicio del documento, session_start();). Lo que hace el código es comprobar si existe el usuario en la base de datos (si row no existe, no sera numérico ni mayor que 0) y luego si las contraseñas son iguales (las pongo en md5 de nuevo, para evitar inyecciones etc).

En la sesión meto id_password, aun que yo suelo meter id_hash y en el hash codifico en md5 el password+correo+ip para así evitar robos de cookies etc. Ahora a comprobar es exactamente lo mismo.

[cc lang=”php”]
$login = false;
if(isset($_SESSION[‘usuario’]) AND !empty($_SESSION[‘usuario’])) {
$d = explode(“_”, $_SESSION[‘usuario’]);
$id = intval($d[0]);
if($id>0) {
$consulta = mysql_query(“SELECT * FROM usuarios WHERE id='{$id}'”);
$row=mysql_fetch_arrray($consulta);
$passactual=md5($row[‘password’]);
$passenviada=md5($d[1]);
if($passactual==$passenviada) {
$login=true;
}
}
}[/cc]

y a través de la variable $login sabremos si esta logueado o no.

11 Comments
  • Jul 3,2012 at 20:35

    Muy buen aporte, esto me sera muy necesario para cuando desea pasar mi blog de wp.com a wp.org. Por el momento lo guardare en mi barra de marcadores para cuando necesite esta útil información.

    PD: Suerte con este blog y el experimento de los 10 dolares xD.

  • Abr 29,2012 at 19:44

    […] […]

  • Nex
    Abr 19,2012 at 18:33

    Cuidado que en el primer código pone “mysql_fetch_aRRRay” xD

  • Abr 18,2012 at 1:20

    Hola, buen aporte…
    Es posible adaptar el codigo a prestashop
    saludos

    • wsoulrc
      Abr 18,2012 at 12:14

      si, claro, si conoces la codificación de las password es bastante fácil

  • iRe
    Abr 16,2012 at 19:17

    ¿Para cuando la entrada de hoy? ^^

  • Abr 13,2012 at 9:06

    Buen aporte Wsoul,

    Yo suelo enviar a la base de datos los 2 parametros (id y passwd), de forma y manera que sea la bd quien haga la comprobación.

    Luego, si hay registros, pues ok, si no, pues no.

    Saludos.

    • wsoulrc
      Abr 13,2012 at 10:47

      y si te infectan código malicioso?

  • Abr 12,2012 at 23:12

    Esto siempre ha sido uno de mis temas pendientes, ya que el que siempre he intentado (tomando los datos del foro) siempre me ha fallado por alguna parte T.T

    • wsoulrc
      Abr 12,2012 at 23:34

      creo que ahora no tendras dudas o si ?

  • Abr 12,2012 at 19:35

    Se ve bueno, estoy aprendiendo php gracias a un amigo(que me ayuda a inciar por que nunca se me dio bien php xD) y bueno, espero que me sirva en un futuro.
    Gracias!

Leave a Comment