Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: NewLog en 22 Enero 2008, 23:25 pm



Título: Es este código seguro?
Publicado por: NewLog en 22 Enero 2008, 23:25 pm
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
Código:
<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
Código:
<?php
$login= htmlentities($_POST['login']);
$pass= htmlentities($_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.


Título: Re: Es este código seguro?
Publicado por: SirLanceCC en 23 Enero 2008, 16:16 pm
No entiendo esto
Código
  1. $res=mysql_query("SELECT * FROM $tabla", $conexion);
  2.  
  3. while($fila = mysql_fetch_array($res)){
  4. $login1 = $fila['login'];
  5. $password1 = $fila['pass'];
  6. echo "Login leido= $login1   Password leido=$password1";
  7. }
  8. }
  9. if(($login==$login1)&&($pass==$password1)){
  10. header("location:AccesoValidado.html");
  11. }

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
  1. 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.
 ;)


Título: Re: Es este código seguro?
Publicado por: NewLog en 23 Enero 2008, 18:15 pm
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 |-


Título: Re: Es este código seguro?
Publicado por: Hans el Topo en 23 Enero 2008, 20:55 pm
por el foro tienes logins exos


Título: Re: Es este código seguro?
Publicado por: NewLog en 23 Enero 2008, 21:49 pm
Pero no me va la comida rápida ^^ Aun así les echaré un vistazo.


Título: Re: Es este código seguro?
Publicado por: baZZ en 24 Enero 2008, 04:09 am
No utilices caracteres comodín. En vez de SELECT *, haz SELECT de los campos que necesites. Se considera un buen hábito...

Un saludo


Título: Re: Es este código seguro?
Publicado por: Carxl en 24 Enero 2008, 05:34 am
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


Título: Re: Es este código seguro?
Publicado por: NewLog en 24 Enero 2008, 08:27 am
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!


Título: Re: Es este código seguro?
Publicado por: SirLanceCC en 24 Enero 2008, 15:50 pm
Citar
Es 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.

Citar
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. 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

Citar
Ademá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.

Citar
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.
Se pueden usar las sesiones de php.


Título: Re: Es este código seguro?
Publicado por: NewLog en 24 Enero 2008, 16:56 pm
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 ^^.


Título: Re: Es este código seguro?
Publicado por: Universal SAC en 25 Enero 2008, 07:15 am
Si quieres cifrar los datos antes de enviarlos y sin tener que utilizar un programa "externo", puedes implementarlo automáticamente desde tu sitio utilizando lenguajes del lado del cliente.

Código:
//ejemplo en vivo

