9

Estoy tratando de usar Basic HTTP Authentication y seguí el ejemplo en la página del manual de PHP. Pero no funciona para mí. La variable $_SERVER['PHP_AUTH_USER'] no parece estar configurada. Cuando un usuario intenta iniciar sesión, el usuario recibe un nuevo cuadro de diálogo de inicio de sesión. El servidor ejecuta PHP 5.3.3 y lo he intentado con Google Chrome e Internet Explorer.¿Cómo puedo usar la Autenticación HTTP básica en PHP?

Aquí está el ejemplo sencillo que he utilizado:

<?php 
if (!isset($_SERVER['PHP_AUTH_USER'])) { 
    header('WWW-Authenticate: Basic realm="Jonas Realm"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo 'User pressed Cancel'; 
    exit; 
} else { 
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"; 
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as you password.</p>"; 
} 
?> 

Cuál es el problema? ¿Cómo puedo usar la Autenticación HTTP básica en PHP?

+0

En lugar de tratar de hacer esto con PHP, ¿por qué no utiliza el servidor web, por ejemplo, http://httpd.apache.org/docs/2.2/howto/auth.html – Phil

+1

@James: Creo que mi web el host usa Apache – Jonas

+1

@Phil: Entonces mi código PHP será dependiente de mi servidor web, y no puedo cambiar fácilmente a otro servidor web. Me gustaría seguir el estándar HTTP. – Jonas

Respuesta

8

¿Cómo se ejecuta PHP? Si es a través de Apache mod_cgi, me temo que no puedes obtener la información de autenticación en absoluto. Apache no lo pasará a las aplicaciones CGI a menos que lo compile con el indicador SECURITY_HOLE_PASS_AUTHORIZATION. (Ya sea en realidad un agujero de seguridad o no depende de si otros usuarios en el servidor tienen un privilegio menor o mayor que los usuarios del sitio web.)

Si se trata de CGI IIS, usted tiene que asegurarse de que sólo el acceso a directorios 'Anonymous' es configurado, o IIS intentará ingresar y autenticarse las credenciales.

echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"; 

agujero de seguridad de inyección HTML (bueno, si funcionó). Use htmlspecialchars(). Hombre, esa página de doc PHP está llena de consejos y códigos altamente cuestionables.

También puede intentar ver $_SERVER['HTTP_AUTHORIZATION'], aunque sospecho que es el problema de mod_cgi, en cuyo caso ninguna de las dos variables estará presente y deberá recurrir al inicio de sesión basado en cookies. O cambie a un host con un enfoque más moderno para el alojamiento de PHP, como FastCGI o mod_php.

0

Creo que los métodos PHP se basan en la autenticación básica configurada en el servidor web. Una forma fácil de hacerlo es incluir un archivo .htaccess en el directorio para el que desea habilitar la autenticación básica.

La mayoría de los servidores web basados ​​en Unix le permiten hacer esto simplemente cargando este archivo. Un archivo separado (llamado this .htauth) contendrá los inicios de sesión del usuario que tienen permiso para acceder al sitio o directorio.

+1

Eso es incorrecto. PHP puede controlar completamente los encabezados enviados al cliente (navegador). – Phil

+0

@phil no es cierto. Apache siempre envía un encabezado "Servidor:" y PHP no puede evitar eso. –

4

Prueba esto ::

<?php 
    /* 
    ** Define a couple of functions for 
    ** starting and ending an HTML document 
    */ 
    function startPage() 
    { 
     print("<html>\n"); 
     print("<head>\n"); 
     print("<title>Listing 24-1</title>\n"); 
     print("</head>\n"); 
     print("<body>\n"); 
    } 

    function endPage() 
    { 
     print("</body>\n"); 
     print("</html>\n"); 
    } 
    /* 
    ** test for username/password 
    */ 
    if((isset($_SERVER['PHP_AUTH_USER']) && ($_SERVER['PHP_AUTH_USER'] == "leon")) AND 
     (isset($_SERVER['PHP_AUTH_PW']) && ($_SERVER['PHP_AUTH_PW'] == "secret"))) 
    { 
     startPage(); 

     print("You have logged in successfully!<br>\n"); 

     endPage(); 
    } 
    else 
    { 
     //Send headers to cause a browser to request 
     //username and password from user 
     header("WWW-Authenticate: " . 
      "Basic realm=\"Leon's Protected Area\""); 
     header("HTTP/1.0 401 Unauthorized"); 

     //Show failure text, which browsers usually 
     //show only after several failed attempts 
     print("This page is protected by HTTP " . 
      "Authentication.<br>\nUse <b>leon</b> " . 
      "for the username, and <b>secret</b> " . 
      "for the password.<br>\n"); 
    } 
?> 
7

Para PHP-CGI:

en .htaccess añadir lo siguiente:

<IfModule mod_rewrite.c> 
RewriteEngine on 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 
</IfModule> 

y al comienzo de su script añadir lo siguiente:

list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); 
+0

Ese 'substr()' es sospechoso. Primero rompería la cadena en el primer espacio y me aseguraré de que el tipo de autenticación esté establecido en 'Básico' (ignorando el caso). Luego toma la segunda parte y descodifica. –

0

Comprueba si te has sobrescrito r variable $_SERVER[‘PHP_AUTH_USER’] y $_SERVER[‘PHP_AUTH_PW’] antes del lugar donde intenta acceder a ambas variables.

Si arriba no es el caso, entonces chek si está usando php como mod cgi o no. Si está utilizando php como mod cgi, en la mayoría de los casos no obtendrá $_SERVER[‘PHP_AUTH_USER’] y $_SERVER[‘PHP_AUTH_PW’] porque generalmente no compilamos el apache con la opción SECURITY_HOLE_PASS_AUTHORIZATION Entonces, si desea obtener ambas variables, vuelva a compilar apache con la opción SECURITY_HOLE_PASS_AUTHORIZATION o puede usar el enfoque .htaccess explicado en PHP basic auth publicación.

Cuestiones relacionadas