Come posso utilizzare l'autenticazione HTTP di base in PHP?
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?
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.