Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: yens en 12 de Noviembre de 2006, 02:51:30 AM

Título: Almacenamiento de passwords en SQL
Publicado por: yens en 12 de Noviembre de 2006, 02:51:30 AM
Bueno.. nuevamente dudas referentes al tema de páginas web, concretamente a las bases de datos SQL. Estoy probando cosillas referentes al registro de usuarios, con su fecha de registro, nombre, codigo autoincrementado de usuario... etc etc y como no su password para un futuro login en sesiones. El "problema" es que si yo accedo a la base de datos para modificar algunos campos de mi tabla usuarios, veo la contraseña de cada usuario, cuando eso teoricamente no deberia ser asi no? es decir, yo en mi formulario cifro la contraseña en un type password, y se ven *** sin embargo, al pasarlo como varchar a la base de datos, me aperece sin cifrar, y los tipos de datos que he visto por ahi, no veo ninguno que haga referencia a passwords o similares.

Alguna sugerencia? graciñas!!
Título: Almacenamiento de passwords en SQL
Publicado por: Zaelsius en 12 de Noviembre de 2006, 02:57:06 AM
Aplíca un hash con MD5 a las contraseñas antes de guardarlas en la BD. Luego cuando un usuario acceda al sistema, vuelves a calcular el MD5 del password proporcionado y lo compruebas con el almacenado. De esa manera no guardas las contraseñas en plano y tampoco puedes recuperarlas, aun siendo el administrador.

http://en.wikipedia.org/wiki/MD5

Si buscas en Google verás implementaciones del algoritmo MD5 para PHP, ASP, etc.. es copiar y pegar.
Título: Almacenamiento de passwords en SQL
Publicado por: Alexpi en 12 de Noviembre de 2006, 10:28:40 AM
md5 es la opcion mas usada pero...escuché por ahí que habian crackeado el md5 de php, alguien sabe algo al respecto?¿ pq si es asi...seguridad minima y entonces que otro metodo usar? S:
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 12 de Noviembre de 2006, 11:51:14 AM
La verdad es que debería empezar a controlar bien el tema de seguridad de php, he de ver si encuentro alguna web con contenido de seguridad al respecto, porque por ahora no hago ningún tipo de comprobaciones ni nada... voy a leer sobre lo que me habéis recomendado a ver que tal..

Gracias!
Título: Almacenamiento de passwords en SQL
Publicado por: Vicente en 12 de Noviembre de 2006, 11:56:27 AM
Usa un hash mas grande que el MD5. El MD5 es un hash de 128 bits, pero como todos los hash, solo hace falta la mitad de su longitud para provocar una colisión y romperlo (2^64 intentos para el MD5).

Yo usaría SHA512 como hash mejor. Un saludo!

Vicente
Título: Almacenamiento de passwords en SQL
Publicado por: Snakers en 12 de Noviembre de 2006, 11:57:05 AM
Yo probé una vez lo de encriptarlo,si te sirve el codigo,te pongo lo más importante....

Para introducir...

$query="INSERT INTO datos(nick,password) VALUES ('$nick',PASSWORD('$password))";
mysql_query($query,$conexion);

Para login(en mi opinion debe haber otro modo mejor de hacerlo)...

$query2 = "SELECT * FROM datos WHERE password=PASSWORD('$password) ";
mysql_query($query2,$conexion);
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 12 de Noviembre de 2006, 12:11:59 PM
Al parecer independientemente del hash que utilice para convertir mis contraseñas, debido a que la conversión la estoy haciendo de lado del servidor, y la contraseña desde el cliente viaja hasta el servidor sin ningún tipo de cifrado, podría darse la posibilidad de que un tercero entrase en medio del envío y recogiese o modificase la contraseña original no?

Por lo que veo lo mejor sería ejecutar el hash de lado del cliente, por ejemplo con un... javascript?¿ y luego enviarlo al servidor no?
Título: Almacenamiento de passwords en SQL
Publicado por: Zaelsius en 12 de Noviembre de 2006, 01:18:43 PM
Al atacante le daria igual capturar el hash o la contraseña en texto plano, si eso le permite acceder a la web o servicio deseados. Si quieres que la conexión sea más segura toca usar algo como SSL(https).

