Foros del Web » Programando para Internet » PHP »

Autentificar propio

Estas en el tema de Autentificar propio en el foro de PHP en Foros del Web. Compañeros(as) Estoy tratando de hacer un script propio que autetifique el usuario, para eso he buscado material que pueda guiarme pero la cosa es que ...
  #1 (permalink)  
Antiguo 19/07/2006, 16:01
 
Fecha de Ingreso: marzo-2004
Ubicación: Chile
Mensajes: 382
Antigüedad: 13 años, 8 meses
Puntos: 0
Autentificar propio

Compañeros(as)

Estoy tratando de hacer un script propio que autetifique el usuario, para eso he buscado material que pueda guiarme pero la cosa es que no me resulta en la pagina principal donde tengo el formulario que pide nombre de usuario y password no me hace nada, ademas tengo una serie de dudas con respecto al header y redirect les dejo el codigo.
Ademas ya cree la base de datos.

$host="localhost";
$usuario="root";
$pass="";
$nombre_base_datos="usuarios-web";

$conexion=mysql_connect($host,$usuario,$pass);

mysql_select_db($nombre_base_datos,$conexion);

$ssql = "SELECT * FROM usuario WHERE nombre_usuario='$usuario' and pass='$password'";
$rs = mysql_query($ssql,$conexion);

//vemos si el usuario y contraseña es váildo
//si la ejecución de la sentencia SQL nos da algún resultado
//es que si que existe esa conbinación usuario/contraseña
if (mysql_num_rows($rs)!=0)
{
session_start();
session_register("autentificado");
$autentificado = "SI";
//aca como redirecionaria... segun lo que investigue con el header pero no me resulta
}
else
{
//si no existe le mando otra vez a la portada, pero como la envio nuevamnet a la portada
}

mysql_free_result($rs);
mysql_close($conexion);

?>


aca esta el formulario:

<form name="login" method="post" action="index.php">
<table width="216" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="72">Usuario:</td>
<td width="144"><input name="usuario" type="text" id="usuario"></td>
</tr>
<tr>
<td>Password:</td>
<td><input name="password" type="password" id="password"></td>
</tr>
<tr align="center">
<td colspan="2"><input name="enviar" type="submit" id="enviar" value="Enviar"></td>
</tr>
</table>
</form>


Todo este codigo esta en la misma pagina...

pense que era mas facil esto, tambien pense que resultaria a la primera, en fin ojala que puedan ayudarme nuevamente ya que quiero hacer mi pripio script y ver cuales son las falecias de lo que hago.


de antemano se agradece
  #2 (permalink)  
Antiguo 19/07/2006, 16:21
Avatar de JAK^  
Fecha de Ingreso: octubre-2005
Ubicación: ^^CaMiNiTo Al CoSTaDo DeL
Mensajes: 850
Antigüedad: 12 años, 1 mes
Puntos: 4
hola mira:

primero yo tendria en un archivo aparte los datos de coneccion

archivo "conec.inc"
Código PHP:
$host="localhost";
$usuario="root"
$pass="";
$nombre_base_datos="usuarios-web";

$conexion=mysql_connect($host,$usuario,$pass);

mysql_select_db($nombre_base_datos,$conexion); 
de esta manera puedo incluirlo cada vez que lo necesite y si tengo ke kambiar algun dato cambio un solo archivo, para incluirlo usas include("conec.inc")

segundo pon en archivos separados el form y por otro lado el ke se encargue del login

form.php

Código PHP:

...
<
body>
...
<
form name="login" method="post" action="index.php"
<
table width="216" border="0" align="center" cellpadding="0" cellspacing="0"
<
tr
<
td width="72">Usuario:</td
<
td width="144"><input name="usuario" type="text" id="usuario"></td
</
tr
<
tr
<
td>Password:</td
<
td><input name="password" type="password" id="password"></td
</
tr
<
tr align="center"
<
td colspan="2"><input name="enviar" type="submit" id="enviar" value="Enviar"></td
</
tr
</
table
</
form>
...
</
body>
... 
login.php

