Foros del Web » Programando para Internet » PHP »

ayuda a hacer mas seguro mi login

Estas en el tema de ayuda a hacer mas seguro mi login en el foro de PHP en Foros del Web. HOla amores, disculpen comunmente mi login sirve de maravilla (bueno a mi parecer), pero me tope que me dicen que es muy sencillo he inseguro, ...
  #1 (permalink)  
Antiguo 10/11/2010, 20:08
Avatar de ylellan  
Fecha de Ingreso: mayo-2010
Ubicación: en un lugar de Veracruz
Mensajes: 432
Antigüedad: 14 años, 5 meses
Puntos: 36
Pregunta ayuda a hacer mas seguro mi login

HOla amores, disculpen comunmente mi login sirve de maravilla (bueno a mi parecer), pero me tope que me dicen que es muy sencillo he inseguro, quiero hacerlo un poco mas seguro porque me dijeron le falta algunas cosas de seguridad, espero me puedan auxiliar en esto:

index.php
Código HTML:
Ver original
  1. <?php
  2. session_start();
  3. ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. <title>Documento sin t&iacute;tulo</title>
  8. .msj
  9. {
  10.     font:Arial, Helvetica, sans-serif;
  11.     color:red;
  12.     font-weight:bold;
  13.     background:#FFFF00;
  14. }
  15. </head>
  16.  
  17. <form action="procesar_pas.php" method="post">
  18. <?php if(isset($_GET['mensaje'])){ echo '<div class="msj">'.$_GET['mensaje'].'</div>'; } ?>
  19. <table width="304" border="1" align="center">
  20. <?php
  21. if(isset($_GET['pai'])){?><tr><td colspan="3"><span style="font-size:12px; color:red;"><?php echo $_GET['pai'];?></span></td></tr><?php } ?>
  22.   <tr>
  23.     <td width="98">NOMBRE:</td>
  24.     <td width="190"><input name="nombre" type="text" id="nombre" value="<?php if(isset($_GET['usuario'])){echo $_GET['usuario'];}if(!empty($_SESSION['usuario'])){echo $_SESSION['usuario'];}?>" /><?php echo '<span style=" color:red;">'.$_GET['user'].'</span>'?></td>
  25.   </tr>
  26.   <tr>
  27.     <td>PASSOWORD</td>
  28.     <td><input name="pass" type="password" id="pass" value="<?php if(isset($_GET['password'])){ echo $_GET['password'];}?>"/><?php echo '<span style=" color:red;">'.$_GET['pas'].'</span>'?></td>
  29.   </tr>
  30.   <tr>
  31.     <td>
  32.       <input name="enviar" type="submit" id="enviar" value="ENTRAR" />    </td>
  33.     <td><input name="cancel" type="reset" id="cancel" value="CANCELAR" /></td>
  34.   </tr>
  35. </form>
  36. </body>
  37. </html>

procesar_pas.php
Código PHP:
<?php
session_start
();
include 
"conexion.php";
if(isset(
$_POST['enviar'])){
if(!empty(
$_POST['nombre']) && !empty($_POST['pass'])){
    
$nombre=$_POST['nombre'];
    
$pass=md5($_POST['pass']);
    
conectar();
    
$b=mysql_query("select *from usuarios where usuario='$nombre'") or die ("error".mysql_error());
    
$existe=mysql_num_rows($b);
    
$c=mysql_fetch_array($b);
    
desconectar();
    if(
$existe>0){
    
$_SESSION['usuario']=$nombre;
    if(
$pass==$c['password'] && !empty($pass)){
    
$_SESSION['admitio']="si";
    
header("location:frame.php");
    exit();
    }else{
    
header("location:index.php?pai=EL PASSWORD ESTA MAL");
    exit();
    }
    }
    else{
    
header("location:index.php?pai=NO EXISTE USUARIO");
    exit();
    }
}
else{
//si no hay valores en los inputs
if(empty($_POST['nombre'])){
$user="*FALTA NOMBRE";
}
if(empty(
$_POST['pass'])){
$pas="*FALTA PASSWORD";
}
header("location:index.php?mensaje=LLENAR TODOS LOS DATOS&user=".$user."&pas=".$pas."&usuario=".$_POST['nombre']."&password=".$_POST['pass']);
exit();
}
}
?>
conexion.php
Código PHP:
<?php 
function conectar()
{
    
mysql_connect("localhost","user","*****");
    
mysql_select_db("login");
}
function 
desconectar()
{
    
mysql_close();
}
?>
espero me den alguna idea
  #2 (permalink)  
