Es este código seguro?

Iniciado por NewLog, 22 Enero 2008, 23:25 PM

0 Miembros y 1 Visitante están viendo este tema.

NewLog

He hecho el mismo post en el subforo de bugs y exploits, si ven que aquí sobra lo pueden borrar. (Aunque quizá lo borren ahí... Aishh).


Bueno, he intentado programar un sistema de logueo para acceder a una página en particular, pero con que lo he hecho yo desde cero con los pocos conocimientos que tengo, me pregunto si este sistema es totalmente seguro, dejando a parte SQL Injections (ya que aun no he mirado eso). El código es el siguiente:

Formulario.php

<html>
<head></head>
<body bgcolor="#000" text="#FFFFFF">
<center><br><br><br>
<form action="acceso.php" method="post">
Login:<br><input name="login" type="text" maxlength="9"></input><br><br>
Password: <br><input name="pass" type="password" maxlength="9"></input><br><br>
<input type="submit" value="Enviar">
</form>
</center>
</body>
</html>


Este no hace falta ni que lo explique porqué creo que es muy simple.

Acceso.php

<?php
$login
htmlentities($_POST['login']);
$passhtmlentities($_POST['pass']);
$db="Usuarios";
$tabla="Datos";
echo 
"Datos:"
echo 
"<br>";
echo 
"El login es $login<br>";
echo 
"El password es $pass<br>";

$conexion=mysql_connect("localhost","root","");
if(!
$conexion){
echo 
"No se ha podido conectar a la base de datos<br>";
return 
0;
}else{
mysql_select_db($db$conexion);

$res=mysql_query("SELECT * FROM $tabla"$conexion);
echo 
"Res=$res<br>";
while(
$fila mysql_fetch_array($res)){
$login1 $fila['login'];
$password1 $fila['pass'];
echo 
"Login leido= $login1   Password leido=$password1";
}
}
mysql_close();
if((
$login==$login1)&&($pass==$password1)){
header("location:AccesoValidado.html");
}else{
header("location:AccesoDenegado.html");
}
?>



No es muy difícil de entender, si tenéis alguna duda preguntad. Al final de este código es donde se comprueba si el password y usuario es el mismo. Yo creo que es seguro ya que el valor de una variables en php NO se pueden modificar externamente, no? Y si se intenta entrar a Acceso.php este redirecciona directamente hacia AccesoDenegado.html.

Lo que aun no sé es como hacer que a Accesovalidado sólo puedan llegar las personas loguedas. Me pregunto si es posible hacerlo sin cookies.


Gracias.

SirLanceCC

#1
No entiendo esto
Código (php) [Seleccionar]
$res=mysql_query("SELECT * FROM $tabla", $conexion);

while($fila = mysql_fetch_array($res)){
$login1 = $fila['login'];
$password1 = $fila['pass'];
echo "Login leido= $login1   Password leido=$password1";
}
}
mysql_close();
if(($login==$login1)&&($pass==$password1)){
header("location:AccesoValidado.html");
}


por que $login1 sólo tendrá el ultimo dato leido... quizá no te ha provocado error si tienes un solo usuario en tu tabla...

Y la consulta yo la haría así para :
Código (sql) [Seleccionar]
SELECT usuario, password FROM $tabla WHERE login='$login' and pass='$pass'
Si existe el usuario con la conraseña correcta te devolverá sus datos, si no no te devolverá nada...

Y además para asegurar un poco más deberías de cifrar las contraseñas con md5() por ejemplo. Es decir en tu base de datos tienes la contraseña cifrada y luego, la contraseña que recibes la encriptas también y luego la comparas con la que está almacenada.
;)

NewLog

Sí, sí, en la base de datos sólo tengo un usuario, así que el algoritmo de búsqueda no es importante. Aun así, me apunto tu manera de hacer la consulta (aun no sé MySQL).