Código PHP:
<? session_start(); ?>
<?
//para no tener problemas con cookies deshabilitadas has esto
//con esto desactivamos las cookies y activamos el metodo get para la sesion
ini_set("session.use_cookies","0");
ini_set("session.use_trans_sid","1");

include(
"conec.inc");
$ssql "SELECT * FROM usuario WHERE nombre_usuario='$usuario' and pass='$password'"
$rs mysql_query($ssql,$conexion); 

//vemos si el usuario y contraseña es váildo 
//si la ejecución de la sentencia SQL nos da algún resultado 
//es que si que existe esa conbinación usuario/contraseña 
if (mysql_num_rows($rs)!=0)


$_SESSION["autentificado"]="SI"
 
header ("location: mipagina.....")
exit;
}
else 

header .....
exit;




?>
no uses session register, utiliza $_SESSION es mas seguro, session_start(); tiene ke estar antes de todo, y para ke los header funcionen no debes mandar codigo html antes es decir este script tiene ke tar asi limpio por eso te lo separe del formu... enpieza a investigar con esto si te sale otra duda vuelve por aki


saludos espero te sirva de algo
__________________
hola . . .
  #3 (permalink)  
Antiguo 19/07/2006, 16:36
Avatar de JAK^  
Fecha de Ingreso: octubre-2005
Ubicación: ^^CaMiNiTo Al CoSTaDo DeL
Mensajes: 850
Antigüedad: 12 años, 1 mes
Puntos: 4
perdon me acavo de enterar ke es mejor forzar las cookies

pon

ini_set("session.use_cookies","1");
ini_set("session.use_only_cookies","1");
ini_set("session.use_trans_sid","0");

en ves de


ini_set("session.use_cookies","0");
ini_set("session.use_trans_sid","1");


pd: gracias Cluster por el dato
__________________
hola . . .
  #4 (permalink)  
Antiguo 19/07/2006, 16:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Otro detalle JAK ..

Si tu fuerzas a PHP a que propague el SID en el URL .. vía:

session.use_trans_sid = 1 .. PHP lo que hace es "re-escribir" ciertos tag's HTML (los que se indican en url_rewrite_tags = ... del mismo php.ini) .. Pero, NO lo hace en redirecionamientos como:

PHP y cabeceras: header ("Location ...")
Javascript: window.location, window.open .. ni en nada ..
HTML: Redirecionar bajo <META ..> de tipo "refresh" ...

En esos casos al menos no incrustra el SID automáticamente y es necesario invocarlo a mano en los URL's que se apuntan:

ejemplo:

Código PHP:
header ("Location: nosedonde.php?".SID); 
(ojo que SID es una constante .. no vá entre comillas!!).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 19/07/2006, 17:23
 
Fecha de Ingreso: marzo-2004
Ubicación: Chile
Mensajes: 382
Antigüedad: 13 años, 8 meses
Puntos: 0
Les agradesco sus respuestas.

Les comento como me fue, tome sus sugerencias tal cual como me las describieron, separe el script de conexion a la base de datos, deje el formulario separado (index.php) y cree otra pagina con el script de longin (login.php) y por ultimo cree una pagina que reciba la autentificacion correcta(segura.php)

Me arroja un error que segun lo que entiendo es de sintaxis:

Parse error: syntax error, unexpected T_EXIT in c:\appserv\www\autentificar\login.php on line 31

La linea que me indica es donde estan los header:

header ("location: segura.php?".SID)


De todas formas les dejo todo lo que es codigo.

Código PHP:
<body>
<
table width="900" height="94" border="1">
  <
tr>
    <
th width="246" scope="col"><p>&nbsp;</p>
      <