Antiguo 11/11/2010, 06:23
 
Fecha de Ingreso: abril-2008
Mensajes: 435
Antigüedad: 16 años, 6 meses
Puntos: 10
Respuesta: ayuda a hacer mas seguro mi login

ylellan,
si como te dicen es muy inseguro ya que usas todas las variables que recibe por GET y por POST sin pasarles ningun filtro y eso puede causar que te inyecten codigo.

te recomendaria mirar sobre las funciones mysql_real_escape_string, strip_tags, htmlentities para empezar.

en el foro encontraras muchisima informacion ya que es un tema tratado con regularidad

saludos
  #3 (permalink)  
Antiguo 11/11/2010, 07:25
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: ayuda a hacer mas seguro mi login

Yo hasta el dia de hoy me estoy fiando de mysql_real_escape_string y strip_tags. Pero hay un par de cosas mas que se pueden hacer y yo las dejo por pendientes...
  #4 (permalink)  
Antiguo 11/11/2010, 08:10
Avatar de ylellan  
Fecha de Ingreso: mayo-2010
Ubicación: en un lugar de Veracruz
Mensajes: 432
Antigüedad: 14 años, 5 meses
Puntos: 36
Respuesta: ayuda a hacer mas seguro mi login

gracias mis amores investigare sobre esas funciones.
  #5 (permalink)  
Antiguo 11/11/2010, 16:52
Avatar de ylellan  
Fecha de Ingreso: mayo-2010
Ubicación: en un lugar de Veracruz
Mensajes: 432
Antigüedad: 14 años, 5 meses
Puntos: 36
Respuesta: ayuda a hacer mas seguro mi login

haber mis amores, que tal esto, ahora sera mas seguro o puedo hacer algo mas:

Código PHP:
<?php
session_start
();
include 
"conexion.php";
if(isset(
$_POST['enviar'])){
if(!empty(
$_POST['nombre']) && !empty($_POST['pass'])){
conectar();
    
$nombre=strip_tags(mysql_real_escape_string($_POST['nombre']));
    
$pass=md5(strip_tags(mysql_real_escape_string($_POST['pass'])));
    
    
$b=mysql_query("select *from usuarios where usuario='$nombre'") or die ("error".mysql_error());
    
$existe=mysql_num_rows($b);
    
$c=mysql_fetch_array($b);
    
desconectar();
    if(
$existe>0){
    
$_SESSION['usuario']=$nombre;
    if(
$pass==$c['password'] && !empty($pass)){
    
$_SESSION['admitio']="si";
    
header("location:frame.php");
    exit();
    }else{
    
header("location:index.php?pai=EL PASSWORD ESTA MAL");
    exit();
    }
    }
    else{
    
header("location:index.php?pai=NO EXISTE USUARIO");
    exit();
    }
}
else{
//si no hay valores en los inputs
if(empty($_POST['nombre'])){
$user="*FALTA NOMBRE";
}
if(empty(
$_POST['pass'])){
$pas="*FALTA PASSWORD";
}
header("location:index.php?mensaje=LLENAR TODOS LOS DATOS&user=".$user."&pas=".$pas."&usuario=".$_POST['nombre']."&password=".$_POST['pass']);
exit();
}
}
?>
  #6 (permalink)  
Antiguo 11/11/2010, 18:58
Avatar de dcreate  
Fecha de Ingreso: octubre-2009
Ubicación: Veracruz
Mensajes: 536
Antigüedad: 15 años, 1 mes
Puntos: 22
Respuesta: ayuda a hacer mas seguro mi login

oye ylellan hasta lo puedes dejar de aporte, porque siempre buscan una forma de login y el tuyo se ve interesante
__________________
Somos lo que pensamos, como pensamos vivimos.
  #7 (permalink)  
Antiguo 11/11/2010, 20:42
Avatar de ylellan  
Fecha de Ingreso: mayo-2010
Ubicación: en un lugar de Veracruz
Mensajes: 432
Antigüedad: 14 años, 5 meses
Puntos: 36
Respuesta: ayuda a hacer mas seguro mi login

alguien que me pueda contestar que mas puedo meterle, mi codigo hasta el momento ahi esta
  #8 (permalink)  