<?php
   echo '<html><head><title>Identifícate</title><body><center>';
   if(isset($_POST['usuario'] && $_POST['usuario'] && isset($_POST['usuario'] && $_POST['usuario']){
      //analizas que tengan 32 caracteres, o filtras... o lo que quieras

      if( /*revizas si existen y son correctos*/ ){
         echo 'Correcto';
      }else{
         echo 'Incorrecto';
      }
   }else{
      echo '   <h1>Sistema de Identificación</h1>';
      echo '   <form method="POST">';
      echo '      Usuario:<br><input type="text" name="usuario" /><br><br>';
      echo '      Password:<br><input type="password" name="pass" /><br><br>';
      echo '      <input type="submit" value="Identificarse" ';
      echo 'onClick="javascript:form.usuario.value=hex_md5(form.usuario.value);';
      echo 'form.password.value=hex_md5(form.password.value)"  />';
      echo '   </form>';
   }
   echo '</center></body></html>';
?>


Título: Re: Es este código seguro?
Publicado por: NewLog en 25 Enero 2008, 10:20 am
Ufff, eso es perfecto! Y al estar dentro de código php no podrá ser leído! Muchas gracias Universal SAC. No se me había ocurrido. Supongo que en la linia de los isset se te ha ido un poco la pinza, no? Con esto ya sirve, verdad?

Código
  1. if(isset($_POST['usuario']) && isset($_POST['pass'])){

Ahora se me ha ocurrido otra pregunta un poco más básica (sí, aun más). Es posible hacer algo como esto?

Código:
javascript:form.usuario.value=$VARIABLE_PHP;

Supongo que no, pero si yo tuviera una variable en php por ejemplo $ENTERO, como la podría enchufar en el usuario.value?

Gracias otra vez!


Título: Re: Es este código seguro?
Publicado por: SirLanceCC en 25 Enero 2008, 13:46 pm
Pues yo lo hago asi.. no se si sea buena o mala costumbre
Código
  1. <input name="loqsea" value="<?php echo $mivariable ?>" />
  2. </form>
  3.  


Título: Re: Es este código seguro?
Publicado por: NewLog en 25 Enero 2008, 15:18 pm
Qué extraño! Lo probaré a ver qué tal!


Título: Re: Es este código seguro?
Publicado por: Universal SAC en 25 Enero 2008, 21:23 pm
Ufff, eso es perfecto! Y al estar dentro de código php no podrá ser leído! Muchas gracias Universal SAC. No se me había ocurrido. Supongo que en la linia de los isset se te ha ido un poco la pinza, no? Con esto ya sirve, verdad?

Código
  1. if(isset($_POST['usuario']) && isset($_POST['pass'])){

Ahora se me ha ocurrido otra pregunta un poco más básica (sí, aun más). Es posible hacer algo como esto?

Código:
javascript:form.usuario.value=$VARIABLE_PHP;

Supongo que no, pero si yo tuviera una variable en php por ejemplo $ENTERO, como la podría enchufar en el usuario.value?

Gracias otra vez!

Jojo, que bueno que siempre que hago un código en el momento le pongo algún comentario sobre: "en vivo" o "en caliente" jaja.
Lo más correcto y seguro, creo que es así:

if(isset($_POST['usuario']) && $_POST['usuario']!=NULL && isset($_POST['pass']) && $_POST['pass']!=NULL){
Sobre lo que dices de usar una variable php, no tiene dificultad! La forma de Sir_Lance es correcta, pero muy poco ortodoxa si vas  a hacer un proyecto grande o modular...

Yo considero que todo el código html en donde se va a utilizar php, debe imprimirse desde php! Con lo que iría de una forma así:

<?php
   $VARIABLE = "funciona";
   echo '<form><input name="loqsea" value="'.$VARIABLE.'" onClick="javascript:alert("'.$VARIABLE.'");" /></form>';
?>
El uso de comillas simples o dobles, creo que es al gusto. Cuando vas a imprimir código html es más facil imprimir con ' (comillas simples) para no tener que estar filtrando todas las comillas dobles.
Es mi punto de vista.


Título: Re: Es este código seguro?
Publicado por: NewLog en 26 Enero 2008, 03:30 am
Jejeje, madre mia, que tonto!! Mira que no caer en eso... aisshh

Bueno, doy po zanjado el tema.

Muchas gracias a todos ^^


Título: Re: Es este código seguro?
Publicado por: ActiveSheet en 28 Enero 2008, 10:05 am
pff la verdad no lei el post solo vi de re ojo.

xD al principio crei que era una shell y pense chale si posteo el codigo xD

en fin.

si quieres hacer un sistema de usuarios con pass login.

usa el MD5 y Base64 para evitar SQL Inyeccion o como le digan a eso......

if(md5($login_entrante)==$Password_SQL){
// xD
echo 'Logged';
}




Título: Re: Es este código seguro?
Publicado por: Carxl en 29 Enero 2008, 03:23 am
Hola Universal SAC, no es por contradecirte ni mucho menos, pero creo que tienes un concepto "errado" de lo que debe hacer php y por supuesto que respeto tu punto de vista, pero:

Citar
Yo considero que todo el código html en donde se va a utilizar php, debe imprimirse desde php! Con lo que iría de una forma así:

<?php
   $VARIABLE = "funciona";
   echo '<form><input name="loqsea" value="'.$VARIABLE.'" onClick="javascript:alert("'.$VARIABLE.'");" /></form>';
?>

Php es un lenguaje que se interpreta del lado del servidor, que aunque formatea correctamente html y lo muestra como debe ser, no es correcto utilizarlo para esto. Por qué?? por que se estarían utilizando recursos del servidor para mostrar código html, cosa que no es conveniente, los encargados de mostrar dicho código son los navegadores, es utilizar php para algo que no se hizo....

Que crees que carga mas rápido??
Código:
<html>
<p>Hola mundo</p>
</html>

ó

Código:
<?php
echo "<html>
<p>Hola mundo</p>
</html>";
?>

Una simple observación: La página tendría que mandar una petición al servidor para poder visualizar la página, mientras que si dejas el html aparte de php, tu tiempo de carga se optimiza, por que dependería netamente del navegador...

Espero tomes en cuenta mi opinión :-*

Saludos ;D


Título: Re: Es este código seguro?
Publicado por: NewLog en 29 Enero 2008, 22:33 pm
Parece lógico.  Me ha gustado, lo voy a tomar por bueno si nadie nos convence de lo contrario ^^


Título: Re: Es este código seguro?
Publicado por: Universal SAC en 30 Enero 2008, 00:52 am
Que tal Carxl, tienes mucha razón! Gracias por comentarlo  ;D
Aunque, estamos hablando de que todas y cada una de las funciones de php permiten realizar acciones que html solo no podría, y todas estas actividades consumen más recursos. A lo mejor tengo ese concepto errado de php, la verdad nunca lo habia visto de esa manera... pero de alguno no me cabe duda, la forma de usar php que yo presenté es la más efectiva (o tal vez la única efectiva) a la hora de realizar aplicaciones grandes, modulares o de contenido "muy dinámico".

SMF, PHP-NUKE, IPB, Wordpress........y un sin fin de aplicaciones conocidas. Todas trabajan de esta forma pues se requiere tratar y almacenar toda la información para luego imprimirla.

Seria cuestión de analizar qué aplicación se va a realizar para encontrar la manera más efectiva de trabajarla con php (y con efectivo, me refiero a tiempo de ejecución, recursos a utilizar).

Es mi punto de opinión nada más, claro que no me voy a tomar a mal tu comentario! al contrario, gracias por dar tu opinión también.
Saludos!


Título: Re: Es este código seguro?
Publicado por: Carxl en 30 Enero 2008, 04:00 am
Parece lógico.  Me ha gustado, lo voy a tomar por bueno si nadie nos convence de lo contrario ^^

En mi gran ignorancia y en mi nula sabiduría he logrado que al menos una persona tomé en cuenta esto... ;D ;D ;D

He realizado muchos proyectos grandes y complejos y siempre trato de no mezclar presentación estática con presentación dinámica. Creo que son maneras de desarrollar, vaya uno a saber cuál es la mejor ;)

Saludos Universal SAC y NewLog :-*