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!!
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.
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:
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!
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
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);
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?
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.
Sí, entiendo, finalmente usaré md5, pues la función hash no se utiliza en el php4, nos vemos! ya os contare
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.
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? :?
Zupervaca se refiere al SQL-Injection: http://en.wikipedia.org/wiki/SQL_injection
Vale, era lo que más o menos pensaba, pero ya veo que no tiene mucha complicación el poder solucionarlo ;)
Recuerda no solo proteger via javascript, sino en php tb, q hoy en día hay herramientas para hacer virguerías xDD
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 39Nosé 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?
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 :)
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!
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
Vale, lo veo mas claro asi, muchas gracias! Ya posteare los avances ;D
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!
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.
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!
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