Protection de la page de paramètres HTTP à l'aide de MySQL et PHP. Sécurité de la page de configuration HTTP à l'aide du moteur simple MySQL et PHP PHP avec authentification

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"]))) (
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é le mot de passe ($ _SERVER ["PHP_AUTH_PW"]).

"
;
}
?>

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"]) ||
($ _POST ["SeenBefore"] == 1 && $ _POST ["OldAuth"] == $ _SERVER ["PHP_AUTH_USER"])) (
authentifier ();
}
autre (
écho
"

Bienvenue : ($ _SERVER ["PHP_AUTH_USER"])
" ;
écho "Connexion précédente : ($ _REQUEST [" OldAuth "])";
écho "

\ n ";
écho "\ n ";
écho "\ n ";
écho "\ n ";
écho "

\ n ";
}
?>

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"]) ||
($ _POST ["SeenBefore"] == 1 && $ _POST ["OldAuth"] == $ _SERVER ["PHP_AUTH_USER"])) (
authentifier ();
) autre (
écho "

Bienvenue: "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "
" ;
écho "Connexion précédente :"... htmlspecialchars ($ _REQUEST ["OldAuth"]);
écho "

\ n ";
écho "\ n ";
écho "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "\" /> \ n " ;
écho "\ n ";
écho "

\ n ";
}
?>

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 :

  1. Protection par mot de passe (login/mot de passe) à l'aide de variables $ _SERVER ["PHP_AUTH_USER"] et $ _SERVER ["PHP_AUTH_PW"].
  2. Protection par IP adresse du client à l'aide d'une variable $ _SERVER ["REMOTE_ADDR"].
  3. 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).



Bonne journée les amis ! Jetons un coup d'œil à l'enregistrement des utilisateurs en PHP avec vous. Tout d'abord, définissons les conditions d'enregistrement de notre utilisateur :

  • Nous chiffrons le mot de passe à l'aide de l'algorithme MD5
  • Le mot de passe sera "salé"
  • Vérifier la disponibilité de Login
  • Activation de l'utilisateur par courrier.
  • Écrire et stocker des données dans SGBD MySQL

Pour écrire ce script, nous devons comprendre ce qu'est l'enregistrement d'un utilisateur. L'enregistrement d'un utilisateur consiste à recevoir des données d'un utilisateur réel, à traiter et à stocker des données.

Pour expliquer en termes simples, l'enregistrement n'est que l'enregistrement et le stockage de certaines données par lesquelles nous pouvons autoriser l'utilisateur dans notre cas - il s'agit du login et du mot de passe.

L'autorisation est l'octroi à une certaine personne ou à un groupe de personnes des droits d'effectuer certaines actions, ainsi que le processus de vérification de ces droits lorsqu'elle tente d'effectuer ces actions. En termes simples, à l'aide d'une autorisation, nous pouvons délimiter l'accès à l'un ou l'autre des contenus de notre site Web.

Considérons la structure des répertoires de scripts pour la mise en œuvre de notre enregistrement avec autorisation. Nous devons diviser les scripts en composants logiques. Nous avons placé les modules d'enregistrement et d'autorisation dans un répertoire séparé. Nous placerons également la connexion à la base de données dans des répertoires séparés. MySQL, fichier avec fonctions personnalisées, fichier de style CSS et notre modèle HTML... Cette structure vous permet de naviguer rapidement dans les scripts. Imaginez que vous ayez un grand site avec un tas de modules, etc. et s'il n'y a pas d'ordre, il sera très difficile de trouver quelque chose dans un tel désordre.

Puisque nous allons stocker toutes les données dans SGBD MySQL, créons ensuite une petite table dans laquelle nous stockerons les données d'enregistrement.

Tout d'abord, vous devez créer une table dans la base de données. Le tableau s'appellera bez_regbez est le préfixe de la table, et reg nom du tableau.

Structure du tableau : bez_reg

- - Structure de la table `bez_reg` - CREATE TABLE IF NOT EXISTS` bez_reg` (`id` int (11) NOT NULL AUTO_INCREMENT,` login` varchar (200) NOT NULL, `pass` varchar (32) NOT NULL , `salt ` varchar (32) NOT NULL,` active_hex` varchar (32) NOT NULL, `status` int (1) NOT NULL, PRIMARY KEY (` id`)) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;