table width="246" border="0" align="left" cellpadding="0" cellspacing="0"
<
tr
<
td width="19">
</
td
<
td width="236" rowspan="2"><form name="login" method="post" action="login.php"
<
table width="216" border="0" align="center" cellpadding="0" cellspacing="0"
<
tr
<
td width="72">Usuario:</td
<
td width="144"><input name="usuario" type="text" id="usuario"></td
</
tr
<
tr
<
td>Password:</td
<
td><input name="password" type="password" id="password"></td
</
tr
<
tr align="center"
<
td colspan="2"><input name="enviar" type="submit" id="enviar" value="Enviar"></td
</
tr
</
table
</
form></td
</
tr
 
</
table
</
th>
    <
th width="616" scope="col">&nbsp;</th>
    <
th width="16" scope="col">&nbsp;</th>
  </
tr>
  <
tr>
    <
td>&nbsp;</td>
    <
td>&nbsp;</td>
    <
td>&nbsp;</td>
  </
tr>
  <
tr>
    <
td>&nbsp;</td>
    <
td>&nbsp;</td>
    <
td>&nbsp;</td>
  </
tr>
</
table>
</
body
login.php

Código PHP:
<body>
<? session_start(); ?> 
<? 
//para no tener problemas con cookies deshabilitadas has esto 
//con esto desactivamos las cookies y activamos el metodo get para la sesion 
ini_set("session.use_cookies","1"); 
ini_set("session.use_only_cookies","1"); 
ini_set("session.use_trans_sid","0"); 


include(
"conec.inc"); 
$ssql "SELECT * FROM usuario WHERE nombre_usuario='$usuario' and pass='$password'";  
$rs mysql_query($ssql,$conexion);  