Lo que dices de cifrar la contraseña, me pregunto si es posible encriptarla directamente en la página formulario.php y cuando se envie YA esté cifrada. Además no con una función predeterminada por php sinó con una creada por mi mismo.
Sin que la contraseña se envie en texto plano en ningún momento!


Además, ahora se me ha ocurrido una pregunta, sabéis que google tiene un buscador de código? Pues en él se pueden leer códigos en php que en teoria son de webs reales. Es posible que aunque el código se interprete en el servidor alguien pueda obtener el código php de la web?

Gracias -| Sir_Lance |-

Hans el Topo

por el foro tienes logins exos
 

NewLog

Pero no me va la comida rápida ^^ Aun así les echaré un vistazo.

baZZ

No utilices caracteres comodín. En vez de SELECT *, haz SELECT de los campos que necesites. Se considera un buen hábito...

Un saludo
- EVGA ATX - Intel X58
- i7 920 @ 3,2 Ghz
- 2x260 gtx 216 SLI
- 3x1 GB OCZ DIMM DDR3 1600 Mhz
- Tacens Sagitta II
- Seagate 7200.12
Falta:
- T.R.U.E ^^
- i7 @ 4,0 Ghz

Carxl

Hola a todos, cómo van??

Si me permiten...

NewLog, lo que te dice Sir_Lance es cierto, esa es la manera correcta de peguntar si es un usuario válido, así sea un solo usuario ;D

Además a manera de consejo te recomiendo que el conectar y seleccionar una DB sea una función o una clase, y la llames la veces que la necesites.

Y lo que dice baZZ, mas que un hábito, se haría por ahorrar recursos del server :)

Saludos
Hay 10 tipos de personas, los que entienden binario... y los que no!

NewLog

Gracias por los consejos sobre MySql.

Alguien sabe lo de google? Y aun más, es posible leer (por un usuario) el valor de las variables en php que yo no muestro?

Gracias!

SirLanceCC

#8
CitarEs posible que aunque el código se interprete en el servidor alguien pueda obtener el código php de la web?
Pues que yo sepa solo si el autor lo publica o si encuentras alguna vilnerabilidad en el sistema o en el servidor. Yo creo que en el caso de google han de ser los autores quienes publican los codigos.

CitarLo que dices de cifrar la contraseña, me pregunto si es posible encriptarla directamente en la página formulario.php y cuando se envie YA esté cifrada. Sin que la contraseña se envie en texto plano en ningún momento!
Bueno eso... creo que solo con https, aunque la verdad no lo se... en un formulario normal en http creo que la contraseña si viaja en texto plano

CitarAdemás no con una función predeterminada por php sinó con una creada por mi mismo.
Yo creo que no hay que reinventar la rueda a menos que tu plan sea reinventar la rueda. Para hacer una función de cifrado que sea medianamente buena son necesarios meses de trabajo (supongo). Además md5 es un buen algoritmo.

CitarLo que aun no sé es como hacer que a Accesovalidado sólo puedan llegar las personas loguedas. Me pregunto si es posible hacerlo sin cookies.
Se pueden usar las sesiones de php.

NewLog

#9
Cita de: -| Sir_Lance |-
Yo creo que no hay que reinventar la rueda a menos que tu plan sea reinventar la rueda. Para hacer una función de cifrado que sea medianamente buena son necesarios meses de trabajo (supongo). Además md5 es un buen algoritmo.

No es que quiera reinventar la rueda. Simplemente es que si alguna vez alguien consigue "snifar" la contraseña no la podrá asociar a ningún algoritmo conocido del cual exista un programa para romperlo (como en el caso de md5 (que no es romperlo, pero se puede llegar a saber la contraseña)) y es muy posible que se quede o_O. Y no nos engañemos, no todos los que saben usar un sniffer tiene idea de lo que es un algoritmo. Así que aunque el algoritmo no sea complicado, seguro que es mucho más útil.

Al menos eso pienso yo ^^.