begin process at 2012 05 27 20:57:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > WWW-AUTHENTICATE AVEC PHP EN MODE CGI

WWW-AUTHENTICATE AVEC PHP EN MODE CGI


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Tutoriaux Niveau :Expert Date de création :10/04/2005 Date de mise à jour :10/04/2005 20:18:44 Vu :9 043

Auteur : janhsh

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Si vous utilisez l'instruction  Header("WWW-Authenticate: . . .  pour authentifier les utilisateurs sur votre site, cela ne fonctionne que si PHP tourne comme module d' Apache.
Le user et le mot de passe sont retournées dans les variables PHP_AUTH_USER.et $PHP_AUTH_PW.

Cette configuration de PHP est cependant cause d'instabilités du serveur et de nombreux hébergeurs propose des solutions avec PHP s'exécutant en CGI.

Lors de l'exécution en mode CGI, PHP ne sait pas récupérer les informations d'authentification d'Apache et les deux variables restent non affectée.

Voici donc un moyen détourné de récupérer cette information.

Placez dans la racine de votre site un fichier .htaccess avec le code suivant (ou ajoutez le au fichier existant )

RewriteEngine on
RewriteCond %{HTTP:Authorization}  ^Basic.*
RewriteRule (.*) $1?Authorization=%{HTTP:Authorization} [QSA,L]

Le script d'authentification
Le code suivant est à placé en début de vos pages à protéger
(Ce script utilise la fonction header --> rien ne peut etre affiché avant)

Source

  • <?
  • if (preg_match('/Basics+(.*)$/i', $_GET['Authorization'], $Authorization))
  • {
  • list($Auth_Name, $Auth_Pwrd) = explode(':', base64_decode($Authorization[1]));
  • if (($Auth_Name!="MonUser") || ($Auth_Pwrd!="MonPass")) // Faire ici votre test
  • {
  • Header("WWW-Authenticate: Basic realm=\"My Realm\"");
  • Header("HTTP/1.0 401 Unauthorized");
  • die("Access refusé");
  • }
  • }
  • else
  • {
  • Header("WWW-Authenticate: Basic realm=\"My Realm\"");
  • Header("HTTP/1.0 401 Unauthorized");
  • die("Access refusé");
  • }
  • ...
  • Le restant de votre page
  • ...
  • ?>
<?
if (preg_match('/Basics+(.*)$/i', $_GET['Authorization'], $Authorization))
{
list($Auth_Name, $Auth_Pwrd) = explode(':', base64_decode($Authorization[1]));

if (($Auth_Name!="MonUser") || ($Auth_Pwrd!="MonPass"))  // Faire ici votre test
{
  Header("WWW-Authenticate: Basic realm=\"My Realm\"");
	Header("HTTP/1.0 401 Unauthorized");
	die("Access refusé");
       }
}
else
{
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
die("Access refusé");
}

...
Le restant de votre page
...
?>

 Conclusion

Une variante pour empêcher l'appel direct de la page avec le paramètre d'authentification est d'utiliser dans le .htaccess

RewriteRule (.*) $1?%{ENV:UNIQUE_ID}=%{HTTP:Authorization} [QSA,L]

Et dans le script
preg_match('/Basics+(.*)$/i', $_GET[$_ENV['UNIQUE_ID']], $Authorization))

De cette façon, vous utilisez une variable de nom aléatoire généré à partir d' UNIQUE_ID pour invalider l'authentification au cas ou quelqu'un arriverait à copier l'URL

Notez que vous pouvez toujours accéder a une page sécurisée de la façon suivante http://User:Password@www.site.com/page.php
Ceci est une régle générale pour tout les serveurs web !


JH


 Historique

10 avril 2005 20:14:11 :
10 avril 2005 20:18:44 :

 Sources du même auteur

Source avec Zip Source avec une capture CLASSE DE MESSAGERIE
Source avec Zip REGEXP POUR VÉRIFIER LA VALIDITÉ D'UNE ADRESSE MAIL SUIVANT ...
Source avec Zip CLASSE POUR EMPÊCHER LES SOUMISSIONS MULTIPLES DE FORMULAIRE
Source avec Zip SITE MULTILINGUE AVEC DÉTECTION DE LA LANGUE DE L'EXPLORATEU...

 Sources de la même categorie