//vemos si el usuario y contraseña es váildo  
//si la ejecución de la sentencia SQL nos da algún resultado  
//es que si que existe esa conbinación usuario/contraseña  
if (mysql_num_rows($rs)!=0
{  
    
$_SESSION["autentificado"]="SI";  
     
header ("location: segura.php?".SID


    exit; 

else  
{  
    
header ("location:index.php?".SID)
    exit; 
}  
?> 
</body>


segura.php

<body>
<?php  
session_start
(); 
if(!empty(
$_SESSION['autentificado']))

    
/* La funcion empty() devuelve verdadero si el argumento posee un valor vacio, 
    al usar !empty() devuelve verdadero no solo si la variable fue declarada sino  
    ademas si contiene algun valor no nulo. 
    */ 
    
echo 'Te haz logueado como :'.$_SESSION['usuario']; 
    echo 
'Haz logrado el acceso a una pagina segura'
}
else

    echo 
'No estas logueado<br>'
    echo 
'Esta pagina es restringida!'

?> 

</body>
Ojala que segura.php este buena.

espero que me puedan seguir ayudando ya que nose me ocurre donde puede estar el error y no entiendo mucho eso de los header.

se agradece nuevamente.

Última edición por Cluster; 20/07/2006 a las 07:46
  #6 (permalink)  
Antiguo 19/07/2006, 19:05
 
Fecha de Ingreso: marzo-2004
Ubicación: Chile
Mensajes: 382
Antigüedad: 13 años, 8 meses
Puntos: 0
alguna idea......de como resolver esto
  #7 (permalink)  
Antiguo 20/07/2006, 08:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por juan007
alguna idea......de como resolver esto
** Al header() le falta el ; final ..

** Todo esto:
//para no tener problemas con cookies deshabilitadas has esto
//con esto desactivamos las cookies y activamos el metodo get para la sesion
ini_set("session.use_cookies","1");
ini_set("session.use_only_cookies","1");
ini_set("session.use_trans_sid","0");

va antes de session_start();

** Y a su vez session_start() va antes de cualquier HTML que tengas por médio .. NO pienses que estás metiendo PHP por médio de HTML sino que con PHP estás "generando" el HTML que resultará finalmente .. ese detalle de "concepto" aclara muchos problemas típicos de orden de llamada de ciertas funciones.

Esto es aplicable a tu segura.php y a todo script! no tiene sentido si te fijas bien validar una variable de sesión y redireccionar metiendo HTML en ese script. El objetivo de ese script es decidir si pasa tal cosa (validación) cambiarte a otra página .. (redireccionar) por ende -nunca- se llegaría a interpretar ese HTML por delante de funciones com header() (de tipo: "location")...


Un saludo,

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 20/07/2006, 09:02
 
Fecha de Ingreso: marzo-2004
Ubicación: Chile
Mensajes: 382
Antigüedad: 13 años, 8 meses
Puntos: 0
Gracias nuevamente por tu respuesta ya estaba desesperando buscando una solucion, te cuento lo que hice segun lo que entendi.

Borre todo lo que era html de ambas paginas de login.php y de segura.php, tomando encuenta tu sugerencia del session_start() que iba antes de cualquier html.

Ahora la pagina no muestra ningun error, pero tampoco muestra si el usuario esta o no en la base de datos osea se queda simpre en el index, no muestra el mensaje que deberia aparecer en la pagina segura.php:

echo 'Te haz logueado como :'.$_SESSION['usuario'];

nose que pasa que no puedo resolver esto, me da impotencia depender de la ayuda, espero no aburrir tu paciencia.

Gracias
  #9 (permalink)  
Antiguo 20/07/2006, 09:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por juan007
Gracias nuevamente por tu respuesta ya estaba desesperando buscando una solucion, te cuento lo que hice segun lo que entendi.

Borre todo lo que era html de ambas paginas de login.php y de segura.php, tomando encuenta tu sugerencia del session_start() que iba antes de cualquier html.

Ahora la pagina no muestra ningun error, pero tampoco muestra si el usuario esta o no en la base de datos osea se queda simpre en el index, no muestra el mensaje que deberia aparecer en la pagina segura.php:

echo 'Te haz logueado como :'.$_SESSION['usuario'];

nose que pasa que no puedo resolver esto, me da impotencia depender de la ayuda, espero no aburrir tu paciencia.

Gracias
Como andas "ordenando" código .. lo mejor es que indiques como te quedó el código (todos) tras tus cambios .. por si hay algo que no pusistes en su lugar por ejemplo.

Luego ya vendrán revisiones sobre la sesión y la propagación del SID por si está fallando esta.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 20/07/2006, 10:00
 
Fecha de Ingreso: marzo-2004
Ubicación: Chile
Mensajes: 382
Antigüedad: 13 años, 8 meses
Puntos: 0
Funciono...pero Con Algunos Errores

Cluster.

Funciono a medias el script te cuento que era un error mio, que no apereciera nada era problemas con una variable al conectar a la base de datos.

Funciona a medias ya que entro a la pagina segura y me arroja el mensaje:

Te haz logueado como :Haz logrado el acceso a una pagina segura

Pero si te das cuenta no aparece el nombre del usuario y otra cosa si yo digito un usuario que no esta en la base de datos deberia mostrar en el navegador

No estas logueado
Esta pagina es restringida.

supongo que no debe ser por problemas de comillas simples o dobles.

Te dejo los dos script

login.php

Código PHP:
<? 
//para no tener problemas con cookies deshabilitadas has esto  
//con esto desactivamos las cookies y activamos el metodo get para la sesion  
ini_set("session.use_cookies","1"); 
ini_set("session.use_only_cookies","1"); 
ini_set("session.use_trans_sid","0"); 
session_start(); ?>  
<?  
include("conec.inc.php");  
$conex Conectarse();
$ssql "SELECT * FROM usuario WHERE nombre_usuario='$usuario' and pass='$password'";   
$rs mysql_query($ssql,$conex)or die ("error");

//vemos si el usuario y contraseña es váildo   
//si la ejecución de la sentencia SQL nos da algún resultado   
//es que si que existe esa conbinación usuario/contraseña   
if (mysql_num_rows($rs)!=0)  
{   
    
$_SESSION["autentificado"]="SI";   
     
header("location: segura.php?".SID); 
    exit;  
}  
else   
{   
    
header ("location:index.php?".SID); 
    exit;  
}   
?>
segura.php

Código PHP:
<?php  
session_start
(); 
if(!empty(
$_SESSION['autentificado']))

    
/* La funcion empty() devuelve verdadero si el argumento posee un valor vacio, 
    al usar !empty() devuelve verdadero no solo si la variable fue declarada sino  
    ademas si contiene algun valor no nulo. 
    */ 
    
echo 'Te haz logueado como :'.$_SESSION['usuario']; 
    echo 
'Haz logrado el acceso a una pagina segura'
}
else

    echo 
'No estas logueado<br>'
    echo 
'Esta pagina es restringida!'

?>
por si las dudas te dejo el script de conexion a la base de datos:

Código PHP:
<?php
function Conectarse()
{
$host="localhost"

$nombre_base_datos="usuarios-web";  

$usuario="root"// Nombre del usuario con permisos para acceder

$pass="";  // Contraseña de dicho usuario


// Ahora estamos realizando una conexión y la llamamos ‘$conexion’

$conexion=mysql_connect($host$usuario$pass) or die ("Error conectando a la base de datos.");


// Seleccionamos la base de datos que nos interesa

mysql_select_db($nombre_base_datos ,$conexion) or die("Error seleccionando la base de datos."); 


// Devolvemos $conexion porque nos hará falta más adelante, cuando queramos hacer consultas.
return $conexion;
}
?>

Espero haberme explicado bien y mil gracias por el interes de ayudarme y sobre todo la paciencia.

Saludos

Última edición por Cluster; 20/07/2006 a las 10:15
  #11 (permalink)  
Antiguo 20/07/2006, 10:20
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si te fijas en tu código no geneas la variable "$_SESSION['usuario']" sólo la de "autentificado" .. que por otro lado NO tiene sentido si lo que te interesa en general es una variable de sesión que poder verificar su existencia y como es tu caso que contenga el nombre del usuario (que lo obtienes de consulta SQL a tu BBDD o del login en sí).

En tu logín .. simplemente define tu variable de sesion "usuario".

Código PHP:
 $_SESSION['usuario']=$usario;    
     
header("location: segura.php");  
    exit; 
Como veras NO propago el SID .. habiamos quedado en que ivamos a propagar el SID en cookies, para eso están esos ini_set() donde "forzamos" a propagar el SID en cookies.

Si así no te llegase a funcionar pero sí con el SID propagado en el URL (con el .SID ..) entonces el problema está en el "cliente" a nivel de aceptación de cookies .. (eso lo veremos si corresponde).

OJO también de donde sale $usuario .. si llega de tu formulario -debes- usar $_POST['usuario'] o el array superglobal que corresponda según el método que uses de envio (GET/POST).

También es recomendable validar ese dato y filtrarlo .. desde un simple trim() hasta un mysql_real_escape_string() aplicado a tu variable en tu sentencia SQL por tu seguridad ...

En tu segura.php ..

Código PHP:
<?php   
session_start
();  
if(!empty(
$_SESSION['usuario'])) 
{  
    
/* La funcion empty() devuelve verdadero si el argumento posee un valor vacio,  
    al usar !empty() devuelve verdadero no solo si la variable fue declarada sino   
    ademas si contiene algun valor no nulo.  
    */  
    
echo 'Te haz logueado como :'.$_SESSION['usuario'];  
    echo 
'Haz logrado el acceso a una pagina segura';  

else 
{  
    echo 
'No estas logueado<br>';  
    echo 
'Esta pagina es restringida!';  
}  
?>
Te fijas que con una variable -sobra- para validar?

(PD: Intenta usar el botón "PHP" cuando coloques código PHP .. se facilita su lectura como veras (ya lo modifiqué yo por ahora ..).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 20/07/2006, 11:14
 
Fecha de Ingreso: marzo-2004
Ubicación: Chile
Mensajes: 382
Antigüedad: 13 años, 8 meses
Puntos: 0
OJO también de donde sale $usuario .. si llega de tu formulario -debes- usar $_POST['usuario'] o el array superglobal que corresponda según el método que uses de envio (GET/POST).

También es recomendable validar ese dato y filtrarlo .. desde un simple trim() hasta un mysql_real_escape_string() aplicado a tu variable en tu sentencia SQL por tu seguridad ...

Bueno te cuento que funciono perfectamente gracias gracias gracias y gracias.

Tu me dices validar la variable $usuario que viene desde el formulario antes de hacer la consulta a la base de datos en login.php.

seria util algo asi, en el login.php

Código PHP:
$usuario trim($_Post['usuario']);

$conex Conectarse();
$ssql "SELECT * FROM usuario WHERE nombre_usuario='$usuario' and pass='$password'";   
$rs mysql_query($ssql,$conex)or die ("error"); 
Te cuento que trate de hacer algo mysql_real_escape_string() pero nose como llevarlo a la practica

Esta función escapará todos los caracteres especiales en la cadena_no_escapada, tomando en cuenta el juego de caracteres actual de la conexión, de tal modo que sea seguro usarla con mysql_query().

no logro llevar esta definicion a mi script hacerlo real.

Nuevamente gracias por tu ayuda y sugerencias
  #13 (permalink)  
Antiguo 20/07/2006, 11:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Podrías aplicarlo aquí:

Código PHP:
$usuario trim(mysql_real_escape_string($_Post['usuario'])); 
ó aquí:
Código PHP:
$ssql "SELECT * FROM usuario WHERE nombre_usuario='".mysql_real_escape_string($usuario)."' and pass='$password'"
(usalo en el resto de variables que generan una consulta SQL por seguridad).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #14 (permalink)  
Antiguo 20/07/2006, 12:00
 
Fecha de Ingreso: marzo-2004
Ubicación: Chile
Mensajes: 382
Antigüedad: 13 años, 8 meses
Puntos: 0
cluster.

De esta forma deberia quedar, y deberia ir en el script login.php, si te fijas comente $usuario=$_POST['usuario']; y tome tu sugerencia.

Código PHP:
include("conec.inc.php");
//$usuario=$_POST['usuario'];
$usuario trim(mysql_real_escape_string($_Post['usuario'])); 
$conex Conectarse();
$ssql "SELECT * FROM usuario WHERE nombre_usuario='$usuario' and pass='$password'";   
$rs mysql_query($ssql,$conex)or die ("error");
if (
mysql_num_rows($rs)!=0)  
{   
    
$_SESSION['usuario']=$usuario;     
     
header("location: segura.php?".SID); 
    exit;  
}  
else   
{   
    
header ("location:index.php?".SID); 
    exit;  
}   
?> 
si esta correcto la modificacion del script el resultado es que no me arroja nada nuevamente pero me di cuenta que la direccion del navegador me arroja la siguiente direccion:

http://localhost/Autentificar/index....78408d6ffc4e08

creoo que tiene que ver algo con las sesiones.

Te dejo el form por si acaso:

Código HTML:
<form name="login" method="post" action="login.php">  
<table width="216" border="0" align="center" cellpadding="0" cellspacing="0">  
<tr>  
<td width="72">Usuario:</td>  
<td width="144"><input name="usuario" type="text" id="usuario"></td>  
</tr>  
<tr>  
<td>Password:</td>  
<td><input name="password" type="password" id="password"></td>  
</tr>  
<tr align="center">  
<td colspan="2"><input name="enviar" type="submit" id="enviar" value="Enviar"></td>  
</tr>  
</table>  
</form> 
QUE TERRIBLE EN UN RATO FUNCIONA Y A LOS MINUTOS YA NO FUNCIONA.

GRACIAS.
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 15:26.