| Gonzo 1 post | 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 Paquesfrom nearby-an-airport Associate, 8405 posts |
Gonzo : Merci d'avoir corrigé cette page. Le script complet, accessible à scripts/fetch.php/agents/feed.php, est à jour également. |
Vince 1 post | 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. |
[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.
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.







Les procédures particulières à OVH


