mer 27 fév 2008
Authentification HTTP automatique
27 02 2008Vous avez des fichiers à protéger et une interface d'administration en parallèle avec protection au backoffice via PHP et sessions.
Pour que vos dossiers ne soient pas accessible par tous le monde si l'url d'un fichier est découverte,
Trois solutions s'offrent à vous :
- Soit je mets mes fichiers en bdd
- Soit je les sors de l'arborescence web et les rapatrie ensuite en php avec header appropriés
- Soit je protège tous mes dossiers avec un htaccess
Mon exemple concernera la troisième solution.
Si j'ai un haccess, l'accès aux dossiers sera régit par un login/pass ce qui fera doublon pour les membres qui se connectent au backoffice mais bien utile pour les personnes qui trouverait une url des fichiers.
Pour palier la double authentification, j'ai cherché un moyen de désactiver mes htaccess lors de la première authentification.
-> Je veux les conserver pour le cas où je donne l'url à un tiers
-> Je veux les désactiver au cas où je sois déjà connecté au backoffice pour ne pas faire doublon
Les test se sont portés vers les fonctions fsockopen et requêtes CURL (car on peut passer un htaccess en accédant via une url du type username:password@url.tld), mais avec fsockopen à part récupérer un fichier derrière un htaccess :
<?php $fp = fsockopen('www.example.com', 80, $errno, $errstr, 30); // Connexion (Host + Port) if (!$fp) { echo $errstr,'(',$errno,')<br />'; } else { $data=''; $base64 =base64_encode('login:password'); // Login et mot de passe crypté en base64 fputs($fp,"PUT http://www.example.com/index.html HTTP/1.0\r\n\r\nAuthorization: Basic ".$base64."\r\n\r\n"); // Le socket modifiable while (!feof($fp)) { $data .= fgets($fp, 128); // Récupération des infos } echo $data; // On affiche la page fclose($fp); } ?>
, je n'ai pas réussit à désactiver la session du htaccess pour naviguer ensuite dans les dossiers
(si vous avez une idée ?)
Après de multiple essais et questions diverses, la solution évidente se portait finalement vers ajax tout simplement !
Il suffit d'envoyer une requêtes ajax vers le dossier protégé en renseignant les deux derniers paramètres de la méthode open de l'objet XMLHttpRequest : username et password
N'hésitez pas si vous avez la solution php qui fonctionnerait
---
Patcher Ajax.Request de prototype,
Remplacer :
<script type="text/javascript"> this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous); </script>
Par :
<script type="text/javascript"> if (this.options.username && this.options.password) this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous, this.options.username, this.options.password); else this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous); </script>