Foros del Web » Programando para Internet » PHP »

Comparar el valor de una variable con el contenido de un fichero txt

Estas en el tema de Comparar el valor de una variable con el contenido de un fichero txt en el foro de PHP en Foros del Web. Hola, tengo unas nociones muy básicas de PHP y estoy intentando hacer un sistema de autentificación para usuarios sin base de datos, sólo con ficheros ...
  #1 (permalink)  
Antiguo 20/06/2004, 11:13
 
Fecha de Ingreso: octubre-2003
Ubicación: Villava [NA]
Mensajes: 13
Antigüedad: 20 años, 6 meses
Puntos: 0
Pregunta Comparar el valor de una variable con el contenido de un fichero txt

Hola, tengo unas nociones muy básicas de PHP y estoy intentando hacer un sistema de autentificación para usuarios sin base de datos, sólo con ficheros txt.

He creado un formulario de registro básico en el que cada usuario indica un nick y una contraseña. Estos datos son recogidos por un archivo PHP que crea un fichero llamado usuario.txt (donde "usuario" es el nick que se ha indicado al rellenar el formulario) e incluye como contenido en él su password.

Ahora estoy atascado, porque quiero que el módulo de identificación (basado en uno de Desarrolloweb.com) compare lo que el usuario escribe en el campo "contraseña" con el contenido de dicho archivo "usuario.txt" (que es la contraseña), pero no sé cómo hacerlo

De momento, mi código es algo así:

Código PHP:
<? 
//defino el valor de $id, que es el nombre indicado por el usuario,

$_POST["usuario"] = $id;
//compruebo que la contraseña sea váilda 
if ($_POST["contrasena"]==**aquí el script debería leer el contenido de $id.txt**){ 
    
//usuario y contraseña válidos 
    //defino una sesion y guardo datos 
    
session_start(); 
    
$_SESSION["autentificado"]= "SI"
    
header ("Location: aplicacion.php"); 
}else { 
    
//si no existe le mando otra vez a la portada pasando por la URL el error
    
header("Location: index.php?errorusuario=si"); 

?>
¿Puede alguien echarme una mano? He probado con include, pero me da la sensación de que esto no tiene nada que ver...

Aciass !

PD: sé que todo esto es más sencillo con base de datos, pero en mi servidor se paga aparte

Última edición por benfiter; 20/06/2004 a las 11:15
  #2 (permalink)  
Antiguo 20/06/2004, 13:21
 
Fecha de Ingreso: octubre-2003
Ubicación: Villava [NA]
Mensajes: 13
Antigüedad: 20 años, 6 meses
Puntos: 0
Ya lo tengooo ! He conseguido que abra el fichero y lea la primera línea (línea 0) para compararla con la contraseña. De este modo, puedo almacenar en un fichero txt la información de un usuario y recuperarla línea por línea como si fueran campos en una tabla de la base de datos .

Ahí va el código:

Código PHP:
<?
//defino el valor de $id, $archivo y cuento sus líneas con count()
$id $_POST["usuario"];
$archivo file("$id.txt");
$lineas count($archivo);
?>
<? 
//veo si la contraseña contraseña es válida
if ($_POST["contrasena"]==$archivo[0]){ 
    
//usuario y contraseña válidos 
    //defino una sesion y guardo datos 
    
session_start(); 
    
$_SESSION["autentificado"]= "SI"
    
header ("Location: aplicacion.php"); 
}else { 
    
//si no existe le mando otra vez a la portada 
    
header("Location: index.php?errorusuario=si"); 

?>
Soy feliz !

Gracias de todos modos; si se os ocurre otra forma mejor y más "estética" (la seguridad no me importa demasiado, es para una web muuy pequeña) permanezco abierto a sugerencias.

Taluego !

Última edición por benfiter; 20/06/2004 a las 13:23
  #3 (permalink)  
Antiguo 20/06/2004, 13:29
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 20 años, 6 meses
Puntos: 1
bueno, primero algo básico. Si tu tienes en tu script

$_POST['usuario'] = $id;

el contenido de la variable $id pasa al de $_POST['usuario']

lo que debiste haber puesto es $id = $_POST['usuario'];

para que el contenido de lo que recibes por POST se copie en la variable $id.

Ahora, lee sobre las siguientes funciones en php.net, una vez que las entiendas podras generar tu script:

fopen();
fwrite();
file();
strstr();

dandote una pequeña orientación, los pasos serian algo asi:

-abres el fichero con fopen o file() de acuerdo al nombre de usuario
-lees con fread() (si usaste file() no es necesario leer) el contenido del mismo, buscando con alguna funcion de cadena como strstr() donde esta el password, una vez que lo encuentras lo guardas en alguna variable.
-comparas esa variable (que ahora contiene el password) con el password que envio el usuario

documentate, intentalo, si aun después de mucho intentar no puedes, con gusto te ayudo... un saludo
  #4 (permalink)  
Antiguo 21/06/2004, 00:21
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Es malisima la idea de meter los passwords en txt, con los permisos minimos de unix puedes abrirlos con el browser, ago solo una observacion si usas el file() cada linea del archivo se pasara como un elemento al array, ojo: incluyendo los saltos de linea "\n" por lo que deveras eliminarlos antes de hacer la comparacion, puedes utilizar la funcion chop() para eliminar tal salto de linea, quedaria mas o menos asi:

Código PHP:
<? 
//defino el valor de $id, $archivo y cuento sus líneas con count() 
$id $_POST["usuario"]; 
$archivo file("$id.txt"); 
$lineas count($archivo); 
?> 
<? 
//veo si la contraseña contraseña es válida 
if ($_POST["contrasena"]==chop($archivo[0])){ 
    
//usuario y contraseña válidos 
    //defino una sesion y guardo datos 
    
session_start(); 
    
$_SESSION["autentificado"]= "SI"
    
header ("Location: aplicacion.php"); 
}else { 
    
//si no existe le mando otra vez a la portada 
    
header("Location: index.php?errorusuario=si"); 
?>
si vas a archivos de texto para guardar passwors por lo menos encriptalos
  #5 (permalink)  
Antiguo 21/06/2004, 03:48
 
Fecha de Ingreso: octubre-2003
Ubicación: Villava [NA]
Mensajes: 13
Antigüedad: 20 años, 6 meses
Puntos: 0
Ufff... en lo relativo a Unix soy un completo ignorante; no sé qué se puede y qué no se puede hacer.

Mi intención era meter los password "tal cual" (tampoco sé cómo encriptar y desencriptar) en un archivo txt dentro de una carpeta cuyo CHMOD no permitiera el acceso más que al propietario. No sé si con eso arreglaría algo...
  #6 (permalink)  
Antiguo 21/06/2004, 12:33
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
bueno si son varios usuarios los que accesan a la seccion que tienes protegida y en la cual validas con info que esta en los archivos de texto tal vez te convenga mejor crear una tabla en mysql y almacenar dicha info alli, para la cuestion de encriptado, puedes usar la funcion md5() esta funcion debuelve el hash de una cadena de texto, por lo que:
$clave = "miclave";
$clavemd5 = md5($clave);
echo $clavemd5; //imprime: 3d3232b2f031f070d9ba5969b87776ff

asi "miclave" encriptada con md5() seria: 3d3232b2f031f070d9ba5969b87776ff
deves tomar en cuenta que las cadenas encriptadas con dicha funcion no son desencriptables por lo que a la hora de autentificar deberas encriptar la clave enviada para hacer la comparacion.

Código PHP:
$archivo file("$id.txt");
$passvalido chop($archivo[0]);
$pass $_POST["password"];
if(
md5($pass) == $passvalido){
  
//aqui las sentencias si es valido el password

  #7 (permalink)  
Antiguo 21/06/2004, 14:51
 
Fecha de Ingreso: octubre-2003
Ubicación: Villava [NA]
Mensajes: 13
Antigüedad: 20 años, 6 meses
Puntos: 0
Como expliqué en el primer mensaje, hago todo esto porque en mi hosting no puedo usar MySQL. Bueno, sí que puedo, pero tengo que pagar 20 euros anuales -a sumar a los 30 que ya pago por dominio y hosting ilimitado-, cosa complicada con mi "sueldo" de estudiante...

Gracias por presentarme la función md5(). Por lo que he leído, es casi imposible recuperar el contenido "original" a partir de una cadena encriptada, por lo que, aunque alguien acceda al archivo txt que contiene la contraseña encriptada, poco podrá hacer con ella.

De paso, he decidido separar en un archivo la contraseña encriptada y en otro el resto de datos de los usuarios para evitar que se vea la relación usuario-contraseña. También pienso nombrar los ficheros que contienen las contraseñas con el nick del usuario encriptado de modo que queden como "usuarioencriptado.txt" y su contenido sea "contraseñaencriptada", de modo que la relación usuario/contraseña quede completamente oculta hasta para mí y el filtro de acceso compare como tú proponías la coincidencia de ambos datos.

Nusé, son proyectos. Si os parece que, con todo, va a ser muy inseguro, me pensaré lo de pagar por la base de datos, pero sólo quiero hacer este módulo de autentificación para que mis visitantes (veintipocos amigos míos) creen y editen ellos mismos su "perfil personal".

Estoy encontrando muy útil esta función de encriptado, muchísimas gracias !!!
  #8 (permalink)  
Antiguo 21/06/2004, 15:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si vas a guardar archivos con tus contraseñas "planas o encritadas" en tu sitio (hosting) .. lo ideal es que el archivo en sí de "contraseñas/usuario" lo dejes FUERA del "DOCUMENT_ROOT" . .es decir; si tienes el típico "public_html" (directorio) y directorio por encima de el .. sube tu "password.txt" a un directorio que esté fuerea del alcance de "public_html" que equivale a: todo lo que pongas ahí será accedido por http://www.tal.tal/password.txt y .. dependiendo de que si usas MD5() u otro sistema de encriptación lo veran mas claro o no tan claro. A su vez eso lo puedes acompañar de un .htacces (si tu hosting te lo permite) para limitar el acceso a ciertos archivos desde el URL.

En cuanto a PHP tan sólo tendrías que indicar la ruta absoluta al archivo para abrirlo en tu fopen() o file() o funciones que uses y PHP lo leerá sin problemas.

Un saludo,
  #9 (permalink)  
Antiguo 21/06/2004, 15:11
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
hola que tal, pues si quieres yo te ofresco una base de datos en el servidor que tengo contratado, no se si puedas hacer la coneccion a la base de datos desde tu servidor de hosting, o si quieres cambiarte a mi servidor yo te podria dar espacio y una cuenta ftp para que subas tus archivos. bueno nos vemos.
  #10 (permalink)  
Antiguo 21/06/2004, 16:02
 
Fecha de Ingreso: octubre-2003
Ubicación: Villava [NA]
Mensajes: 13
Antigüedad: 20 años, 6 meses
Puntos: 0
Gracias, Cluster; no puedo sacar los archivos de la raíz, pero estableceré el CHMOD a 700 (leer/escribir/ejecutar sólo por parte del propietario) en la carpeta donde aloje los passwords y probaré lo del .htaccess, aunque no sé si mi hosting lo soportará.

Y muchas gracias por el ofrecimiento a xcorpion, pero como no sé casi nada de bases de datos y todavía me quedan unos meses de contrato con aruba.it, creo que seguiré como estoy. Eso sí, he estado viendo las ofertas de zuperhosting.com y son realmente atractivas. Cuando tenga que renovar el contrato me lo pensaré antes de seguir sin MySQL ;D
  #11 (permalink)  
Antiguo 21/06/2004, 16:10
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
ok pero recuerda que a veces lo varato sale caro, yo en lo personal no te recomiendo ese servidor, tengo una mala experiencia con ellos. No sacrifiques profecionalismo por ahorrarte dinero.
  #12 (permalink)  
Antiguo 21/06/2004, 17:31
Avatar de Gerald  
Fecha de Ingreso: julio-2003
Mensajes: 1.356
Antigüedad: 20 años, 9 meses
Puntos: 2
A ver si te sirve usa la misma tecnica del identificador de cluster
http://tribunalibre.gratishost.com/i...p?page=scripts
__________________
Solo por Hoy: Trataré de fortalecer mi mente. Estudiaré y aprenderé algo útil
Hoteldipity
Arte Caracol
  #13 (permalink)  
Antiguo 23/06/2004, 10:35
 
Fecha de Ingreso: octubre-2003
Ubicación: Villava [NA]
Mensajes: 13
Antigüedad: 20 años, 6 meses
Puntos: 0
Menudo sript, hace justo lo que estoy intentado hacer yo ! Gracias, Gerald ;D
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 11:41.