Foros del Web » Programando para Internet » PHP »

¿Es correcta esta validacion de logeo?

Estas en el tema de ¿Es correcta esta validacion de logeo? en el foro de PHP en Foros del Web. Tenia pensado mas cosas pero creo que con la contraseña encriptada es suficiente para descartar posibles inyecciones sql. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original $sql ...
  #1 (permalink)  
Antiguo 03/08/2013, 19:04
 
Fecha de Ingreso: agosto-2012
Ubicación: M.
Mensajes: 2.031
Antigüedad: 11 años, 8 meses
Puntos: 52
¿Es correcta esta validacion de logeo?

Tenia pensado mas cosas pero
creo que con la contraseña encriptada es suficiente para descartar posibles inyecciones sql.


Código SQL:
Ver original
  1. $sql="select usuario,contrasena from usuarios where usuario='".$_POST['usuario']."' and contrasena='".sha1($_POST['contrasena'])."' limit 1";

si ponen caracteres especiales estos se convertiran con sha1 para comprobar la contraseña.
que opinan?
alguna sugerencia?


y por cierto tengo 25,092,500 de registros(de prueba) 25 millones
cada registro es un usuario.
entonces hago mi consulta para ver usuarios(si son amigos,les envie solicitud,me enviaron o no son nada mio) y me anda rapidisimo, solo muestro 30 usuarios por pagina.(dura 1.5 segundos en php)(0.0070 en mysql)
el caso es que en el logeo no es igual.(dura 2 a 3 segundos)(0.0013 en mysql) las diferencias es por que el php procesa algunas cosas menos que la de amigos)
ya que la consulta me imagino que recorre cada registro para verificar la coincidencia.
le puse limit 1 para que sea mas rapida, y si lo es, ya que si encuentra el registro detiene la busqueda, al menos eso lei.
pero de que otra manera podria optimizar la consulta para que dure 0.0001 s ?

las pruebas las hice con un usuario si esos millones de usuarios hacen la consulta al mismo tiempo entonces me imagino que el tiempo se multiplicara oO

y agrego otra cosa, si pongo los datos incorrectos se queda trabada buscando en php

pero si puedo iniciar sesión en otro explorador con otro usuario correcto en 1 segundo o 2.
por que se cuelga?

por cierto un consejo, es bueno poner un boleando de usuario eliminado y asi en todas las tablas.
incluso en las de relaciones de amistad? por que yo ahorita les doy delete a todas.
por que por ejemplo en las relaciones de amistad si un usuario elimina a otro no veo por que tener la relacion registrada, ustedes que opinan? no ocupara espacio dioquis?
y si se diera el caso de registrarla tambien tendria que registrar quien elimino a quien a que horas y los motivos confidenciales o x razon para que sea algo completo y que valga la pena no creen?


reedit, en este momento le agregue indices a las tablas y resulta mas rapido pero al revez, en vez de tardar mas cuando es incorrecto ahora tarda mas cuando es correcto, pero no se cuelga
de antemano gracias.
__________________
a veces creemos que es algo básico pero al profundizar nos damos cuenta que estábamos tocando solo la cola de la culebra

Última edición por minombreesmm; 03/08/2013 a las 20:41
  #2 (permalink)  
Antiguo 04/08/2013, 11:00
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: ¿Es correcta esta validacion de logeo?

Usa mejor esta consulta:
Código PHP:
Ver original
  1. $sql="SELECT contrasena FROM usuarios WHERE usuario='".$_POST['usuario']."' LIMIT 1";
  2. $result=$mysqli->query($sql);

Y luego comparas con PHP:
Código PHP:
Ver original
  1. $logueado=false;
  2. if($result->num_rows==1){
  3.     $fila=$result->fetch_assoc();
  4.     if($fila['contrasena']==sha1($_POST['contrasena'])) $logueado=true;
  5. }
  6.  
  7. echo $logueado ? 'Bienvenido' : 'Error durante el login';

¿Por qué? Pues simplemente porque el nombre de usuario es único, no necesitas más condiciones para encontrar un usuario. Y recoges solamente la contraseña porque no necesitas más datos, sólo la comparas con la introducida y ya está.

De todas formas tienes que filtrar el nombre de usuario que introduces en la consulta, no vaya a ser que te inyecten código
  #3 (permalink)  
Antiguo 04/08/2013, 11:12
 
Fecha de Ingreso: agosto-2012
Ubicación: M.
Mensajes: 2.031
Antigüedad: 11 años, 8 meses
Puntos: 52
Respuesta: ¿Es correcta esta validacion de logeo?

Cita:
Iniciado por Onedy Ver Mensaje
Usa mejor esta consulta:
Código PHP:
Ver original
  1. $sql="SELECT contrasena FROM usuarios WHERE usuario='".$_POST['usuario']."' LIMIT 1";
  2. $result=$mysqli->query($sql);