Antiguo 13/11/2010, 18:45
Avatar de ylellan  
Fecha de Ingreso: mayo-2010
Ubicación: en un lugar de Veracruz
Mensajes: 432
Antigüedad: 14 años, 5 meses
Puntos: 36
Respuesta: ayuda a hacer mas seguro mi login

como ya nadie me pone alguna cosa es me quiere decir q ya es seguro
  #9 (permalink)  
Antiguo 13/11/2010, 18:53
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: ayuda a hacer mas seguro mi login

pudieras tambien meterle algo de expreciones regulares para validar que el usuario que tienes solo contenga el formato que tienes yo use un poco en este tema donde preguntaba algo parecido a lo que tu preguntas
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #10 (permalink)  
Antiguo 14/11/2010, 15:10
Avatar de ylellan  
Fecha de Ingreso: mayo-2010
Ubicación: en un lugar de Veracruz
Mensajes: 432
Antigüedad: 14 años, 5 meses
Puntos: 36
Respuesta: ayuda a hacer mas seguro mi login

hay gracias mi amores, como quiero hacer bien segura mi login para sacarme un 10 en la escuela, muchas gracias
  #11 (permalink)  
Antiguo 14/11/2010, 15:19
 
Fecha de Ingreso: noviembre-2010
Ubicación: /home/RD/Villa_Altagracia
Mensajes: 18
Antigüedad: 14 años
Puntos: 4
Respuesta: ayuda a hacer mas seguro mi login

podrias agregarle otro campo a la base de datos, en el cual pudieras ver si el usurio esta activo o no en la base de datos aca te dejo un ejemplo.

aca el formulario
Código HTML:
Ver original
  1. <p>
  2.  
  3.                     <cite><q><?php if(isset($error)){ echo '            <p>' . $error . '</p>' . "\n";}?></q></cite>
  4.  
  5.         <form method="post" action="webmaster-login.html" id="frmcontact">
  6.  
  7.             <input type="hidden" name="_submit_check" value="1"/>
  8.  
  9.             <div>
  10.  
  11.                 <label for="txtname">Username:</label> <input type="text" name="username" class="textboxcontact" id="username" />
  12.  
  13.                 <br />
  14.  
  15.                 <label for="txtemail">Password:</label> <input name="password" type="password" class="textboxcontact" id="password" size="40" />
  16.  
  17.                 <br />
  18.  
  19.                 <br />
  20.  
  21.                 <label></label><input type="submit" name="submitcontact" value="Entrar" class="submitcontact" />
  22.  
  23.             </div>
  24.  
  25.         </form>
  26.  
  27.                         </p>

aqui el archivo para procesar el formulario

Código PHP:
$db = new PDO('mysql:host=' $servidor ';dbname=' $bd$usuario$contrasenia);