De todas maneras, no se trata de hacer algo irrompible(que no existe), sino de algo suficientemente seguro para lo que necesitas.
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 12 de Noviembre de 2006, 01:22:18 PM
Sí, entiendo, finalmente usaré md5, pues la función hash no se utiliza en el php4, nos vemos! ya os contare
Título: Almacenamiento de passwords en SQL
Publicado por: zupervaca en 12 de Noviembre de 2006, 01:31:25 PM
Solo por avisarte de un problema clasico, es que despues de buscar el nick y la clave en la base de datos compruebas el nick y la clave con los valores obtenidos del select, ya que pueden meter sentencias sql en el nick o la clave y romperte el sistema de login.
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 12 de Noviembre de 2006, 01:37:11 PM
No sé si he entendido bien tu supuesto... En breves me meteré con el login de usuarios, si yo quiero ver si un usuario se ha logeado simplemente debo comparar los campos usuario y contraseña con los que ha introducido el, cuál sería el problema?  Supongo que ha si mete lenguaje SQL en esos campos pero... no tendrían por qué ejecutarse no?  :?
Título: Almacenamiento de passwords en SQL
Publicado por: Zaelsius en 12 de Noviembre de 2006, 01:56:47 PM
Zupervaca se refiere al SQL-Injection: http://en.wikipedia.org/wiki/SQL_injection
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 12 de Noviembre de 2006, 02:12:29 PM
Vale, era lo que más o menos pensaba, pero ya veo que no tiene mucha complicación el poder solucionarlo ;)
Título: Almacenamiento de passwords en SQL
Publicado por: shephiroth en 12 de Noviembre de 2006, 03:36:27 PM
Recuerda no solo proteger via javascript, sino en php tb, q hoy en día hay herramientas para hacer virguerías xDD
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 12 de Noviembre de 2006, 11:29:20 PM
Muy buenas!! Esta tarde le he incado el diente un poco más al tema de php y sql, y ahora mismo que ya consigo introducir datos de usuarios, detectar si ya existe el nombre del usuario registrado, y logearse, estube mirando el tema de manejo de logins mediante cookies...
El problema es que una vez que compruebo si las credenciales son correctas, creo las cookies para nick y password, redirecciono a la pagina principal, en la cual tengo un include para comprobar si las cookies estan activas o no y si coinciden (si es asi, $logincorrecto = true). Para comprobar si el usuario esta logeado utilizo la condicion de si $logincorrecto es true, se me identifique como usuario logeado y se me de la bienvenida a modo de frase, y sino como visitante (solo mediante un simple echo y su frasecita también).

El problema es que si introduzco bien las credenciales, me sigue tratando como un visitante, como si funcionasen las cookies.
Si introduzco mal las credenciales, me funciona bien, es decir me avisa de que no existe el usuario.

Por otra parte, algunas veces visiono un error que hace referencia a las dos lineas de codigo donde defini las cookies por primera vez:
Citarsetcookie("usNick",$nickN,time()+7776000);
setcookie("usPass",$passN,time()+7776000);
Con un mensaje de:
"cannot modify header information - headers already sent by (output started at /home/blabla/ingresar.php:9) in /home/blabla/ingresar.php on line 38
"cannot modify header information - headers already sent by (output started at /home/blabla/ingresar.php:9) in /home/blabla/ingresar.php on line 39

Nosé si me he expresado bien.. pero basicamente llevo como dos horas rebuscando en el código y no veo ningún fallo a priori sencillo xD

pd: Podría usar como alternativa natural las sesiones de usuario en vez de las cookies?
Título: Almacenamiento de passwords en SQL
Publicado por: MrK en 12 de Noviembre de 2006, 11:37:35 PM
Cita de: "yEnS"
"cannot modify header information - headers already sent by (output started at /home/blabla/ingresar.php:9) in /home/blabla/ingresar.php on line 38
"cannot modify header information - headers already sent by (output started at /home/blabla/ingresar.php:9) in /home/blabla/ingresar.php on line 39

los headers se envian al cliente antes de que se envie ninguna otra cosa.  De lo que se te esta quejando el php es que has enviado alguna cosa (ya sea un texto, o el tag inicial de html, o un simple espacio) y despues estas intentando cambiar los headers (y no se puede, piltrafilla)

mirate la linea y fichero donde dice "output started", y prueba de meter las cookies antes de esa linea, a ver si hay suerte :)
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 12 de Noviembre de 2006, 11:42:38 PM
No llego a entender lo que quieres decir con los headers, yo tengo incrustrado codigo php en el html de la siguiente manera:

Citar
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Comprobacion de credenciales</title>
</head>
<body>
<?php
//conectamos con la base de datos

loquesea...      
            
