Foros del Web » Programando para Internet » PHP »

Problema con LDAP al pasar de UTF-8 a ISO-8859-1

Estas en el tema de Problema con LDAP al pasar de UTF-8 a ISO-8859-1 en el foro de PHP en Foros del Web. Hola, estoy desarrollando una aplicación web en PHP que para autentificar a los usuarios compara los datos con los que hay en un directorio LDAP. ...
  #1 (permalink)  
Antiguo 15/09/2006, 09:17
Avatar de dayer  
Fecha de Ingreso: febrero-2004
Mensajes: 142
Antigüedad: 20 años, 2 meses
Puntos: 0
Problema con LDAP al pasar de UTF-8 a ISO-8859-1

Hola, estoy desarrollando una aplicación web en PHP que para autentificar a los usuarios compara los datos con los que hay en un directorio LDAP. El directorio LDAP tiene los datos almacenados en UTF-8 y yo estoy empleando el juego de caracteres ISO-8859-1. Mediante el DNI y un password verifico si ese usuario es correcto y obtengo del directorio además su nombre completo, el cual lo almaceno en una variable de sesión para luego emplearlo en diversas páginas de la aplicación.

El problema que tengo es que una vez leo los datos del directorio LDAP, los paso por la función utf8_decode() para pasarlos a ISO-8859-1 pero me los imprime mal, como si no hubiera empleado esa función. He probado yo mismo a pasar una cadena a UTF-8 y lueo decodificarla a ISO-8859-1 y en cambio si me lo hace bien, pero con las cadenas obtenidas del directorio LDAP no me las decodifica.

Tengo el Apache configurado con el juego de caracteres ISO-8859-1, el DTD de los documentos es:
Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> 
y el charset lo modifico con:
Código HTML:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
Por si acaso os pongo los códigos de todo lo que interviene.

zona_registrada.php es la página para identificarse
Código PHP:
<?
  
// No almacenar en el cache del navegador esta página.
        
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                     // Expira en fecha pasada
        
header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");        // Siempre página modificada
        
header("Cache-Control: no-cache, must-revalidate");                   // HTTP/1.1
        
header("Pragma: no-cache");                                           // HTTP/1.0
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Zona Registrada</title>
</head>
<body>
<?
                          
// Mostrar error de Autentificación.
    
$error_login_ms[0]="No se ha podido realizar la comprobación de los datos";
    
$error_login_ms[1]="NIF y/o contrase&ntilde;a incorrectos";
    
$error_login_ms[2]="No tiene permisos para acceder a esta página";
                                                    
                          if (isset(
$_GET['error_login'])){
                              
$error=$_GET['error_login'];
                          echo 
"Error: $error_login_ms[$error]";
                          }
                         
?>
                         
<form action="restringido.php" method="post">
  <p>NIF: 
    <input name="nif" type="text" value="000000000-X">
    <br />
Contrase&ntilde;a: 
<input name="pass" type="password">
</p>
  <p>
    <input type="submit" name="submit" value="Entrar" />
</p>
</form>
</body>
</html
restringido.php se supone que sólo visible si se está correctamente identificado y a la que nos manda el formulario
Código PHP:
<?PHP include("verifica.inc.php"); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>P&aacute;gina con acceso restringido!</title>
</head>
<body>
<p>Acceso Autorizado:</p>
<p>  Nombre de la sesi&oacute;n => <? echo session_name(); ?> <br>
  Usuario ID => <? echo $_SESSION['usuario']; ?><br>
  Email => <? echo $_SESSION['email']; ?><br>
Nombre => <? echo $_SESSION['nombre']; ?><br>
  <br>
  <br>
  <a href="restringido2.php">Otra p&aacute;gina de acceso restringido</a><br>
  <a href="logout.php">Salir zona restringida</a></p>
  <a href="enviar.php">enviar</a></p>
</body>
</html>
verifica.inc.php para asegurarnos de que se está invocando desde el formulario y que comprueba la sesión correcta
Código PHP:
<?PHP
//Variables
$sesion_usuarios "autentificacion";

// chequear pagina que lo llama para devolver errores a dicha página.

$url explode("?",$_SERVER['HTTP_REFERER']);
$pag_referida=$url[0];
$redir=$pag_referida;

// chequear si se llama directo al script.
if ($_SERVER['HTTP_REFERER'] == ""){
die (
"Acceso incorrecto! - No se invoca desde otra pgina");
exit;
}

// Chequeamos si se está AUTENTICANDO un usuario por medio del formulario
if (isset($_POST['nif']) && isset($_POST['pass'])) include("autenticacion.inc.php");

//Si no se está invocando desde el formulario... hay que comprobar que la sesión existe