function 
processLogin($db)
{
        
$consulta $db->prepare('SELECT * FROM admin WHERE username="'.$_POST["username"].'" AND password="'.md5($_POST['password']).'" AND active="1"');
        
$consulta->execute();
        
        foreach(
$consulta as $item)
        {

            if(
$consulta->rowCount()==1){
                if(
$item['active']==1)
                    {
                        
session_start();
                        
$_SESSION['user_id'] = $item['id'];
                        
$_SESSION['level_id'] = $item['level'];
                        
$_SESSION['logged_in'] = TRUE;
                        
header ("Location: webmaster-cpanel.html");
                    }
            }else{
            
//aca estarian los errores
            
}
        }




aca la funcion que tienes k poner para revisar que el usuario esta logeado o no


Código PHP:
function checkLogin($db,$levels)
{
    if(!
$_SESSION['logged_in'])
        {
            
$access FALSE;
        }
        else {
                
$consulta $db->prepare('SELECT level FROM admin WHERE id="'.$_SESSION['user_id'].'"');
                
$consulta->execute();
                
                
$access FALSE;
                
                foreach(
$consulta as $item)
                    {
                        if(
$item['level']==1)
                        {
                            
$access TRUE;
                        }
                    }

        }
        
        if(
$access==FALSE)
        {
            
header("Location: webmaster-entrar.html");
        }

y aqui seria para salir, logout

Código PHP:
function webmasterOut()
{
    
session_start();
    if ( 
$_SESSION['logged_in'] == TRUE )
    {        
        
session_destroy();
    }
    
header "Location: webmaster-entrar.html" );


Última edición por acidlake; 14/11/2010 a las 15:22 Razón: cambio de codigo
  #12 (permalink)  
Antiguo 14/11/2010, 15:23
 
Fecha de Ingreso: noviembre-2010
Ubicación: /home/RD/Villa_Altagracia
Mensajes: 18
Antigüedad: 14 años
Puntos: 4
Respuesta: ayuda a hacer mas seguro mi login

Cita:
Iniciado por acidlake Ver Mensaje
podrias agregarle otro campo a la base de datos, en el cual pudieras ver si el usurio esta activo o no en la base de datos aca te dejo un ejemplo.
Nota: me falto ponerle los filtros a los POST y a los GET
  #13 (permalink)  
Antiguo 14/11/2010, 17:41
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 21 años, 1 mes
Puntos: 4
Respuesta: ayuda a hacer mas seguro mi login

@ylellan: veo que tu codigo crea una variable de sesion incluso si el password es incorrecto, no le resta seguridad mientras no te bases en esa variable para validar una sesion pero te aconsejaria que lo dejaras fuera, igualmente creo que no es recomendable confirmarle al usuario que determinado usuario existe. Si quieres más seguridad aun, puedes evitar ataques de brute force limitando el numero de intentos de loggeo.

Simplifique un poco el codigo y me quedo así:
Código PHP:
session_start(); 
include 
"conexion.php"

if(isset(
$_POST['enviar'])){ 
    if(!empty(
$_POST['nombre']) && !empty($_POST['pass'])){ 
        
conectar(); 

        
$nombre=strip_tags(mysql_real_escape_string($_POST['nombre'])); 
        
$pass=md5(strip_tags(mysql_real_escape_string($_POST['pass']))); 
     
        
$b=mysql_query("select *from usuarios where usuario='$nombre' AND password='$pass'") or die ("error".mysql_error()); 

        if(
mysql_num_rows($b)){ 

            
$c=mysql_fetch_array($b); 
            
desconectar(); 
            
$_SESSION['usuario']=$nombre
            
$_SESSION['admitio']="si"
            
header("location:frame.php"); 
        }else{
            
header("location:index.php?pai=NO EXISTE USUARIO");
        } 
}else{ 
    
//si no hay valores en los inputs 
    
if(empty($_POST['nombre'])) $user="*FALTA NOMBRE"
    if(empty(
$_POST['pass'])) $pas="*FALTA PASSWORD"
    
header("location:index.php?mensaje=LLENAR TODOS LOS DATOS&user=".$user."&pas=".$pas."&usuario=".$_POST['nombre']."&password=".$_POST['pass']); 

  #14 (permalink)  
Antiguo 17/11/2010, 12:04
Avatar de ylellan  
Fecha de Ingreso: mayo-2010
Ubicación: en un lugar de Veracruz
Mensajes: 432
Antigüedad: 14 años, 5 meses
Puntos: 36
Respuesta: ayuda a hacer mas seguro mi login

oks, gracias, lo checo, mas tarde les regalo karma porq ahorita toy algo ocupada. besos
  #15 (permalink)  
Antiguo 17/11/2010, 12:12
 
Fecha de Ingreso: octubre-2010
Mensajes: 69
Antigüedad: 14 años
Puntos: 1
Respuesta: ayuda a hacer mas seguro mi login

Te falta regenerate_session_id y crear tokens que cambien cada vez que chequees para evitar estos ataques:

-Session fixation
-Session hijacking
-Session poisoning (injection).

Te recomiendo un buen libro: SECURING PHP WEB APPLICATIONS de Tricia y William Ballad.
- ISBN-13: 978-0-321-53434-7. por amazon lo tendrás. ahí lo explica todo claro, aunque ahora que me he vuelto paranoico he pillado otro sobre applications hacking security y no recuerdo que mas, estoy esperando recibirlo.
  #16 (permalink)  
Antiguo 17/11/2010, 12:19
 
Fecha de Ingreso: octubre-2010
Mensajes: 69
Antigüedad: 14 años
Puntos: 1
Respuesta: ayuda a hacer mas seguro mi login

Cita:
Iniciado por mayid Ver Mensaje
Yo hasta el dia de hoy me estoy fiando de mysql_real_escape_string y strip_tags. Pero hay un par de cosas mas que se pueden hacer y yo las dejo por pendientes...
que no se te olvide el addslashes();

Etiquetas: login, mas, seguro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 10:14.