beepee357
04/10/2004, 17h14
Pourquoi avons-nous besoin d'authentification dynamique ?
Par exemple, pour contrôler l'accès à un feed RSS sensible. Supposons que vous auriez un serveur web capable de lister les événements de sa log système, et de diffuser ce genre d'information par un feed RSS, ce qui est probablement un excellent moyen de monitorer un ou plusieurs sites. Encore faut-il vérifier qui accède à ces feeds.
Plusieurs newsreaders (au moins RSS Bandit et FeedReader) supportent l'authentification HTTP, et donc nous nous sommes tournés naturellement vers cette solution
Le principal problème, c'est qu'on aimerait bien ne pas se taper une reconfiguration du .htaccess statique à chaque fois qu'un mot de passe change ou est ajouté. L'idéal, c'est de laisser PHP s'occuper de contrôler les profils utilisateurs dans la base de données MySQL.
D'après la documentation PHP, il suffit juste de regarder deux variables pour retrouver le nom et le 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.
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).
Que faut-il mettre dans .htaccess ?
Jetez un coup d'oeil à la directive ajoutée au fichier .htaccess:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
</IfModule>
Cette directive dit que, si le module mod_rewrite est disponible, L'attribut HTTP Authorization doit être placé dans la variable $_SERVER['REMOTE_USER'].
Que faut-il mettre dans le 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 :
<?php
// maybe we have caught authentication data in $_SERVER['REMOTE_USER']
if((!$_SERVER['PHP_AUTH_USER'] || !$_SERVER['PHP_AUTH_USER'])
&& preg_match('/Basics+(.*)$/i', $_SERVER['REMOTE_USER'], $matches)) {
list($name, $password) = explode(':', base64_decode($matches[1]));
$_SERVER['PHP_AUTH_USER'] = strip_tags($name);
$_SERVER['PHP_AUTH_PW'] = strip_tags($password);
}
?>
Plus d'info ?
Un descriptif plus complet de la solution est disponible ici (http://www.yetanothercommunitysystem.com/yacs/articles/view.php/321), ainsi que le script PHP complet.
Par exemple, pour contrôler l'accès à un feed RSS sensible. Supposons que vous auriez un serveur web capable de lister les événements de sa log système, et de diffuser ce genre d'information par un feed RSS, ce qui est probablement un excellent moyen de monitorer un ou plusieurs sites. Encore faut-il vérifier qui accède à ces feeds.
Plusieurs newsreaders (au moins RSS Bandit et FeedReader) supportent l'authentification HTTP, et donc nous nous sommes tournés naturellement vers cette solution
Le principal problème, c'est qu'on aimerait bien ne pas se taper une reconfiguration du .htaccess statique à chaque fois qu'un mot de passe change ou est ajouté. L'idéal, c'est de laisser PHP s'occuper de contrôler les profils utilisateurs dans la base de données MySQL.
D'après la documentation PHP, il suffit juste de regarder deux variables pour retrouver le nom et le 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.
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).
Que faut-il mettre dans .htaccess ?
Jetez un coup d'oeil à la directive ajoutée au fichier .htaccess:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
</IfModule>
Cette directive dit que, si le module mod_rewrite est disponible, L'attribut HTTP Authorization doit être placé dans la variable $_SERVER['REMOTE_USER'].
Que faut-il mettre dans le 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 :
<?php
// maybe we have caught authentication data in $_SERVER['REMOTE_USER']
if((!$_SERVER['PHP_AUTH_USER'] || !$_SERVER['PHP_AUTH_USER'])
&& preg_match('/Basics+(.*)$/i', $_SERVER['REMOTE_USER'], $matches)) {
list($name, $password) = explode(':', base64_decode($matches[1]));
$_SERVER['PHP_AUTH_USER'] = strip_tags($name);
$_SERVER['PHP_AUTH_PW'] = strip_tags($password);
}
?>
Plus d'info ?
Un descriptif plus complet de la solution est disponible ici (http://www.yetanothercommunitysystem.com/yacs/articles/view.php/321), ainsi que le script PHP complet.