//asignamos a variables los resultados para trabajar con ellos
$nick_temp = htmlentities($_REQUEST["nick"]);
$password_temp = md5($_REQUEST["password"]);
$nombre_temp = $_REQUEST["nombre"];
$email_temp = htmlentities($_REQUEST["email"]);
//
//si nick y pass no estan en blanco
if(trim($nick_temp) != "" && trim($password_temp) != "")
{
$nickN = $nick_temp;
$passN = $password_temp;

//si coinciden las credenciales
$resultado = mysql_query("SELECT password FROM usuarios WHERE nick= '$nick_temp'");
//guardamos datos del registro en $registro del nick seleccionado si existe
if($registro = mysql_fetch_array($resultado))
{
//comprobamos si password coincide, pues el nick si
if($registro["password"] == $passN)
{
//establecemos cookies para nick y password de 90 días
setcookie("usNick",$nickN,time()+7776000); --->linea 38
setcookie("usPass",$passN,time()+7776000); --->linea 39
?>
Login correcto, redigiriendo a la página principal...
<SCRIPT LANGUAGE="javascript" type="text/javascript">
location.href = "index.php";
</SCRIPT>
<?php
}
else
{
echo "Password incorrecto";
}
}
else
{
echo "El nick proporcionado no está registrado, por favor registre o introduzca un nick correcto.";
}
mysql_free_result($resultado);
}
else
{
echo "Debe especificar un nick y password.";
}
//cerramos conexion a base de datos
mysql_close();
?>
</body>
</html>

No entiendo a que te refieres con los headers si a las simples etiquetas html o a que!
Título: Almacenamiento de passwords en SQL
Publicado por: jazcks en 13 de Noviembre de 2006, 10:33:29 AM
el error es claro, estas enviando al navegador el DOCTYPE y parte de codigo html antes de llegar a mandar las cookies por el header.

deberías hacer algo asi:

<?phpinicializacion, crear sesion o cookies?>


<html>
<head>
...blabla...

<?phpmas cosas en php?>

..mas html por aqui...
</html>


y bueno, he estado leyendo lo que intentas hacer y yo no guardaria con cookies el password, realmente no es necesario.
Yo lo que hago es:
-LOGIN:envio por javascript el user y password en md5
-php lo recibe y comprueba el usuario y tal...
-si todo correcto, creo una session en php
-redirijo con header(...) a la pagina que toque (la despues del login ok)

para crear una sesion:
session_start();
$_SESSION['login_ok'] = 1;
$_SESSION['user'] = $user;
session_write_close();

y esas variables (login_ok, user) se mantienen en las otras paginas php dentro de $_SESSION hasta que tu cierres la sesion.
en php está todo, mirate los ejemplos y comentarios de la gente: http://es2.php.net/manual/es/ref.session.php
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 13 de Noviembre de 2006, 10:44:18 AM
Vale, lo veo mas claro asi, muchas gracias! Ya posteare los avances ;D
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 13 de Noviembre de 2006, 04:01:54 PM
Bueno, al final he conseguido trabajar con sesiones, pero como soy así de cabezón... también he probado a volver a intentarlo con las cookies porque considero que para lo que necesito son más útiles y prácticas asi que.. lo conseguí!! :D

Si os interesa por futuros problemas que podais tener os resumo en que consiste lo que hice:
Citar
- Cuando el usuario se logea, creo las 2 cookies de nick y pass y les asigno los valores, comprobando previamente si existen en la base de datos etc.
- Compruebo si existen las dos cookies de password y nick, si es asi, se dan las opciones de cerrar sesion, y demas opciones del menu de usuario.
- Si se cierra la sesion, modifico por $_GET la variable $_GET['logout'] a true y "mato" las dos cookies utilizadas.

Supongo que ya casi todos sabréis como va, pero weno por si alguno le interesase xD!
Título: Almacenamiento de passwords en SQL
Publicado por: jazcks en 13 de Noviembre de 2006, 04:12:09 PM
tengo curiosidad xDD, en qué página o aplicación web son más útiles las cookies que las sesiones?

si lo que quieres es hacer que no tengas que loggearte al cabo de un tiempo, aunque cierres el navegador, guarda una cookie con, por ejemplo "login = ok", pero que no guarde información sensible como la pass, ademas te evitas hacer una consulta sql.
Título: Almacenamiento de passwords en SQL
Publicado por: yens en 13 de Noviembre de 2006, 04:33:42 PM
No utilizo mas que una vez la consulta por login de usuario.

Me resulta mas bien comodo, no tener que usar los session_start() al inicio de cada pagina, o que el usuario ya este logeado al entrar en la web, quizas me exprese mal. Pero lo bueno es que me han funcionado los dos metodos xD!
Título: Almacenamiento de passwords en SQL
Publicado por: zupervaca en 13 de Noviembre de 2006, 06:40:40 PM
Editado: No me di cuenta que habia mas de una pagina :lol: sorry por el post
Si algun admin ve este mensaje que lo borre