Afin d'envoyer un message "Authentification requise" au navigateur du client, qui à son tour conduira à une boîte de dialogue pour saisir un nom d'utilisateur et un mot de passe. Après que le client ait saisi son nom d'utilisateur et son mot de passe, le script sera à nouveau appelé, mais avec les variables prédéfinies PHP_AUTH_USER, PHP_AUTH_PW et AUTH_TYPE, qui contiennent respectivement le nom d'utilisateur, le mot de passe et le type d'authentification. Ces variables se trouvent dans les tableaux $ _SERVER et $ HTTP_SERVER_VARS. Actuellement, seule l'authentification "Basic" est prise en charge. Vous pouvez également voir une description plus détaillée de la fonction entête () .
Un exemple de fragment de script qui oblige le client à se connecter pour afficher la page :
Exemple d'authentification HTTP
if (! isset ($ _ SERVER ["PHP_AUTH_USER"]))) ( Bonjour ($ _SERVER ["PHP_AUTH_USER"]). Vous avez entré le mot de passe ($ _SERVER ["PHP_AUTH_PW"]).
entête ( "WWW-Authenticate : Basic realm =" My Realm "");
écho « Le SMS envoyé au cas où
si l'utilisateur a appuyé sur le bouton Annuler ";
sortir;
) autre (
écho"
écho "
}
?>
Remarque sur la compatibilité : Soyez particulièrement prudent lorsque vous spécifiez des en-têtes HTTP. Afin de garantir une compatibilité maximale avec autant de clients différents que possible, le mot "Basic" doit être en majuscule "B", la région (domaine) doit être entourée de guillemets doubles (pas simples !), et exactement un espace doit précéder le code 401 dans le titre HTTP / 1.0 401 .
Au lieu d'afficher simplement les variables PHP_AUTH_USER et PHP_AUTH_PW à l'écran, vous voudrez peut-être vérifier qu'elles sont correctes. Pour ce faire, utilisez une requête de base de données ou recherchez un utilisateur dans un fichier dbm.
Vous pouvez observer les particularités du navigateur Internet Explorer. Il est très pointilleux sur le paramètre des en-têtes transmis. Spécification d'un titre WWW-Authentifier avant d'envoyer le statut HTTP / 1.0 401 est une petite astuce.
Depuis PHP 4.3.0, afin d'empêcher quiconque d'écrire un script pour révéler le mot de passe d'une page qui utilise une authentification externe, les variables PHP_AUTH ne sont pas définies si la page utilise une authentification externe et que le mode sécurisé est défini. Quoi qu'il en soit, la variable REMOTE_USER peut être utilisée pour authentifier un utilisateur authentifié en externe. Ainsi, vous pouvez toujours utiliser la variable $ _SERVER ["REMOTE_USER"].
Noter: PHP utilise la directive AuthType pour indiquer si l'authentification externe est utilisée ou non.
Il convient de noter que tout ce qui précède n'empêche pas le vol de mots de passe pour des pages nécessitant une autorisation par quelqu'un qui contrôle des pages non autorisées situées sur le même serveur.
Netscape Navigator et Internet Explorer effacent tous deux le cache d'authentification de la fenêtre actuelle pour le domaine spécifié lorsqu'ils sont reçus du serveur. Cela peut être utilisé pour forcer un utilisateur à se déconnecter et à réafficher la boîte de dialogue du nom d'utilisateur et du mot de passe. Certains développeurs l'utilisent pour limiter l'autorisation dans le temps ou pour fournir un bouton de déconnexion.
Un exemple d'authentification HTTP avec saisie forcée d'un nouveau couple nom d'utilisateur/mot de passe
fonction authentifier () (
entête ( "WWW-Authenticate: Basic realm =" Tester le système d'authentification "");
en-tête ("HTTP / 1.0 401 Non autorisé");
écho "Vous devez entrer le nom d'utilisateur et le mot de passe corrects pour accéder à la ressource \ n";
sortir;
}
Si (! Isset ($ _ SERVER ["PHP_AUTH_USER"]) || Bienvenue : ($ _SERVER ["PHP_AUTH_USER"])
($ _POST ["SeenBefore"] == 1 && $ _POST ["OldAuth"] == $ _SERVER ["PHP_AUTH_USER"])) (
authentifier ();
}
autre (
écho"
"
écho "Connexion précédente : ($ _REQUEST [" OldAuth "])";
écho ";
écho "\ n ";
écho "\ n ";
écho "\ n ";
écho "
}
?>
Ce comportement n'est pas imposé par les normes d'authentification de base HTTP, vous ne devez donc pas en dépendre. Comme les tests l'ont montré, le navigateur Lynx n'efface pas le cache d'autorisation lorsqu'il reçoit un statut 401 du serveur, et en cliquant sur "Précédent" puis "Suivant", il est possible d'ouvrir une telle page, à condition que les attributs d'autorisation requis n'ont pas changé. Cependant, l'utilisateur peut appuyer sur la touche "_" pour effacer le cache d'authentification.
Il convient également de noter qu'avant PHP 4.3.3, l'authentification HTTP ne fonctionnait pas sur les serveurs exécutant Microsoft IIS si PHP était installé en tant que module CGI en raison d'une limitation IIS. Afin de fonctionner correctement en PHP 4.3.3+, vous devez modifier le paramètre de configuration IIS appelé "Directory Security". Cliquez sur "Modifier" et définissez l'option "Accès anonyme", tous les autres champs doivent être décochés.
Autre limitation si vous utilisez IIS sur ISAPI : les variables PHP_AUTH_ * ne sont pas définies, mais en même temps la variable HTTP_AUTHORIZATION est disponible. Exemple de code que vous pouvez utiliser : list ($ user, $ pw) = exploser (":", base64_decode (substr ($ _ SERVER ["HTTP_AUTHORIZATION"], 6)));
Remarque concernant IIS :: Pour que l'authentification HTTP fonctionne correctement dans IIS, l'option cgi.rfc2616_headers dans la configuration PHP doit être définie sur 0 (valeur par défaut).
Attention: Dans le cas où le mode protégé est utilisé, l'UID du script actuel sera ajouté à la partie domaine de l'en-tête WWW-Authenticate.
<<< Назад | Contenu | En avant >>> |
Si vous avez d'autres questions ou si quelque chose n'est pas clair, bienvenue dans notre | |
|
Il est possible d'utiliser la fonction entête () envoyer un message "Identification requise" le navigateur, le forçant à afficher une fenêtre pour entrer un nom d'utilisateur et un mot de passe. Dès que l'utilisateur a renseigné le login et le mot de passe, le lien contenant le script PHP sera à nouveau appelé avec les variables prédéfinies PHP_AUTH_USER, PHP_AUTH_PW et AUTH_TYPE définies respectivement sur login, mot de passe et type d'authentification. Ces variables prédéfinies sont stockées dans les tableaux $ _SERVER et $ HTTP_SERVER_VARS. Les deux types sont supportés : "Basic" et "Digest" (depuis PHP 5.1.0). Voir la fonction pour plus de détails entête ().
Un exemple de fragment de script qui oblige le client à se connecter pour afficher la page :
Exemple # 1 Exemple d'authentification HTTP de base
if (! isset ($ _ SERVER ["PHP_AUTH_USER"]))) (
entête ( "WWW-Authenticate : Basic realm =" My Realm "");
écho « Le SMS envoyé au cas où
si l'utilisateur a appuyé sur le bouton Annuler ";
sortir;
) autre (
écho"
Bonjour ($ _SERVER ["PHP_AUTH_USER"]).
" ;écho "
Vous avez entré votre mot de passe
($ _SERVER ["PHP_AUTH_PW"])." ;}
?>
Exemple # 2 Exemple d'authentification HTTP Digest
Il s'agit d'un exemple d'implémentation d'un simple script d'authentification HTTP Digest. Voir RFC 2617 pour plus de détails.
$ realm = "Zone restreinte" ;
// utilisateur => mot de passe
$ users = array ("admin" => "mypass", "guest" => "guest");
if (vide ($ _ SERVER ["PHP_AUTH_DIGEST"])) (
en-tête ("HTTP / 1.1 401 Non autorisé");
entête ( "WWW-Authenticate : Digest realm =" "... domaine $.
"", qop = "auth", nonce = "". uniqid (). "", opaque = "". md5 ($ royaume). "" ");
Mourir ( "Texte envoyé si l'utilisateur clique sur le bouton Annuler");
}
// analyse la variable PHP_AUTH_DIGEST
if (! ($ data = http_digest_parse ($ _SERVER ["PHP_AUTH_DIGEST"])) ||
! isset ($ utilisateurs [$ données ["nom d'utilisateur"]]))
mourir ( "Données erronées !");
// générer la bonne réponse
$ A1 = md5 ($ data ["username"]. ":". $ Realm. ":". $ Users [$ data ["username"]]);
$ A2 = md5 ($ _SERVER ["REQUEST_METHOD"]. ":". $ Data ["uri"]);
$ valid_response = md5 ($ A1. ":". $ data ["nonce"]. ":". $ data ["nc"]. ":". $ data ["cnonce"]. ":". $ data ["qop"]. ":".$ A2) ;
if ($ data ["response"]! = $ valid_response)
mourir ( "Données erronées !");
// ok, login et mot de passe sont corrects
echo "Vous êtes connecté en tant que :". $ data ["nom d'utilisateur"] ;
// fonction pour analyser l'en-tête d'authentification http
fonction http_digest_parse ($ txt)
{
// protection contre les données manquantes
$ need_parts = array ("nonce" => 1, "nc" => 1, "cnonce" => 1, "qop" => 1, "username" => 1, "uri" => 1, "response" => 1);
$ données = tableau ();
$ keys = imploser ("|", array_keys ($ required_parts));
Preg_match_all ("@ (". $ Clés. ") = (?: ([\" "]) ([^ \ 2] +?) \ 2 | ([^ \ s,] +)) @", $ txt, $ correspond, PREG_SET_ORDER);
Foreach ($ correspond à $ m) (
$ données [$ m [1]] = $ m [3] ? $ m [3] : $ m [4] ;
unset ($ required_parts [$ m [1]]);
}
Retourner $ need_parts ? faux : données ;
}
?>
Commenter: Note de compatibilité
Soyez particulièrement prudent lorsque vous spécifiez des en-têtes HTTP. Afin de garantir une compatibilité maximale avec autant de clients différents que possible, le mot "Basic" doit être en majuscule "B", la région (domaine) doit être entourée de guillemets doubles (pas simples !), et exactement un espace doit précéder le code 401 dans le titre HTTP / 1.0 401... Les paramètres d'authentification doivent être séparés par des virgules, comme indiqué dans l'exemple d'authentification Digest ci-dessus.
Au lieu d'afficher simplement les variables PHP_AUTH_USER et PHP_AUTH_PW à l'écran, vous voudrez peut-être vérifier qu'elles sont correctes. Pour ce faire, utilisez une requête de base de données ou recherchez un utilisateur dans un fichier dbm.
Vous pouvez observer les particularités du navigateur Internet Explorer. Il est très pointilleux sur le paramètre des en-têtes transmis. L'astuce du titre WWW-Authentifier avant d'envoyer le statut HTTP / 1.0 401 jusqu'à présent fonctionne pour lui.
Pour empêcher quiconque d'écrire un script qui expose le mot de passe d'une page qui utilise une authentification externe, les variables PHP_AUTH ne sont pas définies si la page utilise une authentification externe et que le mode sans échec est défini. Quoi qu'il en soit, la variable REMOTE_USER peut être utilisée pour authentifier un utilisateur authentifié en externe. Ainsi, vous pouvez toujours utiliser la variable $ _SERVER ["REMOTE_USER"].
Commenter: Note de configuration
PHP utilise une spécification de directive TypeAuth pour indiquer si l'authentification externe est utilisée ou non.
Il convient de noter que tout ce qui précède n'empêche pas le vol de mots de passe pour des pages nécessitant une autorisation par quiconque contrôle des pages non autorisées situées sur le même serveur.
Netscape Navigator et Internet Explorer effacent tous deux le cache d'authentification de la fenêtre actuelle pour la région (domaine) spécifiée lors de la réception d'un état 401 du serveur. Cela peut être utilisé pour forcer un utilisateur à sortir et à réafficher la boîte de dialogue du nom d'utilisateur et du mot de passe. Certains développeurs l'utilisent pour limiter l'autorisation dans le temps ou pour fournir un bouton de déconnexion.
Exemple #3 Exemple d'authentification HTTP avec saisie forcée d'un nouveau couple nom d'utilisateur/mot de passe
fonction authentifier () (
entête ( "WWW-Authenticate: Basic realm =" Tester le système d'authentification "");
en-tête ("HTTP / 1.0 401 Non autorisé");
écho "Vous devez entrer le nom d'utilisateur et le mot de passe corrects pour accéder à la ressource \ n";
sortir;
}
if (! isset ($ _ SERVER ["PHP_AUTH_USER"]) || Bienvenue: "
($ _POST ["SeenBefore"] == 1 && $ _POST ["OldAuth"] == $ _SERVER ["PHP_AUTH_USER"])) (
authentifier ();
) autre (
écho "
"
;
écho "Connexion précédente :"... htmlspecialchars ($ _REQUEST ["OldAuth"]);
écho ";
écho "\ n ";
écho "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "\" /> \ n " ;
écho "\ n ";
écho "
}
?>
Ce comportement n'est pas réglementé par les normes HTTP de base-authentification, par conséquent, vous ne devriez pas en dépendre. Test du navigateur Lynx ont montré que Lynx n'efface pas le cache d'autorisation lors de la réception du statut 401 du serveur, et en cliquant sur "Précédent" puis "En avant", il est possible d'ouvrir une telle page, à condition que les attributs d'autorisation requis n'aient pas changé. Cependant, l'utilisateur peut appuyer sur la touche "_" pour effacer le cache d'authentification.
Pour que l'authentification HTTP fonctionne correctement sur un serveur IIS avec une version CGI de PHP, vous devez modifier le paramètre de configuration IIS appelé " Sécurité du répertoire". Cliquez sur l'inscription" Éditer"et définissez l'option" Accès anonyme", tous les autres champs ne doivent pas être cochés.
Commenter: Remarque IIS :
Pour que l'authentification HTTP fonctionne correctement dans IIS, l'option cgi.rfc2616_headers dans la configuration PHP doit être définie sur 0 (défaut).
Commenter:
Dans le cas où le mode sans échec est utilisé, l'UID du script actuel sera ajouté à Royaume-partie d'en-tête WWW-Authentifier.
Parfois, il est nécessaire de le fermer aux accès non autorisés PHP page si vous faites une zone fermée du site. Il peut s'agir d'une sorte d'information cachée pour vos clients ou visiteurs du site, une sorte d'interface d'administration pour vous, etc. Vous pouvez penser à des centaines de tâches différentes nécessitant une restriction d'accès.
Vous pouvez fermer une telle page de plusieurs manières complémentaires :
- Protection par mot de passe (login/mot de passe) à l'aide de variables $ _SERVER ["PHP_AUTH_USER"] et $ _SERVER ["PHP_AUTH_PW"].
- Protection par IP adresse du client à l'aide d'une variable $ _SERVER ["REMOTE_ADDR"].
- Protection par MAC adresse dans les réseaux locaux (en plus de la protection par IP).
Analysons d'abord la première méthode, qui est la principale. Il vous permet de fermer l'accès à la page par login et mot de passe, afin que seules les personnes connaissant le login et le mot de passe puissent y accéder. De plus, ils peuvent être divisés en fonction de cette caractéristique et fournir des informations différentes en conséquence pour chacun. Implémenté en émettant des champs spéciaux dans l'en-tête du protocole HTTP... Créons une fonction auth_send ():
" ,"
Erreur d'authentification
" ,"Contactez votre administrateur pour obtenir votre nom d'utilisateur et votre mot de passe.
"," "; sortie;);?>Cette fonction informe le navigateur que l'autorisation de connexion et de mot de passe est requise pour l'accès. Et il donne également une page dans HTML pour l'utilisateur.
" ,"
Bienvenue!
" ,"Vous êtes connecté ", $ auth_user," et mot de passe ", $ auth_pass,".
" ,""; ?>
Le code de vérification du login et du mot de passe n'est pas trop compliqué dans ce cas, puisqu'il est implémenté pour une seule personne. La logique de travail est simple s'il n'y a pas de variable $ _SERVER ["PHP_AUTH_USER"] et $ _SERVER ["PHP_AUTH_PW"] ou leurs valeurs ne correspondent pas à celles requises, alors appelez la fonction auth_send ()... N'oubliez pas qu'à la fin il s'appelle sortir, donc l'exécution du programme est terminée.
La prochaine étape de protection est mise en œuvre par filtration IP les adresses du client se connectant. Bien sûr, sur Internet, de nombreux fournisseurs émettent IP adresses pendant un certain temps et il est inutile d'utiliser cette protection, mais si nous parlons de réseaux locaux d'entreprise, cette vérification fournira une protection supplémentaire.
Votre IP n'a pas été trouvée !!! "; exit;);?>
Ici dans la ligne $ ips_autorisés séparés par un espace sont indiqués IP adresses auxquelles l'accès est autorisé. Ensuite, nous obtenons le tableau en utilisant exploser () et recherchez l'adresse du client à partir de $ _SERVER ["REMOTE_ADDR"]... j'ai utilisé la fonction pour rechercher array_search (), puisque son mauvais code implémenté en C fonctionnera un peu plus vite que ce que nous pouvons écrire dans PHP en utilisant des boucles pour ou alors pour chaque... Mais la vitesse n'est pas la chose principale ici :)
Et la dernière étape de la défense est de vérifier MAC adresses. Il appartient à la catégorie des paranoïaques et il vaut la peine de l'utiliser si vous y accédez depuis un réseau local et que les données que vous protégez sont vraiment très importantes. Jusqu'à présent, j'ai implémenté cette vérification uniquement sur le système. Linux, en raison de la relative facilité de mise en œuvre. Mais vous pouvez essayer de l'implémenter pour n'importe quelle autre plate-forme. On écrit la fonction :
Comme les utilisateurs de Linux l'ont déjà compris, il est basé sur ARP table système, accessible via le fichier / proc / net / arp... La fonction recherche dans les lignes le IP l'adresse et la renvoie MAC l'adresse:
Votre IP = 192.168.10.15 et MAC = 00 : 04 : 31 : E4 : F8 : 37
Dans le système les fenêtres peut-être y a-t-il aussi des façons d'obtenir MAC plus simple, mais de ceux qui fonctionnent réellement, c'est la conclusion ARP tables système avec la commande :
C:\WINDOWS\>arp -a Interface: 192.168.10.15 sur Interface 0x1000003 Adresse IP Adresse physique Type 192.168.10.1 00-50-22-b0-6a-aa dynamique 192.168.10.2 00-0f-38-68-e9- e8 dynamique 192.168.10.3 00-04-61-9e-26-09 dynamique 192.168.10.5 00-0f-38-6a-b1-18 dynamique
Vous pouvez implémenter vous-même une protection basée sur cette adresse, si vous en avez vraiment besoin :) Mais n'oubliez pas que si vous avez des équipements non gérés dans votre réseau sans possibilité de liaison MAC adresses au port, cette protection peut ne pas fonctionner, car vous pouvez falsifier toutes vos données d'identification utilisées pour la protection (identifiant, mot de passe, adresse IP et MAC).