J'essaie d'utiliser Authentification HTTP de base et de suivre l'exemple de la page de manuel PHP. Mais ça ne marche pas pour moi. La variable $_SERVER['PHP_AUTH_USER']
ne semble pas être définie. Lorsqu'un utilisateur tente de se connecter, il est invité à ouvrir une nouvelle boîte de dialogue de connexion. Le serveur exécute PHP 5.3.3 et j'ai essayé avec Google Chrome et Internet Explorer.
Voici l'exemple simple que j'ai utilisé:
<?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>";
}
?>
Qu'est-ce qui ne va pas? Comment utiliser l'authentification HTTP de base en PHP?
Comment est exécuté PHP? Si c'est via Apache mod_cgi, j'ai bien peur que vous n'ayez pas accès aux informations d'authentification. Apache ne le transmettra pas aux applications CGI sauf si vous le compilez avec l'indicateur SECURITY_HOLE_PASS_AUTHORIZATION
. (Qu'il s'agisse d'une faille de sécurité ou non, cela dépend si les autres utilisateurs de votre serveur disposent d'un privilège inférieur ou supérieur aux utilisateurs de votre site Web.)
Si c’est IIS CGI, vous devez vous assurer que seul l’accès au répertoire «anonyme» est configuré, sinon IIS tentera d’intervenir et de s’authentifier lui-même.
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
Trou de sécurité d'injection HTML (si cela a fonctionné). Utilisez htmlspecialchars()
. Man, est-ce que cette page PHP doc regorge de conseils et de codes très discutables.
Vous pouvez également essayer de regarder $_SERVER['HTTP_AUTHORIZATION']
, bien que je soupçonne qu'il s'agisse du problème mod_cgi, auquel cas aucune variable ne sera présente et vous devrez vous connecter à l'aide d'un cookie. Ou passez à un hôte avec une approche plus moderne de PHP l'hébergement, tel que FastCGI ou mod_php.
Pour PHP-CGI:
dans .htaccess ajouter ceci:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>
et au début de votre script, ajoutez ceci:
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Essaye ça::
<?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");
}
?>
Je pense que les méthodes PHP reposent sur la configuration de l'authentification de base sur le serveur Web. Une méthode simple consiste à inclure un fichier .htaccess dans le répertoire pour lequel vous souhaitez activer l'authentification de base.
La plupart des hébergeurs Web basés sur Unix vous permettent de le faire en téléchargeant simplement ce fichier. Un fichier séparé (appelez this .htauth) détiendra les identifiants de connexion autorisés à accéder au site ou au répertoire.
Vérifiez si vous avez remplacé vos variables $_SERVER[‘PHP_AUTH_USER’]
et$_SERVER[‘PHP_AUTH_PW’]
avant l'endroit où vous essayez d'accéder aux deux variables.
Si ce qui précède n’est pas le cas, vérifiez si vous utilisez php en tant que mod cgi ou non. SI vous utilisez php en tant que mod cgi, dans la plupart des cas, vous n'obtiendrez pas $_SERVER[‘PHP_AUTH_USER’]
et$_SERVER[‘PHP_AUTH_PW’]
car nous ne compilons pas Apache avec l'option SECURITY_HOLE_PASS_AUTHORIZATION
Donc, si vous voulez obtenir les deux variables, recompilez Apache avec option SECURITY_HOLE_PASS_AUTHORIZATION ou vous pouvez utiliser l’approche .htaccess expliquée dans PHP auth de base post.