Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: BerinGer en 27 Mayo 2011, 18:35 pm



Título: Mejorar Seguridad de mi sistema
Publicado por: BerinGer en 27 Mayo 2011, 18:35 pm
Hola, estoy haciendo un codigo de seguridad para un sistema que estoy armando así que me gustaría que me ayuden a mejorarlo por eso lo subí a mi hosting y así lo pueden probar les pido por favor que me digan si encuentran un fallo o alguna manera de mejorar el código, ya que seria de gran ayuda para mi y me serviría para mejorar mis conocimiento en php que recién estoy empezando  :) , desde ya gracias.

http://maximilianogarro.com.ar/ (http://maximilianogarro.com.ar/)

El código en cuestión:
fns_login.php
Código
  1. //Reporte de error
  2.    function error($error){
  3.        setcookie("reporte",$error,time()+180,"/","");
  4.        header("Location: ../index.php");
  5.        exit;
  6.    }
  7. //Conectamos a la base de datos
  8.    function db_login(){
  9.            //Conectamos a la db
  10.            $host = '------';
  11.            $userdb = '------';
  12.            $passdb = '------';
  13.            $db = '------';              
  14.            $connect = @mysql_connect($host,$userdb,$passdb);
  15.            if($connect === false){
  16.                return false;
  17.                    error("Error: No se a podido conectar a la base de datos.");
  18.            }else{
  19.            //Si se conecto seleccionamos la db
  20.                $selectdb = @mysql_select_db($db,$connect);
  21.                if($selectdb === false){
  22.                    return false;
  23.                    die('Error: No se a podido conectar con la base de datos.');
  24.                }else{ return true; }
  25.            }
  26.  
  27.    }
  28.  
  29. //cifrar con contraseña
  30.    function cifrar($pass){
  31.        $passsafe = hash_hmac('sha1', $pass, '_?¿·¨^*ç"$"1@ª!"·¿?·¡523ç´MaXi´Ç¨ç{}');
  32.        return $passsafe;
  33.    }
  34.  
  35. //Verifica si esta logeado.
  36.    function firewall(){
  37.        //verificamos que existan las cookies
  38.        if ( isset($_COOKIE['sistema']) && isset($_COOKIE['sistema2']))
  39.        {
  40.            //Inicializamos VariablesS
  41.            $key = $_COOKIE['sistema'];
  42.            $userid = $_COOKIE['sistema2'];
  43.            //Conectamos ala db
  44.            $connect = db_login();
  45.            //Si la selecciono procedemos con la consulta
  46.            if ($connect === true){
  47.            $loginquery = sprintf("SELECT * FROM `usuarios_sess`,`usuarios_log` WHERE `usuarios_sess`.`fkusuario`= '%s' AND `usuarios_log`.`pkusuario_log` = `usuarios_sess`.`fkusuario_log`;", mysql_real_escape_string($userid));                          
  48.            $login = @mysql_query($loginquery);
  49.  
  50.                if (($login === false) || (mysql_num_rows($login) != 1)){
  51.                        error("Error: Intente nuevamente.");
  52.                }else{
  53.                    $usuariodb = mysql_fetch_array($login);
  54.                    $keydb = $usuariodb['KEY'];
  55.                    $ip = $usuariodb['ip'];
  56.                    //Comparamos Key e IP para evitar que nos roben la cookie :D
  57.                    if ($keydb != $key || $ip != $_SERVER['REMOTE_ADDR']) {
  58.                        error("Error: Debe logear para ver esta pagina.");
  59.                    }
  60.                }
  61.            mysql_close();
  62.            }
  63.        }else{
  64.            header("Location: index.php");
  65.        }
  66.    }