Créons maintenant les scripts principaux pour la suite du travail.

Fichier INDEX.PHP

Fichier CONFIG.PHP

"); ?>

fichier 404.html

Erreur 404

Erreur 404

Une erreur 404 s'est produite sur la page

Revenir


Fichier BD.PHP

Fichier INDEX.HTML

Enregistrement de l'utilisateur PHP MySQL avec activation par e-mail



Fichier FUNCT.PHP

"." \ n "; if (is_array ($ data)) (foreach ($ data as $ val) $ err. ="

  • ". $ val."
  • "." \ n ";) else $ err. ="
  • ". $ données."
  • "." \ n "; $ err. =""." \ n "; return $ err;) / ** Simple wrapper pour les requêtes MySQL * @param string $ sql * / function mysqlQuery ($ sql) ($ res = mysql_query ($ sql); / * Vérification du résultat Ceci montre la vraie requête envoyée à MySQL, ainsi que l'erreur. Pratique pour le débogage. * / if (! $ res) ($ message = "Invalid query:". mysql_error (). "\ n"; $ message. = " Requête en entier : ". $ sql; die ($ message);) return $ res;) / ** Générateur de sel simple * @param string $ sql * / function salt () ($ salt = substr (md5 (uniqid ()) ), - 8); retour $ sel;)

    Passons à la rédaction de l'inscription. Tout d'abord, nous devrons créer un modèle de formulaire d'inscription afin que l'utilisateur puisse saisir ses données pour le traitement. Ensuite, nous devrons écrire le gestionnaire de formulaire lui-même, qui vérifiera l'exactitude des données utilisateur saisies. Une fois les données vérifiées avec succès, nous les écrivons dans notre base de données et envoyons une lettre à l'utilisateur pour activer son compte.

    Fichier REG.PHP

    Vous vous êtes inscrit avec succès ! Veuillez activer votre compte !!"; // Activer le compte if (isset ($ _ GET [" key "])) (// Vérifier la clé $ sql =" SELECT * FROM `". BEZ_DBPREFIX. "Reg` WHERE` active_hex` = "". Escape_str ( $ _GET ["key"]). "" "; $ Res = mysqlQuery ($ sql); if (mysql_num_rows ($ res) == 0) $ err =" La clé d'activation n'est pas correcte ! "; // Vérifier les erreurs et afficher à l'utilisateur if (count ($ err)> 0) echo showErrorMessage ($ err); else (// Obtenir l'adresse de l'utilisateur $ row = mysql_fetch_assoc ($ res); $ email = $ row ["login "]; // Activer le compte utilisateur $ sql = "UPDATE` ". BEZ_DBPREFIX." reg` SET `status` = 1 WHERE` login` = "". $ email. "" "; $ res = mysqlQuery ($ sql ); // Envoyez un email pour activer $ title = "(! LANG: Votre compte sur http: // le site a été activé avec succès"; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^!} [email protégé](+ \.) + (2,6) $ / i ", $ _POST [" email "])) $ err =" E-mail mal saisi "." \ N ";) if (vide ($ _ POST [ "pass"])) $ err = "Le champ Mot de passe ne peut pas être vide"; if (vide ($ _ POST ["pass2"])) $ err = "Le champ Confirmation du mot de passe ne peut pas être vide"; // Vérifier les erreurs et afficher à l'utilisateur if (count ($ err)> 0) echo showErrorMessage ($ err); else (/ * Continuer à vérifier les données saisies Vérifier les mots de passe pour la correspondance * / if ($ _ POST ["pass"]! = $ _POST ["pass2" ]) $ err = "Les mots de passe ne correspondent pas"; // Vérifier les erreurs et les afficher à l'utilisateur if (count ($ err)> 0) echo showErrorMessage ($ err); else (/ * Check si nous avons un tel utilisateur dans la base de données * / $ sql = "SELECT` login` FROM `". BEZ_DBPREFIX. "reg` WHERE` login` = "". escape_str ($ _ POST ["email"]). "" "; $ res = mysqlQuery ($ sql); if (mysql_num_rows ($ res)> 0) $ err = "Désolé connexion : ". $ _POST [" e-mail "]." occupé! "; // Vérifier les erreurs et l'afficher à l'utilisateur if (count ($ err)> 0) echo showErrorMessage ($ err); else (// Récupère le HASH du sel $ salt = salt (); / / Salez le mot de passe $ pass = md5 (md5 ($ _POST ["pass"]). $ salt); / * Si tout va bien, écrivez les données dans la base de données * / $ sql = "INSERT INTO` ". BEZ_DBPREFIX ." reg` VALEURS ("", "" . escape_str ($ _ POST ["email"]). "", "". $ pass. "", "". $ salt. "", "". md5 ( $ salt). "", 0) "; $ res = mysqlQuery ($ sql); // Envoi d'un email pour activer $ url = BEZ_HOST. "less / reg /? mode = reg & key =". md5 ($ salt ); $ title = "(! LANG : Inscription sur http://website"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    Fichier REG_FORM.HTML

    Enregistrement de l'utilisateur PHP MySQL avec activation par e-mail

    E-mail *:
    Mot de passe *:
    Confirmation mot de passe *:

    Champs avec une icône * sont requises

    Puisque nous sommes prêts à enregistrer des utilisateurs, il est temps d'écrire une autorisation. Créons un formulaire pour l'autorisation de l'utilisateur, puis écrivons un gestionnaire de formulaire d'autorisation et enfin créons un script afficher.php qui nous montrera si nous sommes autorisés dans le système ou non.

    Fichier AUTH.PHP

    0) echo showErrorMessage ($ err); else (/ * Créer une requête à récupérer dans la base de données pour vérifier l'authenticité de l'utilisateur * / $ sql = "SELECT * FROM` ". BEZ_DBPREFIX." reg` WHERE `login` =" ". escape_str ($ _ POST [ " email "]) . "" AND `status` = 1"; $ res = mysqlQuery ($ sql); // Si le login correspond, vérifie le mot de passe if (mysql_num_rows ($ res)> 0) (// Get data de la table $ row = mysql_fetch_assoc ( $ res); if (md5 (md5 ($ _ POST ["pass"]). $ row ["salt"]) == $ row ["pass"]) ($ _SESSION [ "user"] = true; // Réinitialiser l'en-tête des paramètres ("Location:". BEZ_HOST. "Less / reg /? Mode = auth"); exit;) else echo showErrorMessage ("Mauvais mot de passe!");) Else echo showErrorMessage ("Connexion ". $ _POST [" e-mail "]." introuvable ! ");))?>

    Pour ceux qui ont la dernière version de PHP, je poste ce script en utilisant AOP puisque extension MySQL obsolète et supprimée de la nouvelle version de PHP. Télécharger l'enregistrement et l'autorisation php mysql pdo

    L'archive a été mise à jour le 24 février 2015.

    Attention: Si vous utilisez ce script sur un serveur local comme DENWER,XAMPP, alors vous ne devriez pas attendre les lettres dans votre boîte aux lettres. Les lettres sont dans un blanc envoyer un mail... DANS Denwer vous pouvez les trouver en chemin Z: \ tmp \! Sendmail \ vous pouvez ouvrir ces fichiers dans n'importe quel client de messagerie.

    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 # 6 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 # 7 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 a cliqué sur 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.

    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"].

    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 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.

    Exemple n°8 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"]) ||
    ($ _POST ["SeenBefore"] == 1 && $ _POST ["OldAuth"] == $ _SERVER ["PHP_AUTH_USER"])) (
    authentifier ();
    ) autre (
    écho "

    Bienvenue: "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "
    " ;
    écho "Connexion précédente :"... htmlspecialchars ($ _REQUEST ["OldAuth"]);
    écho "

    \ n ";
    écho "\ n ";
    écho "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "\" /> \ n " ;
    écho "\ n ";
    écho "

    \ n ";
    }
    ?>

    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.

    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é " 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.

    Une autre limitation si vous utilisez IIS sur ISAPI et PHP 4 : variables PHP_AUTH_ * pas défini, mais en même temps une variable est disponible HTTP_AUTORISATION... Exemple de code que vous pouvez utiliser : list ($ user, $ pw) = exploser (":", base64_decode (substr ($ _ SERVER ["HTTP_AUTHORIZATION"], 6)));

    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.

    Vous avez aimé l'article ? A partager entre amis :