Pregunta

Estoy tratando de utilizar básico de autenticación HTTP y seguido el ejemplo de la PHP página del manual. Pero no funciona para mí. El $_SERVER['PHP_AUTH_USER'] variable no parece ser conjunto. Cuando un intento usuario iniciar la sesión, se pide al usuario un poco con un nuevo inicio de sesión de diálogo. El servidor ejecuta PHP 5.3.3 y he tratado con Google Chrome e Internet Explorer.

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>";
}
?>

Lo que está mal? ¿Cómo puedo utilizar la autenticación básica HTTP en PHP?

¿Fue útil?

Solución

¿Cómo se está ejecutando PHP? Si es a través mod_cgi Apache, me temo que no se puede controlar la información de autenticación en absoluto. Apache no pasará a aplicaciones CGI menos que se compila con la bandera 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 IIS CGI, usted tiene que asegurarse de que sólo el acceso a directorios ‘Anónimo’ está configurado, o IIS tratará de paso en sí mismo y las credenciales de autenticación.

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

HTML-inyección (bueno, si funcionaba). Uso htmlspecialchars(). Hombre, es que la página PHP doc lleno de consejos muy cuestionable y el código.

Se puede tratar de ver $_SERVER['HTTP_AUTHORIZATION'] también, aunque sospecho que es el tema mod_cgi en cuyo caso ni variables estarán presentes y tendrán que recurrir al inicio de sesión basada en cookies en su lugar. O el cambio a otro servidor con un enfoque más moderno a PHP de alojamiento, tales como FastCGI o mod_php.

Otros consejos

Probar ::

<?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");
    }
?>

Para PHP-CGI:

.htaccess en 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)));

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

servidores web basados ??en UNIX La mayoría le permiten hacer esto simplemente cargándolo. Un archivo separado (llamar a este .htauth) llevará a cabo los inicios de sesión de usuario que tienen permiso para acceder al sitio o directorio.

Compruebe si ha overrided su and$_SERVER[‘PHP_AUTH_USER’] $_SERVER[‘PHP_AUTH_PW’] variable antes del lugar donde está intentando acceder a las dos variables.

Si arriba no es el caso, entonces chek si está usando PHP como CGI o no mod. Si está usando PHP como CGI mod entonces en la mayoría de casos no se va a and$_SERVER[‘PHP_AUTH_USER’] $_SERVER[‘PHP_AUTH_PW’] porque generraly no compilar el Apache con opción SECURITY_HOLE_PASS_AUTHORIZATION Así que si usted desea conseguir tanto la variable continuación, volver a compilar Apache con opción SECURITY_HOLE_PASS_AUTHORIZATION o se puede utilizar el enfoque de .htaccess explica en PHP básico auth poste.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top