Skip to main content Help Control Panel

Login   A+   A-

Community «   Le forum «   Machine à café «  

[Réglé] Comment utiliser l'authentification HTTP en PHP chez OVH ?

Pour le développement de YACS nous avons souhaité sécuriser, ou tout du moins, contrôler, l'accès à certains scripts PHP. Malheureusement, les environnements mutualisés d'OVH tournant PHP en mode CGI, il semblait impossible d'accèder aux variables globales nécessaires.

Impossible ? En fait, il existe une façon de contourner le problème. Apprenez vous aussi comment faire pour implémenter le contrôle d'accès dynamique à vos pages chez OVH.
A l'origine, l'objectif était de créer un feed RSS pour surveiller le fonctionnement d'un serveur YACS (voir YACS adds security to RSS syndication). Bien entendu, le minimum pour ce genre de fonction est de tenter d'authentifier les lecteurs du feed.

Aucun problème, l'authentification HTTP est supposée être implémentée. D'après la documentation PHP, il suffit juste de regarder deux variables pour retrouver le nom et la mot de passe de l'usager distant.

Malheureusement, ces deux variables sont toujours vides lorsque PHP tourne en mode CGI. Devinez quoi ? C'est justement dans ce mode qu'OVH abrite les sites mutualisés... Fallait-il changer de fournisseur ou renoncer à nos projets ?

Que nenni ! Nous avons simplement trouvé un autre moyen de retrouver les informations de sécurité dans PHP. En fait, la seule chose dont vous avez vraiment besoin est le module Apache mod_rewrite Apache module, et la possibilité d'ajouter quelques directives au fichier .htaccess.

Pourquoi avons-nous besoin d'authentification dynamique ?

Par exemple, pour contrôler l'accès à un feed RSS sensible. YACS est capable de lister les événements de sa log système, et diffuser ce genre d'information par un feed RSS est probablement un excellent moyen de monitorer un ou plusieurs sites. Encore faut-il vérifier qui accède à ces feeds.

Heureusement, plusieurs newsreaders supportent l'authentification HTTP, et donc nous nous sommes tournés naturellement vers cette solution pour YACS.

Eléments de l'architecture

A ma gauche, voici un newsreader simple et efficace comme FeedReader. A ma droite, un ou plusieurs serveurs YACS server, chacun avec sa base des profils usagers autorisés à lire le feed RSS protégé. Au milieu, Internet, des paquets IP, et des requêtes HTTP.

Que dit le manuel ?

Selon le manuel, le nom et le mot de passe sont disponibles dans la variable $_SERVER array. Sinon, le script doit émettre une réponse HTTP spécifique pour demander une authentification. Le nom et le mot de passe fournis, s'ils sont présents, peuvent être vérifiés dans une base de données.

Super. Sauf que ça ne marche que si PHP s'exécute comme un module d'Apache (par exemple, sur ma machine de développement avec EasyPHP). Lorsque PHP s'exécute comme un module CGI (par exemple, sur les serveurs mutualisés d'ovh), le nom et le mot de passe sont toujours vides, que l'utilisateur les ait fournis ou pas.

Apparemment l'ensemble des variables préparées par Apache pour PHP est réduit lors d'une exécution en mode CGI, ce qui explique que $_SERVER['PHP_AUTH_USER'] et $_SERVER['PHP_AUTH_PW'] ne soient pas positionnées.

Comment faire alors ?

La solution est de sélectionner une variable Apache qui est effectivement transmise à PHP même en mode CGI, et d'y coller les données d'authentification transmises par le navigateur (ou par le newsreader).

Jetez un coup d'oeil à la directive ajoutée au fichier .htaccess:

RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]


Cette directive dit que, si le module mod_rewrite est disponible, L'attribut HTTP Authorization doit être placé dans la variable $_SERVER['REMOTE_USER'].

Pour faire suite à la RFC 2617 concernant HTTP Authentication, si le surfeur indique le nom 'Aladdin' et le mot de passe 'open sesame', l'agent utilisateur (le navigateur ou le newsreader) doit ajouter l'attribut suivant à la requête HTTP :

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==


Grâce à la directive de réécriture mise dans .htaccess, le script PHP exécuté pourra accèder à ces éléments dans $_SERVER['REMOTE_USER'] comme suit :

$_SERVER['REMOTE_USER'] = Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==


A partir de là, il n'y a plus qu'à décoder le base64, et à séparer le nom du mot de passe, comme indiqué dans la RFC 2617. Vous me suivez ?

Que devrais-je mettre dans mon script PHP ?

L'objectif, c'est de faire un script qui marche partout, que PHP s'exécute comme un module Apache, ou en mode CGI.

Avant d'utiliser $_SERVER['PHP_AUTH_USER'] et $_SERVER['PHP_AUTH_PW'], vérifier si ces variables sont vides.

Si oui, essayer de les reconstituer à partir de $_SERVER['REMOTE_USER'].

L'extrait de code qui suit fait exactement cela :





Est-ce que je peux utiliser votre script directement ?

Bien sûr, YACS est LGPL. Vous pouvez télécharger le script complet pour sécuriser un feed RSS, ou juste consulter la page de documentation.

Bien entendu, ce truc fonctionne seulement si le module mod_rewrite est disponible, et si vous avez modifié le fichier .htaccess comme expliqué précédemment.

Comments

Gonzo
Member
1 post
registered on Feb. 13 2005

on Feb. 13 2005


Le script PHP est erroné, dans le if, il faut mettre (les erreurs sont en gras):

(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) )

et preg_match('/Basic\s+(.*)$/i',$_SERVER['REMOTE_USER'], $matches)
Bernard
avatar
from nearby-an-airport
Associate
6544 posts
registered on Sep. 12 2003

inspired from gonzo on Feb. 13 2005


Gonzo : Merci d'avoir corrigé cette page. Le script complet, accessible à agents/feed.php, est à jour également.
Vince
avatar
Member
1 post
registered on Jul. 1 2005

on Jul. 1 2005


Un seul mot : bravo !

Depuis la disparition des variables d'environnement $_SERVER['PHP_AUTH_USER'] et $_SERVER['PHP_AUTH_PW'] lors d'une authentification externe en PHP (j'utilise mod_auth_mysql dans plusieurs de mes sites), je cherchais désespérément un moyen de contourner ce problème.

Cet article détaille parfaitement un moyen de pallier à ce genre de situation, merci à l'auteur.

Rate this page
Posted by Bernard on Oct. 4 2004, file uploaded by Makkaka on Oct. 4 2004, (popular)