login.php
Código
  1.    //Iniciamos Session
  2.    session_start();    
  3.  
  4.    //Incluimos funciones
  5.    include_once('fns_login.php');
  6.    //Validamos que las variables del captcha existan
  7.    if (!isset($_POST['key']) || !isset($_SESSION['CAPTCHA'])){
  8.        error("Error: Intenta acceder a este sitio de una forma incorrecta.");
  9.    }else{
  10.        //Validamos que las varibles encriptadas sean iguales
  11.        if(md5($_POST['key']) != $_SESSION['CAPTCHA']){
  12.            error("Error: Nos has introducido el codigo correcto.");
  13.        }else{
  14.            //Destruismos variables captcha
  15.            unset($_SESSION['CAPTCHA']);
  16.            unset($_POST['key']);
  17.            session_destroy;
  18.  
  19.            //validamos variables
  20.            $user = $_POST['user'];
  21.            $pass = $_POST['pass'];
  22.  
  23.            //ciframos password con sha1 y contraseña
  24.            $passsafe = cifrar($pass);
  25.  
  26.            if (!isset($user) && (ereg("^[a-zA-Z0-9]$", $user)=== false) && (strlen($user)> 50)){
  27.                error("Error: Nombre de usuario invalido.");
  28.            }else{
  29.                if (!isset($pass) && (ereg("^[a-zA-Z0-9]$", $pass)=== false) && (strlen($pass)> 20)){  
  30.                    error("Error: Contraseña con caracteres invalidos.");
  31.                }else{      
  32.                            //Conectamos ala db
  33.                    $connect = db_login();
  34.                    //Si la selecciono procedemos con la consulta
  35.                    if ($connect === false){
  36.                        error("Error: No se pudo conectar con la base de datos.");
  37.                    }else{
  38.                        //Si la selecciono procedemos con la consulta
  39.                        $loginquery = sprintf("SELECT `pkusuario` FROM `usuarios` WHERE `usuario`='%s' AND `password`='%s'",
  40.                                                mysql_real_escape_string($user),
  41.                                                mysql_real_escape_string($passsafe)
  42.                                                );                          
  43.                        $login = @mysql_query($loginquery);
  44.  
  45.                        if (($login === false) || (mysql_num_rows($login) != 1)){
  46.                            error("Error: El usuario no existe.");
  47.                        }else{
  48.                            // Ya logio => obtenemos datos
  49.                            $usuariodb = mysql_fetch_array($login);
  50.                            $userid = $usuariodb['pkusuario'];
  51.                            $fecha = gmdate('Y-n-j H:i:s');
  52.                            $ip = $_SERVER['REMOTE_ADDR'];
  53.                            $localhost = gethostbyaddr($ip);
  54.                            $navegador = $_SERVER['HTTP_USER_AGENT'];
  55.  
  56.                            //ciframos un key unico de usuario
  57.                            $key = cifrar($ip.$fecha);
  58.  
  59.                            //almacenamos logs por seguridad y consulta futura
  60.                            $logs = "INSERT INTO `usuarios_log` (`pkusuario_log` ,`fkusuario` ,`ip` ,`localhost` ,`navegador` ,`login` ,`logout`)
  61.                                            VALUES ('null', '".$userid."', '".$ip."', '".$localhost."', '".$navegador."', '".$fecha."', '".$fecha."');";                                
  62.                            $almacenalogs = @mysql_query($logs);
  63.  
  64.                            $idlogs = mysql_insert_id();
  65.  
  66.                            //borramos si existia session
  67.                            @mysql_query("DELETE FROM `usuarios_sess` WHERE `fkusuario` = '".$userid."'");
  68.  
  69.                            //entonces alamacenamos los nuevos keys
  70.                            $keylogs = "INSERT INTO `usuarios_sess`(`KEY` ,`fkusuario` ,`fkusuario_log`)
  71.                                               VALUES ('".$key."', '".$userid."', '".$idlogs."');";
  72.  
  73.                            $almacenakeylogs = @mysql_query($keylogs);
  74.  
  75.                            if (($almacenalogs === false) && ($almacenakeylogs === false)){
  76.                                error("Error: No se puede iniciar existe un error al conectar.");
  77.                            }else{                                  
  78.                                setcookie("sistema", $key, time()+3600,"/","");
  79.                                setcookie("sistema2", $userid, time()+3600,"/","");
  80.                                header("Location: ../web_segura.php");
  81.                                mysql_close();
  82.                                die;
  83.                            }
  84.                        }
  85.                    }
  86.                }
  87.            }
  88.        }
  89.    }
  90.  
logout.php
Código
  1. include_once('fns_login.php');
  2.  
  3. if ( isset($_COOKIE['sistema']) && isset($_COOKIE['sistema2'])){
  4.  
  5.        $key = $_COOKIE['sistema'];
  6.        $userid = $_COOKIE['sistema2'];
  7.  
  8.        setcookie("sistema", $key, time()-3600,"/","");
  9.        setcookie("sistema2", $userid, time()-3600,"/","");
  10.  
  11.        $fecha = gmdate('Y-n-j H:i:s');
  12.        $connect = db_login();
  13.  
  14.        //Si se conecto a la db
  15.        if ($connect === true){                
  16.            $logoutquery = sprintf("UPDATE `usuarios_log` SET `logout` = '".$fecha."' WHERE `pkusuario_log` = (SELECT `fkusuario_log`
  17.                                    FROM `usuarios_sess` WHERE `fkusuario` = '%s' );" , mysql_real_escape_string($userid));                          
  18.            $logout = @mysql_query($logoutquery);
  19.  
  20.            $keysess = sprintf("DELETE FROM `usuarios_sess` WHERE `fkusuario` = '%s';", mysql_real_escape_string($userid));
  21.            $keyout = @mysql_query($keysess);      
  22.            mysql_close();
  23.        }
  24.        if (!isset($_COOKIE['sistema']) || $keyout === true){
  25.            setcookie("reporte","Deslogeado Correctamente.",time()+180,"/","");
  26.        }
  27.        header("Location: ../index.php");
  28.    }else{
  29.        header("Location: ../index.php");
  30.    }



Link de descarga del codigo:
http://www.4shared.com/file/_eUj3D8u/userlogin_by_beringer.html (http://www.4shared.com/file/_eUj3D8u/userlogin_by_beringer.html)