Y luego comparas con PHP:
Código PHP:
Ver original
  1. $logueado=false;
  2. if($result->num_rows==1){
  3.     $fila=$result->fetch_assoc();
  4.     if($fila['contrasena']==sha1($_POST['contrasena'])) $logueado=true;
  5. }
  6.  
  7. echo $logueado ? 'Bienvenido' : 'Error durante el login';

¿Por qué? Pues simplemente porque el nombre de usuario es único, no necesitas más condiciones para encontrar un usuario. Y recoges solamente la contraseña porque no necesitas más datos, sólo la comparas con la introducida y ya está.

De todas formas tienes que filtrar el nombre de usuario que introduces en la consulta, no vaya a ser que te inyecten código
muy buena idea :D
una pregunta, usas la variable logeado por ilustracion o sugiriendo sustituir variables de sesion?
__________________
a veces creemos que es algo básico pero al profundizar nos damos cuenta que estábamos tocando solo la cola de la culebra
  #4 (permalink)  
Antiguo 04/08/2013, 11:17
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: ¿Es correcta esta validacion de logeo?

Uso la variable $logueado porque al tener 2 IFs, la alternativa sería la siguiente:
Código PHP:
Ver original
  1. if($result->num_rows==1){
  2.     $fila=$result->fetch_assoc();
  3.     if($fila['contrasena']==sha1($_POST['contrasena'])) echo 'Bienvenido';
  4.     else echo 'Error durante el login';
  5. }else echo 'Error durante el login';

Yo prefiero no repetir código.
Además debes guardar el estado en alguna parte, no? :D
  #5 (permalink)  
Antiguo 04/08/2013, 11:48
 
Fecha de Ingreso: agosto-2012
Ubicación: M.
Mensajes: 2.031
Antigüedad: 11 años, 8 meses
Puntos: 52
Respuesta: ¿Es correcta esta validacion de logeo?

Cita:
Iniciado por Onedy Ver Mensaje
Uso la variable $logueado porque al tener 2 IFs, la alternativa sería la siguiente:
Código PHP:
Ver original
  1. if($result->num_rows==1){
  2.     $fila=$result->fetch_assoc();
  3.     if($fila['contrasena']==sha1($_POST['contrasena'])) echo 'Bienvenido';
  4.     else echo 'Error durante el login';
  5. }else echo 'Error durante el login';

Yo prefiero no repetir código.
Además debes guardar el estado en alguna parte, no? :D
si, yo meteria una consulta sql en donde esta la variable logeado que me regresara los datos que ocupo del usuario como su id y es donde lo guardaria en la variable de sesion
Código PHP:
Ver original
  1. sql="select * from usuarios where usuario ='".$_POST['usuario']."'";
  2. $_SESSION['iddelusuario']=$filasregistro['idusuario'];


Y asi aunque se cierre la pagina y la vuelva a abrir en otra pestaña la sesion continua
__________________
a veces creemos que es algo básico pero al profundizar nos damos cuenta que estábamos tocando solo la cola de la culebra
  #6 (permalink)  
Antiguo 04/08/2013, 12:13
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: ¿Es correcta esta validacion de logeo?

Claro, al final vas a guardar algunos datos del usuario en alguna parte.

No se si es cosa mía, pero yo prefiero limitar al máximo la cantidad de datos que se le pide a la base de datos. Por ejemplo para obtener el "idusuario" además de la contraseña, pondría SELECT idusuario, contrasena FROM... Y así haces trabajar menos a la base de datos, al no tener que irse a buscar cuales son los campos de la tabla "usuarios" (al poner el asterisco).

Una curiosidad, tu nombre de usuario lo has sacado de ese cortometraje donde salen unos hombres prehistóricos "hablando" sobre qué nombre le van a poner a su hijo? :)) :))
  #7 (permalink)  
Antiguo 04/08/2013, 12:25
 
Fecha de Ingreso: agosto-2012
Ubicación: M.
Mensajes: 2.031
Antigüedad: 11 años, 8 meses
Puntos: 52
Respuesta: ¿Es correcta esta validacion de logeo?

Cita:
Iniciado por Onedy Ver Mensaje
Claro, al final vas a guardar algunos datos del usuario en alguna parte.

No se si es cosa mía, pero yo prefiero limitar al máximo la cantidad de datos que se le pide a la base de datos. Por ejemplo para obtener el "idusuario" además de la contraseña, pondría SELECT idusuario, contrasena FROM... Y así haces trabajar menos a la base de datos, al no tener que irse a buscar cuales son los campos de la tabla "usuarios" (al poner el asterisco).

Una curiosidad, tu nombre de usuario lo has sacado de ese cortometraje donde salen unos hombres prehistóricos "hablando" sobre qué nombre le van a poner a su hijo? :)) :))
No jejs, solo se me ocurrio ponerlo oO.
bueno el * lo pongo en este caso por que forzosamente ocupo cada campo que tiene esa tabla y daría lo mismo si los especifico o no, en este caso.
__________________
a veces creemos que es algo básico pero al profundizar nos damos cuenta que estábamos tocando solo la cola de la culebra

Etiquetas: correcta, registro, select, sql, usuarios, validacion
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:50.