Source avec une capture INTÉGRER À UNE BASE DE DONNÉES DES COORDONNÉES GÉOGRAPHIQUES... par slhuilli
Source avec Zip DÉCOMPOSER UN CODE PHP AVEC LA FONCTION INCLUDE par Julien39
CRÉATION D'UN SCRIPT D'AUTHENTIFICATION par phpAnonyme
Source avec Zip Source avec une capture N/X API: GOOGLE MAPS DEPUIS PHP VALID W3C par GillesWebmaster
PHP EXTRAIRE DES MAILS D'UN GROS FICHIER LOCAL OU DISTANT par cosmoswarezone1

Commentaires et avis

Commentaire de Drakstar le 18/09/2005 12:44:11

Trés bonne astuce, pour récupérer toute la sécurité d'apache quand on est sur un serveur en cgi.
Vraiment génial.


Commentaire de coucou747 le 05/02/2006 14:33:24 administrateur CS

code interessant, mais très mal codé :
<?php
if (preg_match('/Basics+(.*)$/i', $_GET['Authorization'], $Authorization))
{
list($Auth_Name, $Auth_Pwrd) = explode(':', base64_decode($Authorization[1]));
if ($Auth_Name!=='MonUser' || $Auth_Pwrd!=='MonPass')
{
Header('WWW-Authenticate: Basic realm="My Realm"');
Header('HTTP/1.0 403 Unauthorized');
die('<html><head><title>Access refusé</title></head>
<body><h1>Accès refusé</h1></body></html>');
}
}
else
{
Header('WWW-Authenticate: Basic realm="My Realm"');
Header('HTTP/1.0 403 Unauthorized');
die('<html><head><title>Access refusé</title></head>
<body><h1>Accès refusé</h1></body></html>');
}
?>


De plus, il existe une option apache pour deffinir une variable d'environnement...

Commentaire de janhsh le 18/02/2006 01:15:08

Justement, mais quand php est en mode cgi, la majorité des variable d'environnement ne sont pas transmisent à l'interprétateur.

Commentaire de coucou747 le 18/02/2006 12:21:10 administrateur CS

je sais ça, mais avec un .htacces, on peut les transmetre quand même...

Commentaire de Shibo_Sources le 18/08/2006 10:30:56

Rien à faire, sa veux pas marcher :(

Commentaire de janhsh le 19/08/2006 02:00:27

Pour répondre à coucou747

Beaucoups d'hébergeur utilise pour des raisons de stabilité le mode CGI et pour des raisons de sécurité, certains
désactive le mod setenvif et utilise le mod suexec qui réinitialiser les variables d'environnement.

Du coup les règles du style
  RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
dans le .htaccess ne fonctionne pas.
Je ne vois donc pas comment on peut quand même transmettre les variables d'environnements. Mais si quelqu'un a une autre solution, je suis preneur …

--

Pour répondre à Shibo_Sources

Il faut que le mod rewrite soit chargé et que les deux directives :

AccessFileName .htaccess  
AllowOverride All

soient présentes dans httpd.conf pour que le .htaccess soit évalué.

Test à effectuer pour tester si le mod est chargé:
Créer un fichier ".htaccess" dans la racine du site contenant les deux lignes suivantes

RewriteEngine on
RewriteRule * UnePage.html [L]

Lorsque vous visiterez n'importe quel page de votre site, vous devriez être redirigé sur la page UnePage.html. Si cela ne fonctionne pas, c'est que le mod rewrite n'est pas disponible ou que le fichier .htaccess n'est pas pris en compte.

Commentaire de gfont le 22/03/2007 10:22:07

Bonjour,
J'utilise ce script d'authentification mais avec IE7, le message qui correspond à realm="Taper votre nom d\'utilisateur (adresse mél utilisée pour vous inscrire) et votre mot de passe (celui que vous avez reçu)" s'affiche dans la fenêtre d'authentification de la façon suivante :

Le serveur www.se-unsa.org à l'adresse Taper votre nom d'utilisateur (adresse mél utilisée pour vous inscrire) et votre mot de passe (celui que vous avez reçu) requiert un nom d'utilisateur et un mot de passe.

Avertissement : ce serveur requiert que votre nom d'utilisateur et votre mot de passe soient envoyés de façon non sécurisée (authentification de base sans connexion sécurisée).

Y-a-t'il un moyen d'éviter ces infos parasites.

Merci d'avance

Commentaire de janhsh le 22/03/2007 18:44:45

Bonjour,

Ce message est affiché avec la configuration par défaut d' IE lors d'une authentification sur protocole http pour avertir que les données entrées peuvent être capturées.

Deux solution sont possible:
--> aller dans la config d' IE et désactivez ce message
--> utiliser le protocole https pour chiffrer la communication

@+
JH

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales