Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/09/2006, 09:17
Avatar de dayer
dayer
 
Fecha de Ingreso: febrero-2004
Mensajes: 142
Antigüedad: 21 años
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