else{
    
session_name($sesion_usuarios);
    
session_start();
    
    
//Se comprueba si estn creadas las variables de sesin, para evitar que si ya se ha matado funcione la tcnica de "volver atrs" en el navegador.
    
if (!isset($_SESSION['usuario']) && !isset($_SESSION['email']) && !isset($_SESSION['nombre'])){
        
session_destroy();
        die (
"Acceso incorrecto! - Sesión ya cerrada");
        exit;
    }
}
?>
autenticacion.inc.php hace las llamadas a LDAP y crea las variables de sesión
Código PHP:
<?PHP
include("config.php");

//Si es así, concatenamos datos para realizar la conexión
    
$ldap_datos "cn=".$_POST['nif'].",".$ldap_contenedor;

    
// Conexión al directorio LDAP (el flag de fallo creo que no va porque es un servidor de LDAP 2.x.x)
    
$ldap_conexion = @ldap_connect($ldap_host,$ldap_puerto) or die(header ("Location: $redir?error_login=0"));
    
    
// Consulta al LDAP para comprobar datos del usuario
    
if(@$ldap_respuesta ldap_bind($ldap_conexion$ldap_datos$_POST['pass'])){
    
    unset(
$_POST['pass']); //se destruye la contrasea una vez autenticado
    
    
$busqueda ldap_search($ldap_conexion$ldap_contenedor"cn=".$_POST['nif']);
    
$info ldap_get_entries($ldap_conexion$busqueda);
    
$email $info[0]["mail"][0];
    
$nombre ucwords(strtolower(utf8_decode($info[0]["fullname"][0])));

    
    
//Una vez hecha la consulta se cierra la conexin
    
ldap_close($ldap_conexion);
    
        
//Usuario correcto
        
        
session_name($sesion_usuarios);
        
session_start();
        
session_cache_limiter('nocache,private'); //No cachear la pgina
        
$_SESSION['usuario'] = $nif;
        
$_SESSION['email'] = $email;
        
$_SESSION['nombre'] = $nombre;
        
        
//La pagina se llama a así misma para que queden disponibles la variable de sesion en el array asociado $HTTP
        
$pag=$_SERVER['PHP_SELF'];
        
Header ("Location: $pag?");
        exit;
    
    }else{
        
Header ("Location: $redir?error_login=1");
        exit;
        }
?>
config.php contiene parámetros para la consulta LDAP
Código PHP:
<?PHP
############# LDAP
$ldap_host "xxx.xxx.xxx.xxx";
$ldap_puerto xxxx;
$ldap_contenedor "dc=xxxxx,dc=xxxx,dc=xx";
?>

Perdonad si son muchos archivos, pero he intentado explicarme lo mejor posible. No he puesto los enlaces a los que se llama desde restringido.php porque son ya para cerrar la sesión o para acceder a otra páginas protegidas frente a usuarios no identificados.

Un saludo y gracias de antemano
__________________
No Ðejes Para Mañana Monte Que Puedas Escalar Hoy
Cartagena
El Historias
  #2 (permalink)  
Antiguo 15/09/2006, 11:49
Avatar de dayer  
Fecha de Ingreso: febrero-2004
Mensajes: 142
Antigüedad: 20 años, 2 meses
Puntos: 0
SOLUCIONADO. No sé muy bien si era algún exit mal puesto, o alguna modificación errónea de las cabeceras, pero ya me funciona correctamente. Perdón por las molestias
__________________
No Ðejes Para Mañana Monte Que Puedas Escalar Hoy
Cartagena
El Historias
  #3 (permalink)  
Antiguo 15/09/2006, 12:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Cita:
Iniciado por dayer Ver Mensaje
SOLUCIONADO. No sé muy bien si era algún exit mal puesto, o alguna modificación errónea de las cabeceras, pero ya me funciona correctamente. Perdón por las molestias
Me alegro ...

Sobre todo de que uses como base mi "Autentificator" (script) y por la adaptación para uso bajo LDAP.

Te hago una recomendación aprovechando ..

Cita:
// chequear pagina que lo llama para devolver errores a dicha página.

$url = explode("?",$_SERVER['HTTP_REFERER']);
$pag_referida=$url[0];
$redir=$pag_referida;

// chequear si se llama directo al script.
if ($_SERVER['HTTP_REFERER'] == ""){
die ("Acceso incorrecto! - No se invoca desde otra pgina");
exit;
}
No uses esa validación .. Con el tiempo y experiencia de otros usuarios que han usado "Autentificator" he comprobado que más que prestar beneficios esa validación .. dá problemas (no de seguridad), por ejemplo cuando pretendes usar este código en ventanas (window.open ...) por qué no se obtiene la información del "HTTP_REFERER".

Elimina dicho código y deja $redir con el URL del formulario de login que uses y listo ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 04:18.