9

J'essaye d'employer Basic HTTP Authentication et ai suivi l'exemple sur la page de manuel de PHP. Mais ça ne marche pas pour moi. La variable $_SERVER['PHP_AUTH_USER'] ne semble pas être définie. Lorsqu'un utilisateur essaie de se connecter, l'utilisateur est invité avec une nouvelle boîte de dialogue de connexion. Le serveur fonctionne sous PHP 5.3.3 et j'ai essayé avec Google Chrome et Internet Explorer.Comment puis-je utiliser l'authentification HTTP de base en PHP?

Voici l'exemple simple que je:

<?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 puis-je utiliser l'authentification HTTP de base en PHP?

+0

Plutôt que d'essayer de le faire avec PHP, pourquoi n'utilisez-vous pas le serveur web, par exemple http://httpd.apache.org/docs/2.2/howto/auth.html – Phil

+1

@James: Je pense que mon web l'hôte utilise Apache. – Jonas

+1

@Phil: Alors mon code PHP sera-t-il dépendant de mon serveur web, et je ne peux pas changer easyli vers un autre serveur web. Je voudrais suivre la norme HTTP. – Jonas

Répondre

8

Comment fonctionne PHP? Si c'est par Apache mod_cgi, je crains que vous ne puissiez pas obtenir les informations d'authentification du tout. Apache ne le transmettra pas aux applications CGI à moins que vous ne le compiliez avec l'indicateur SECURITY_HOLE_PASS_AUTHORIZATION. (Qu'il s'agisse d'un trou de sécurité ou non dépend si les autres utilisateurs de votre serveur ont un privilège inférieur ou supérieur à celui de vos utilisateurs de site Web.)

S'il s'agit d'IIS CGI, vous devez vous assurer que seul l'accès au répertoire 'Anonyme' est configuré, ou IIS essaiera d'intervenir et d'authentifier les informations d'identification lui-même.

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

trou de sécurité d'injection HTML (bien, si cela a fonctionné). Utilisez htmlspecialchars(). Man, est cette page de doc PHP pleine de conseil et de code hautement discutable.

Vous pouvez également essayer de regarder $_SERVER['HTTP_AUTHORIZATION'], bien que je soupçonne que c'est le problème de mod_cgi auquel cas aucune variable ne sera présente et vous devrez recourir à un login basé sur les cookies. Ou passez à un hôte avec une approche plus moderne de l'hébergement PHP, comme FastCGI ou mod_php.

0

Je pense que les méthodes PHP reposent sur la configuration de l'authentification de base sur le serveur Web. Un moyen facile de faire ceci est d'inclure un fichier .htaccess dans le répertoire pour lequel vous voulez activer l'authentification de base.

La plupart des hébergeurs basés sur Unix vous permettent de le faire en téléchargeant simplement ce fichier. Un fichier séparé (appelez ceci .htauth) contiendra les connexions utilisateur autorisées à accéder au site ou au répertoire.

+1

C'est incorrect. PHP peut contrôler complètement les en-têtes envoyés au client (navigateur). – Phil

+0

@phil pas vrai. Apache envoie toujours un en-tête "Server:" et PHP ne peut pas empêcher cela. –

4

Try this ::

<?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

Pour PHP-CGI: en .htaccess

ajouter ceci:

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

et au début de votre script ajouter ceci:

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

Que 'substr()' est suspect. Je casserais d'abord la chaîne au premier espace et m'assurerais que le type d'authentification est bien réglé sur 'Basic' (cas ignorant). Ensuite, récupérez la deuxième partie et décodez-la. –

0

Vérifiez si vous vous êtes dérogé r variable $_SERVER[‘PHP_AUTH_USER’] et $_SERVER[‘PHP_AUTH_PW’] avant l'endroit où vous essayez d'accéder aux deux variables.

Si ce n'est pas le cas, alors vérifiez si vous utilisez php comme mod de cgi ou non. Si vous utilisez php comme mod cgi alors dans la plupart des cas vous n'obtiendrez paset $_SERVER[‘PHP_AUTH_PW’] parce que nous ne compilerons pas l'apache avec l'option SECURITY_HOLE_PASS_AUTHORIZATION Donc si vous voulez obtenir les deux variables, recompilez apache avec l'option SECURITY_HOLE_PASS_AUTHORIZATION ou vous pouvez utiliser l'approche .htaccess expliqué dans PHP basic auth post.