Domanda

Sto cercando di utilizzare di base autenticazione HTTP e seguito l'esempio sulla pagina di manuale PHP. Ma non funziona per me. Il $_SERVER['PHP_AUTH_USER'] variabile non sembra essere set. Quando un utente tenta di accedere a, all'utente viene richiesto whith un nuovo account di accesso-finestra. Il server è in esecuzione PHP 5.3.3 e ho cercato con Google Chrome e Internet Explorer.

Questa è la semplice esempio che ho usato:

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

Cosa c'è di sbagliato? Come posso utilizzare l'autenticazione HTTP di base in PHP?

È stato utile?

Soluzione

Come si PHP in esecuzione? Se tramite Apache mod_cgi, temo non si può entrare in possesso delle informazioni di autenticazione a tutti. Apache non passerà ad applicazioni CGI a meno che non si compila con la bandiera SECURITY_HOLE_PASS_AUTHORIZATION. (Che in realtà è un buco di sicurezza o no dipende dal fatto che gli altri utenti sul server hanno un privilegio minore o maggiore di utenti web.)

Se è IIS CGI, è necessario assicurarsi che solo ‘anonimo’ accesso alle directory è configurato, o IIS cercherà di intervenire e autenticarsi credenziali.

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

HTML-iniezione (beh, se ha funzionato). Usa htmlspecialchars(). L'uomo, è la pagina doc PHP pieno di consigli e codice altamente discutibile.

Si può provare a guardare $_SERVER['HTTP_AUTHORIZATION'] e, anche se ho il sospetto che sia la questione mod_cgi nel qual caso non variabile sarà presente e si dovrà ricorrere al login basata su cookie, invece. O passare a un host con un approccio più moderno di hosting PHP, come FastCGI o mod_php.

Altri suggerimenti

Prova questo ::

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

Per PHP-CGI:

in .htaccess aggiungere questo:

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

e all'inizio del vostro script aggiungere questo:

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

Credo che i metodi di PHP si basano su autenticazione di base viene configurato sul server Web. Un modo semplice per farlo è quello di includere un file .htaccess nella directory che si desidera attivare l'autenticazione di base per.

La maggior parte dei web host UNIX-based ti permettono di fare questo semplicemente caricando il file. Un file separato (chiamare questo .htauth) terrà gli account di accesso utente che sono autorizzati ad accedere al sito o directory.

Controlla se hai overrided tua and$_SERVER[‘PHP_AUTH_USER’] $_SERVER[‘PHP_AUTH_PW’] variabile prima il luogo in cui si sta tentando di accedere alle entrambe le variabili.

Se sopra non è il caso, allora chek se si utilizza PHP come cgi mod o meno. Se si utilizza PHP come cgi mod poi nella maggior parte dei casi non sarà possibile ottenere $_SERVER[‘PHP_AUTH_USER’] and$_SERVER[‘PHP_AUTH_PW’] perché generraly non compilare l'apache con l'opzione SECURITY_HOLE_PASS_AUTHORIZATION Quindi, se si vuole ottenere sia variabile poi ri-compilare Apache con l'opzione SECURITY_HOLE_PASS_AUTHORIZATION oppure è possibile utilizzare l'approccio .htaccess spiegato nel PHP di base auth posta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top