Recherche chaud: comment est habillé gargamel les effets du mauvaise communication créateur de forme 3d liste parc dattraction damérique latine pneus origine fj 40 1974 désinstaller hi rez kaspersky internet security uk fraction simplifiee de 0,325
Index Loisirs Santé Technologie

Comment créer un script de connexion sécurisée en PHP et MySQL

Publié:2012-04-21Source: général
Advertisement

Huit parties: Configurez votre ServerConfigure MySQL Database Connection PageCreate DatabaseCreate PHP FunctionsCreate traitement PagesCreate Javascript FilesCreate HTML PagesProtecting Pages

Avec de plus en plus d'histoires de fissuration dans les nouvelles, les développeurs sont à la recherche des meilleurs moyens de sécuriser leurs sites. Si votre site a un système de membre, il pourrait être à risque d'être fissurés et les données de vos utilisateurs pourraient être compromises. Ce guide va vous montrer une tentative à faire une connexion sécurisée utilisant PHP. Le code est aussi bon que nous pouvons le faire, mais la sécurité et surtout le cryptage sont des sujets complexes qui changent tout le temps, et nous ne pouvons pas prétendre avoir la totalité du champ maîtrisé. Par conséquent, nous peut-être manqué quelques trucs dans notre code. Si nous avons, s'il vous plaît laissez-nous savoir et nous allons essayer d'incorporer des améliorations dans ce que nous avons.

Rédaction d'un système de connexion est un sujet complexe et pas quelque chose à être entrepris par ceux qui ne sont pas familiers avec une grande variété de sujets de sécurité. Le système de connexion présenté ici est d'être utilisé à des fins éducatives, pas un environnement de production. Si vous avez besoin d'un système de connexion pour un environnement de production, s'il vous plaît trouver un système préemballées et approuvées. Il ya plusieurs répertorié dans la section Mises en garde à la fin de cet article.

Après ce guide vous aidera garde contre de nombreux types d'attaque qui craquelins peuvent utiliser pour prendre le contrôle des comptes d'autres utilisateurs, supprimer des comptes et / ou données de changement. Voici une liste de possibles attaques de ce guide tente de se défendre contre:

Injections SQL

Détournement de session

Eavesdropping Réseau

Cross Site Scripting

Attaques Brute Force

L'approche consiste à utiliser un mélange de filtrage des données, le cryptage et d'autres méthodes pour rendre la vie des méchants tout petit peu plus difficile.

Nous sommes sans cesse d'essayer d'améliorer ce script. La toute dernière version du code est disponible sur github. Il peut y avoir quelques différences entre le code de télécharger de cette manière à partir du code cité dans cet article. Vous devez également savoir que nous avons fait aucune tentative pour rendre la sortie des pages HTML par l'application du tout l'air joli.

Vous pouvez également remarquer que nous ne le faisons pas à proximité des balises PHP dans des fichiers contenant uniquement du code PHP. Ceci est en ligne avec la plupart des recommandations du code de mise en forme.

Enfin, vous devez savoir que nous vous demandons de créer tous les fichiers non-HTML de l'application dans différents répertoires dans le répertoire racine de l'application. La meilleure façon d'obtenir la structure de répertoire correct est de télécharger le dernier code en suivant l'un des liens ci-dessus.

S'il vous plaît sentir libre d'utiliser cette application comme une base pour votre propre mise en œuvre, mais ne pas l'utiliser comme tout type d'exemple de bonne pratique de codage!

Choses que vous devez

Comme nous allons utiliser le mysqli_ * ensemble de classes PHP pour accéder à notre base de données MySQL, vous aurez besoin des versions suivantes de PHP et MySQL.

La version de PHP 5.3 ou version ultérieure

4.1.3 version de MySQL ou tard

Vous devrez également, bien sûr, un serveur Web configuré pour utiliser PHP, pour héberger vos pages. Ce sera probablement le serveur web de votre hébergeur, à moins que vous hébergez le site vous-même.

Pour vérifier la version de PHP et MySQL sur votre serveur utiliser la fonction phpinfo (); fonction.

Étapes

Partie 1 de 8: Configurer votre serveur

1

Installation d'un serveur Web, PHP et MySQL sur votre serveur.
La plupart des services d'hébergement Web auront PHP et MySQL sont déjà installés. Vous aurez juste à vérifier qu'ils ont les versions les plus récentes de PHP et MySQL pour ce guide pour travailler. Si elles ne sont pas au moins PHP5.3 et MySQL5 vous pourriez vous poser quelques questions au sujet de leur engagement envers la sécurité. Garder vos logiciels à jour est une partie du processus de sécurité.

Si vous avez votre propre serveur ou ordinateur, vous devez installer le logiciel requis dans la voie normale pour votre système. En règle générale, si vous n'êtes pas l'intention d'utiliser l'installation à des fins de production et de vous développer sous Windows ou OS / X, l'installation d'une pile XAMPP est le chemin à parcourir. Obtenez la version appropriée pour votre système d'exploitation à l'adresse:

http://www.apachefriends.org/en/xampp.html

Mais s'il vous plaît noter que vous devez en aucun cas utiliser XAMPP pour créer un environnement de serveur de production pour vous.

Sous Linux, utilisez votre gestionnaire de paquet pour télécharger et installer les paquets nécessaires. Certaines distributions, comme Ubuntu, paquet toutes les applications nécessaires en un seul faisceau. Il suffit de faire ce qui suit à partir d'une fenêtre de terminal dans Ubuntu:

sudo apt-get install lampe-serveur ^ phpmyadmin

Cependant, vous installez les éléments nécessaires, s'il vous plaît vous assurer que vous configurez MySQL avec un mot de passe root sécurisé.

Partie 2 de 8: Configurez la base de données MySQL

1

Créer une base de données MySQL.

Connectez-vous à votre base de données en tant qu'administrateur (habituellement root)

Dans ce guide, nous allons créer une base de données appelée "secure_login".

Voir comment créer une base de données-en-phpMyAdmin.

Vous pouvez soit utiliser le code ci-dessous ou faire la même chose dans phpMyAdmin / votre client MySQL GUI favori, si vous préférez:

CREATE DATABASE `secure_login`;

Remarque: Certains services d'hébergement ne vous permettent pas de créer une base de données via phpMyAdmin, savoir comment le faire dans cPanel.

2

Créez un utilisateur avec seulement SELECT, UPDATE et INSERT privilèges.

Création d'un utilisateur avec des privilèges restreints signifie que si jamais il y avait une violation de la sécurité dans notre script le pirate ne pouvait pas supprimer ou laisser tomber quoi que ce soit à partir de notre base de données. L'utilisation de ces privilèges, vous pouvez obtenir en faisant à peu près tout ce que vous voulez dans votre application. Si vous êtes vraiment paranoïaque, créer un utilisateur pour chaque fonction.

Bien sûr, vous aurez besoin d'être connecté à MySQL comme un utilisateur avec des privilèges suffisants pour créer un utilisateur. Cet utilisateur sera généralement racine.

Ce sont les détails de l'utilisateur que nous avons créé:

Utilisateur: "sec_user"

Mot de passe: "eKcGZr59zAa2BEWU"

Remarque: il est une bonne idée de changer le mot de passe à partir d'une donnée ci-dessus lors de l'exécution sur votre propre serveur. Assurez-vous que, si vous faites cela, que vous modifiez également le code ci-dessous et votre base de données PHP code de connexion dans l'application que nous créons.

Rappelez-vous qu'il n'a pas besoin d'être un mot de passe dont vous vous souviendrez donc faire aussi compliqué que possible. Voici un générateur de mot de passe aléatoire

Étant donné ci-dessous est le code SQL pour créer la base de données utilisateur et lui accordant les autorisations nécessaires. Ou vous pouvez le faire dans une base de données client GUI comme phpMyAdmin si vous préférez:

CREATE USER 'sec_user' @ 'localhost' identified by 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE ON `secure_login` * A 'sec_user' @ 'localhost'.;

Si vous voyez-vous la suppression des enregistrements à partir de l'une des tables de ce module, vous pouvez ajouter DELETE pour la liste des privilèges, ou vous préférerez peut-être créer un utilisateur différent avec juste le droit DELETE, et seulement sur la table à partir de laquelle vous vouloir supprimer des enregistrements si vous ne voulez pas supprimer à la fois. Vous ne devez pas accorder des privilèges supprimer au tout pour rien dans cet exemple de script.

3

Créer une table MySQL nommée «membres».

Le code ci-dessous crée une table avec cinq champs (ID, nom d'utilisateur, email, mot de passe, sel). Nous utilisons le type de données CHAR pour les champs nous savons que la longueur de, que le champs "mot de passe" et "sel" sera toujours 128 caractères. Utilisation CHAR ici permet d'économiser sur la puissance de traitement:

CREATE TABLE `secure_login`.`members` (` id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `username` VARCHAR (30) NOT NULL,` email` VARCHAR (50) NOT NULL, CHAR password` (128) NOT NULL, `salt` CHAR (128) NOT NULL) MOTEUR = InnoDB;

Comme nous l'avons dit avant, vous pouvez le faire dans tout type de client que vous préférez.

4

Créer une table pour stocker les tentatives de connexion.

Nous allons utiliser cette table pour stocker les tentatives de connexion pour un utilisateur. Ceci est un moyen par lequel nous ferons attaques par force brute plus difficile:

CREATE TABLE `secure_login`.`login_attempts` (` INT user_id` (11) NOT NULL, `time` VARCHAR (30) NOT NULL) MOTEUR = InnoDB

5

Créer une ligne de test dans le tableau "membres".

Il sera important d'être en mesure de tester votre script de connexion, donc ci-dessous est le script pour créer un utilisateur avec des détails connus:

Nom d'utilisateur: test_user

Email: test@example.com

Mot de passe: 6ZaxN2Vzm9NUJT2y

Le code que vous avez besoin pour être en mesure de se connecter en tant que cet utilisateur est:

INSERT INTO `VALEURS secure_login`.`members` (1, 'test_user', '' test@example.com, '00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc', 'f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef');

Partie 3 de 8: Create Database Connection Page

1

Créer une page mondiale des configurations

Créez un dossier appelé «comprend» dans le répertoire racine de l'application, puis créer un nouveau fichier PHP dans ce répertoire. Appelez-PSL-config.php. Dans un environnement de production, vous aurez probablement envie de localiser ce fichier et tous vos autres inclure des fichiers, en dehors de la racine des documents du serveur Web. Si vous faites cela, et nous suggérons fortement que vous le faites, vous devrez modifier votre include ou require que nécessaire afin que l'application puisse trouver les fichiers à inclure.

Localiser vos inclure des fichiers en dehors de la racine des documents du serveur Web signifie que votre fichier ne peut être localisé en utilisant une URL. Donc, si quelqu'un à tort chuté l'extension 'php', par exemple, ou foiré les autorisations de fichier le fichier ne pouvait toujours pas être affiché comme du texte dans une fenêtre de navigateur.

Le fichier contient des variables de configuration globale. Des choses comme si tout le monde peut enregistrer, si oui ou non il est un (HTTPS) connexion sécurisée, et des trucs autre ainsi que les détails de base de données pourrait aussi aller ici ...

<? php / ** * Ce sont les détails base de données de connexion * / define ("HOST", "localhost"); // L'hôte que vous souhaitez vous connecter. define ("USER", "sec_user"); // Le nom d'utilisateur de base de données. define ("Mot de Passe", "eKcGZr59zAa2BEWU"); // Le mot de passe de base de données. define ("Base de données", "secure_login"); // Le nom de base de données. define ("CAN_REGISTER", "tout"); define ("DEFAULT_ROLE», «membre»); define ("SECURE", false); // POUR LE DÉVELOPPEMENT SEULEMENT !!!! ?>

2

Créer la page de connexion de base de données

Ceci est le code PHP que nous allons utiliser pour vous connecter à notre base de données mySQL. Créer un nouveau fichier PHP appelé db_connect.php dans l'application de répertoire comprend et ajoutez le code ci-dessous. Vous pouvez ensuite inclure le fichier sur une page que vous souhaitez connecter à la base de données.

<? php include_once 'PSL-config.php'; // Comme functions.php est pas inclus mysqli $ = new mysqli (hôte, utilisateur, Mot de Passe, base de données);

Partie 4 de 8: Créer des fonctions de PHP

Ces fonctions vont faire tout le traitement du script de connexion. Ajouter toutes les fonctions d'une page appelée functions.php dans le répertoire comprend de la demande.

1

Commencer en toute sécurité une session PHP.
Sessions PHP sont connus pour ne pas être sécurisé, il est donc important de ne pas simplement mettre "session_start ();" en haut de chaque page sur laquelle vous voulez utiliser les sessions PHP. Nous allons créer une fonction appelée "sec_session_start ()", ce sera démarrer une session de PHP de manière sécurisée. Vous devriez appeler cette fonction au haut de la page dans laquelle vous souhaitez accéder à une variable de session PHP. Si vous êtes vraiment préoccupés par la sécurité et la vie privée de vos cookies, jeter un oeil à cet article: Create-a-Secure-session-Managment-System-in-Php-Mysql-et.

Cette fonction rend votre script de connexion beaucoup plus sécurisé. Il arrête craquelins accès au cookie de session via JavaScript (par exemple dans une attaque XSS). Aussi le «() session_regenerate_id", ce qui régénère l'identifiant de session sur chaque rechargement de la page, aide à prévenir le détournement de session. Remarque: Si vous utilisez HTTPS dans votre application de connexion Réglez le "$ fixer" variable à true. Dans un environnement de production, il est essentiel que vous utilisez HTTPS.

Créer un nouveau fichier appelé functions.php dans votre application de répertoire comprend et ajoutez le code suivant à elle:

<? php include_once 'PSL-config.php'; sec_session_start fonction () {$ session_name = 'sec_session_id'; // Définir un nom de session personnalisé sécuriser $ = SECURE; // Cela arrête JavaScript pouvoir accéder à l'identifiant de session. $ httponly = true; // Sessions des Forces d'utiliser seulement les cookies. if (ini_set ('session.use_only_cookies', 1) === FALSE) {header ("Location: ../error.php?err=Could pas initier une session fort (ini_set)"); Sortie(); } // Obtient biscuits actuelles params. $ cookieParams = session_get_cookie_params (); session_set_cookie_params ($ cookieParams ["durée de vie"], $ cookieParams ["chemin"], $ cookieParams ["domaine"], $ sécuriser, httponly $); // Définit le nom de la session à celui placé au-dessus. session_name ($ session_name); session_start (); // Démarrer l'session_regenerate_id (vraie) de la session de PHP; // Régénéré la session, supprimer l'ancien. }

2

Créer la fonction login.
Cette fonction vérifie l'e-mail et mot de passe contre la base de données. Il retournera vrai si il ya un match. Ajouter cette fonction à votre fichier functions.php:

fonction login ($ email, mot de passe $, $ mysqli) {// Utilisation d'instructions préparées signifie que l'injection SQL est pas possible. if ($ stmt = $ mysqli-> prepare ("SELECT id, nom d'utilisateur, mot de passe, le sel de membres OÙ email = LIMIT 1?")) {$ stmt-> bind_param ('s', $ email); // Bind "$ email" au paramètre. $ stmt-> execute (); // Exécute la requête préparée. $ stmt-> store_result (); // Obtenir les variables de résultat. $ stmt-> bind_result (user_id $, $ username, $ db_password, $ sel); $ stmt-> fetch (); // Hacher le mot de passe avec le sel unique. $ password = hash ('sha512', $ password $ sel.); if ($ stmt- == 1 num_rows>) {// Si l'utilisateur existe, nous vérifions si le compte est verrouillé // de trop nombreuses tentatives de connexion si (checkbrute ($ user_id, $ mysqli) == true) {// compte est verrouillé // Envoyer un email à l'utilisateur affirmant que leur compte est verrouillé return false; } Else {// Vérifier si le mot de passe dans la base de données correspond // le mot de passe que l'utilisateur a soumis. if ($ db_password == $ password) {// Mot de passe est correct! // Obtenir la chaîne user-agent de l'utilisateur. user_browser $ = $ _SERVER ['HTTP_USER_AGENT']; // Protection XSS que nous pourrions imprimer cette valeur $ user_id = preg_replace ("/ [^ 0-9] + /", "", $ user_id); $ _SESSION ['User_id'] = $ user_id; // Protection XSS que nous pourrions imprimer cette valeur $ username = preg_replace ("/ [^ a-zA-Z0-9 _ \ -] + /", "", $ username); $ _SESSION ['Username'] = $ username; $ _SESSION ['Login_string'] = hash ('sha512', $ password $ user_browser.); // Connexion réussie. return true; } Else {// Mot de passe est incorrect // Nous enregistrons cette tentative dans la base de données $ = temps maintenant (); $ mysqli-> query ("INSERT INTO login_attempts (user_id, temps) VALUES ('$ user_id', '$ maintenant')"); return false; }}} Else {// Aucun utilisateur existe. return false; }}}

3

La fonction Brute Force.
Attaques par force brute sont quand un pirate tente milliers de différents mots de passe sur un compte, soit générée aléatoirement des mots de passe ou d'un dictionnaire. Dans notre script si un compte d'utilisateur a plus de cinq tentatives de connexion à leur compte est verrouillé.

Attaques par force brute sont difficiles à éviter. A quelques façons dont nous pouvons les empêcher utilisent un test CAPTCHA, le verrouillage des comptes d'utilisateurs et en ajoutant un retard sur les échecs de connexion, afin que l'utilisateur ne peut pas se connecter pendant trente secondes.

Nous vous recommandons fortement d'utiliser un CAPTCHA. Pour l'instant nous avons pas mis en œuvre cette fonctionnalité dans l'exemple de code, mais l'espoir de le faire dans un proche avenir, en utilisant secureImage, car il ne nécessite pas d'inscription. Vous préférerez peut-être quelque chose de mieux connus tels que reCAPTCHA de Google.

Quel que soit le système de votre choix, nous vous suggérons d'afficher uniquement l'image CAPTCHA après l'échec de deux tentatives de connexion de manière à ne pas gêner l'utilisateur inutilement.

Lorsqu'ils sont confrontés au problème des attaques par force brute, la plupart des développeurs de bloquer simplement l'adresse IP après un certain nombre d'échecs de connexion. Mais il existe de nombreux outils pour automatiser le processus de fabrication des attaques comme celles-ci; et ces outils peuvent passer par une série de procurations et même changer l'adresse IP à chaque demande. Le blocage de tous ces adresses IP pourrait signifier vous bloquez les utilisateurs légitimes ainsi. Dans notre code, nous allons enregistrer tentatives et fermons le compte de l'utilisateur après cinq tentatives de connexion infructueuses. Cela devrait déclencher l'envoi d'un email à l'utilisateur avec un lien de réinitialisation, mais on n'a pas mis en œuvre cette dans notre code. Voici le code de la fonction checkbrute () au moment de l'écriture. Ajoutez-le à votre code functions.php:

fonction checkbrute (user_id $, $ mysqli) {// Obtenir horodatage du courant $ de temps = temps maintenant (); // Toutes les tentatives de connexion sont comptés à partir des 2 dernières heures. valid_attempts $ = $ maintenant - (2 * 60 * 60); if ($ stmt = $ mysqli-> Préparer ("SELECT temps à partir login_attempts WHERE user_id = et l'heure> '$ valid_attempts'?")) {$ stmt-> bind_param ('i', $ user_id); // Exécute la requête préparée. $ stmt-> execute (); $ stmt-> store_result (); // Si il ya eu plus de 5 connexions échouées if ($ stmt-> num_rows> 5) {return true; } Else {return false; }}}

4

Vérifiez l'état connecté.
Nous faisons cela en cochant la case "user_id" et les variables de session »de login_string". La variable "login_string" de session a les informations de navigateur de l'utilisateur haché avec le mot de passe. Nous utilisons les informations de navigateur, car il est très peu probable que l'utilisateur va changer leur navigateur mi-séance. Faire cela aide à prévenir le détournement de session. Ajouter cette fonction à votre fichier functions.php dans le dossier comprend de votre demande:

fonction login_check (mysqli $) {// Vérifier si toutes les variables de session sont mis if (isset ($ _ SESSION ['user_id'], $ _SESSION ['username'], $ _SESSION ['login_string'])) {$ user_id = $ _SESSION ['user_id']; login_string $ = $ _SESSION ['login_string']; $ username = $ _SESSION ['username']; // Obtenir la chaîne user-agent de l'utilisateur. user_browser $ = $ _SERVER ['HTTP_USER_AGENT']; if ($ stmt = $ mysqli-> prepare ("SELECT mot de passe membres WHERE id =? LIMIT 1")) {// Bind "$ user_id" au paramètre. $ stmt-> bind_param ('i', $ user_id); $ stmt-> execute (); // Exécute la requête préparée. $ stmt-> store_result (); if ($ stmt- num_rows> == 1) {// Si l'utilisateur existe obtenir des variables de résultat. $ stmt-> bind_result ($ password); $ stmt-> fetch (); $ login_check = hash ('sha512', $ password $ user_browser.); if ($ login_check == $ login_string) {// Connecté !!!! return true; } Else {// Non connecté return false; }} Else {// Non connecté return false; }} Else {// Non connecté return false; }} Else {// Non connecté return false; }}

5

Désinfectez URL de PHP_SELF
Cette fonction suivante assainit la sortie de la variable serveur PHP_SELF Il est un Modificaton d'une fonction du même nom utilisé par le système de gestion de contenu WordPress.:

fonction esc_url ($ url) {if ('' == $ url) {return $ url; } $ Url = preg_replace ('| [^ a-z0-9- ~ + _ # = &;, /:.?!% $ @ \ | * \' () \\ X80 - \\ xff] | i ' , '', $ url); $ bande = array ('% 0d', '% 0a', '% 0D', '% 0A "); $ url = (string) $ url; $ count = 1; while ($ count) {$ url = str_replace ($ bande, '', $ url, $ count); } $ Url = str_replace ('; //', ': //', $ url); $ url = htmlentities ($ url); $ url = str_replace ('& amp; »,« & », $ url); $ url = str_replace ("'",' '', $ url); if ($ url [0] == '/'!) {// Nous sommes seulement intéressés par les liens relatifs à partir de $ _SERVER ['PHP_SELF'] retour ''; } Else {return $ url; }}

Le problème avec l'aide de la variable de serveur non filtré est qu'il peut être utilisé dans une attaque cross site scripting. La plupart des références seront tout simplement vous dire à filtrer à l'aide de htmlentities (), mais même cela ne semble pas être suffisante d'où la ceinture et bretelles approche dans cette fonction.

D'autres suggèrent de laisser l'attribut action du formulaire vierge, ou pour régler une chaîne nulle. Ce faisant, cependant, laisse la forme ouverte à une attaque iframe clickjacking.

Partie 5 de 8: Créer le traitement des pages

1

Créer la page de traitement de connexion (process_login.php)

Créer un fichier à traiter les logins, appelé process_login.php en comprend l'application de répertoire. Il va dans ce répertoire car il ne contient pas de balises HTML.

Nous allons utiliser le mysqli_ * ensemble de fonctions de PHP, car cela est l'une des la plupart des extensions de mySQL place à ce jour.

<? php include_once 'db_connect.php'; include_once 'functions.php'; sec_session_start (); // Notre manière sécurisée coutume de démarrage d'une session de PHP. if (isset ($ _ POST ['email'], $ _POST ['p'])) {$ = $ _POST email ['email']; $ password = $ _POST ['p']; // Le mot de passe haché. si (login ($ email, mot de passe $, $ mysqli) == true) {// Connectez-tête de succès ('Location: ../protected_page.php'); } Else {// Échec de la connexion tête ('Location: ../index.php?error=1'); }} Else {// Les variables POST correctes ont pas été envoyés à cette page. echo 'Invalid Request'; }

2

Créez un script de déconnexion.

Votre script de déconnexion doit commencer la session, le détruire et puis rediriger vers un autre endroit. Remarque: ce pourrait être une bonne idée d'ajouter une protection CSRF ici au cas où quelqu'un vous envoie un lien caché dans cette page en quelque sorte. Pour plus d'informations sur CSRF vous pourriez visiter Coding Horror.

Le code actuel pour déconnecter l'utilisateur, que vous devez ajouter à un fichier appelé logout.php en comprend le répertoire de l'application, est:

<? php include_once 'functions.php'; sec_session_start (); // Détruit toutes les Valeurs de session $ _SESSION = array (); // Obtenir les paramètres de session $ params = session_get_cookie_params (); // Supprimer le cookie réelle. setCookie (session_name (), '', le temps () - 42000, $ params ["chemin"], $ params ["domaine"], $ params ["sécuriser"], $ params ["httponly"]); // Détruire la session session_destroy (); header ('Location: ../index.php');

3

Page d'inscription.

Le code d'enregistrement est inclus dans deux nouveaux fichiers, appelé register.php dans le répertoire racine de l'application et register.inc.php dans le répertoire comprend. Il fait les choses suivantes:

Obtient et valide le nom d'utilisateur que l'utilisateur souhaite adopter

Obtient et valide l'adresse de courriel de l'utilisateur

Obtient et valide le mot de passe que l'utilisateur veut utiliser

Hache le mot de passe et passe de nouveau à la page de register.php (il Postes à lui-même)

La plupart de la validation se fait en JavaScript, côté client. Ceci est parce que l'utilisateur n'a pas de motivation pour contourner ces contrôles. Pourquoi un utilisateur voudrait créer un compte qui serait moins sûr que le contraire? Nous allons discuter de la JavaScript dans la section suivante.

Pour l'instant, il suffit de créer le fichier de register.php et inclure le code suivant dedans:

<? php include_once 'comprend / register.inc.php'; include_once "includes / functions.php '; ?> <! DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title> Secure Login: Formulaire d'inscription </ title> <script type = "text / javascript" src = "js / SHA512 .js "> </ script> <script type =" text / javascript "src =" / js forms.js "> </ script> <link rel =" stylesheet "href =" styles / main.css "/> < / head> <body> <! - Formulaire d'inscription pour être sortie si les variables de POST ne sont pas réglées ou si le script d'inscription a provoqué une erreur. -> <H1> Enregistrer avec nous </ h1> <? Php if {echo $ error_msg;? (Empty ($ error_msg)!) }?> <Ul> <li> Les noms d'utilisateur peut contenir seulement des chiffres, lettres et caractères de soulignement majuscules et minuscules </ li> <li> Les e-mails doit avoir un format électronique valide </ li> <li> Les mots de passe doivent avoir au moins 6 caractères à long </ li> <li> Les mots de passe doivent contenir <ul> <li> Au moins un de majuscule (A..Z) </ li> <li> Lettre de cas Au moins un inférieure (z) </ li > <li> Au moins un nombre (0..9) </ li> </ ul> </ li> <li> Votre mot de passe et la confirmation doivent correspondre exactement </ li> </ ul> <form action = "< ? php echo esc_url ($ _ SERVER ['PHP_SELF']);> "method =" post "name =" registration_form "> Nom d'utilisateur: <input type = 'text' name = 'nom d'utilisateur' id = 'nom d'utilisateur' /> < br> Courriel: <input type = "text" name = "email" id = "email" /> <br> Mot de passe: <input type = "mot de passe" name = "mot de passe" id = "password" /> <br> type = valeur <input type = nom de "mot de passe" = "confirmpwd" id = "confirmpwd" /> <br> <input "bouton" = "Register" onclick = "regformhash de retour (this.form, this.form: Confirmation du mot de passe .username, this.form.email, this.form.password, this.form.confirmpwd); " /> </ Form> <p> Retour à la <a href="index.php"> page de connexion </a>. </ P> </ body> </ html>

Le fichier comprend register.inc.php dans le répertoire doit contenir le code suivant:

<? php include_once 'db_connect.php'; include_once 'PSL-config.php'; error_msg $ = ""; if (isset ($ _ POST ['username'], $ _POST ['email'], $ _POST ['p'])) {// Désinfecter et valider les données transmises dans $ username = filter_input (INPUT_POST, 'nom d'utilisateur', FILTER_SANITIZE_STRING); $ email = filter_input (INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); $ email = filter_var ($ email, FILTER_VALIDATE_EMAIL); si {// Pas un email valide error_msg $ = '<p class = "error"> L'adresse e-mail que vous avez entrée est pas valide </ p>' (filter_var ($ email, FILTER_VALIDATE_EMAIL)!).; } $ Password = filter_input (INPUT_POST, 'p', FILTER_SANITIZE_STRING); if (strlen ($ password)! = 128) {// Le PWD hachée devrait être de 128 caractères. // Si elle est pas, quelque chose de vraiment étrange est arrivé $ error_msg =. '<P class = "error"> configuration de mot de passe invalide </ p>.'; } // Nom d'utilisateur et mot de passe validité validité ont été vérifiés côté client. // Cela devrait devrait être suffisant que personne ne gagne aucun avantage de // briser ces règles. // $ Prep_stmt = "SELECT id des membres OÙ email = LIMIT 1?"; $ stmt = $ mysqli-> prepare ($ prep_stmt); // Vérifier le courrier électronique existante if ($ stmt) {$ stmt-> bind_param ('s', $ email); $ stmt-> execute (); $ stmt-> store_result (); if ($ stmt- num_rows> == 1) {// Un utilisateur avec cette adresse email existe déjà error_msg $ =. '<p class = "error"> Un utilisateur avec cette adresse email existe déjà </ p>.'; $ stmt-> close (); } $ Stmt-> close (); } Else {$ error_msg = '<p class = "error"> Base de données erreur Ligne 39 </ p>.'; $ stmt-> close (); } // Vérifier existante nom d'utilisateur $ prep_stmt = "SELECT id des membres WHERE username = LIMIT 1?"; $ stmt = $ mysqli-> prepare ($ prep_stmt); if ($ stmt) stmt- {$> bind_param ('s', $ username); $ stmt-> execute (); $ stmt-> store_result (); if ($ stmt- == 1 de>) {// Un utilisateur avec ce nom d'utilisateur existe déjà error_msg $ = '<p class = "error"> Un utilisateur avec ce nom d'utilisateur existe déjà </ p>.'; $ stmt-> close (); } $ Stmt-> close (); } Else {$ error_msg = '<p class = "error"> ligne d'erreur de base de données 55 </ p>.'; $ stmt-> close (); } // TODO: // Nous aurons aussi pour tenir compte de la situation où l'utilisateur ne possède pas les droits // à faire l'enregistrement, en vérifiant ce type d'utilisateur tente d'// effectuer l'opération. if (empty ($ error_msg)) {// Créer un hasard sel // $ random_salt = hash ('sha512', uniqid (openssl_random_pseudo_bytes (16), true)); // N'a pas travaillé $ random_salt = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); // Créer salé mot de passe $ password = hash ('sha512', $ password $ random_salt.); // Insérer le nouvel utilisateur dans la base de données if ($ insert_stmt = $ mysqli-> prepare ("INSERT INTO membres (nom d'utilisateur, email, mot de passe, sel) VALUES (?,?,?,?)")) {$ Insert_stmt- > bind_param ('ssss', $ username, $ email, mot de passe $, $ random_salt); // Exécute la requête préparée. if (! $ insert_stmt-> execute ()) {header ('Location: échec ../error.php?err=Registration: INSERT'); }} Header ('Location: ./register_success.php'); }}

Si il n'y a pas de données POST passés dans la forme, le formulaire d'inscription est affiché. Le bouton Envoyer le formulaire appelle la fonction JavaScript regformhash (). Cette fonction fait des contrôles de validation nécessaires et soumet le formulaire quand tout va bien. Les fonctions JavaScript sont discutés dans la section suivante.

Si les données POST existe, certains contrôles côté serveur sont faites pour assainir et de le valider. Notez que ces contrôles ne sont pas complètes au moment de l'écriture. Certaines des questions sont mentionnées dans les commentaires dans le fichier. À l'heure actuelle, nous vérifions juste que l'adresse e-mail est dans le format correct, que le mot de passe haché est la bonne longueur et que l'utilisateur ne cherche pas à enregistrer un email qui a déjà été enregistré.

Si tout vérifie, le nouvel utilisateur est inscrit en écrivant un nouveau record dans le tableau des membres.

Partie 6 de 8: Créer des fichiers Javascript

1

Créer un fichier sha512.js

Ce fichier est une implémentation en JavaScript de l'sha512 d'algorithme de hachage. Nous allons utiliser la fonction de hachage afin que nos mots de passe ne sont pas envoyés en texte brut.

Le fichier peut être téléchargé à partir pajhome.org.uk

(Il est également enregistré dans le dépôt github)

Rangez votre copie de ce fichier dans un répertoire appelé "JS", hors du répertoire racine de l'application.

2

Créer un fichier forms.js
Ce fichier, qui vous devez créer dans le répertoire js de la demande, se chargera de la hachage des mots de passe pour la connexion (formhash ()) et formulaires d'inscription (regformhash ()):

fonction formhash (forme, mot de passe) {// Créer une nouvelle entrée de l'élément, ce sera notre champ de mot de passe haché. var p = document.createElement ("input"); // Ajouter le nouvel élément de notre formulaire. form.appendChild (p); p.name = "p"; p.type = "hidden"; Val.par = hex_sha512 (password.value); // Assurez-vous que le mot de passe en texte clair ne sont pas envoyés. password.value = ""; // Enfin soumettre le formulaire. form.submit (); } Function regformhash (forme, uid, email, mot de passe, conf) {// Vérifiez chaque champ a une valeur si (uid.value == '' || email.value == '' || password.value == '' || conf.value == '') {alert ('Vous devez fournir toutes les informations demandées S'il vous plaît essayez à nouveau.'); return false; } // Vérifiez le nom d'utilisateur de re = / ^ \ w + $ /; (! re.test (de form.username.value)) si {alert (". Nom d'utilisateur doit contenir des lettres, des chiffres et caractères de soulignement S'il vous plaît essayer de nouveau"); form.username.focus (); return false; } // Vérifiez que le mot de passe est suffisamment longue (min 6 caractères) // Le contrôle est dupliqué ci-dessous, mais cela est inclus pour donner plus // orientations spécifiques à l'utilisateur si (password.value.length <6) {alert ( 'Les mots de passe doivent avoir au moins 6 caractères S'il vous plaît essayer à nouveau.'); form.password.focus (); return false; } // Au moins un chiffre, une minuscule et une lettre majuscule // Au moins six caractères var re = /(?=.*\d)(?=.*[az])(?=.*[AZ]) . {6} /; si {alert ('Les mots de passe doit contenir au moins un chiffre, une minuscule et une lettre majuscule S'il vous plaît essayer à nouveau.') (re.test (password.value)!); return false; } // Vérifier mot de passe et la confirmation sont les mêmes if (! Password.value = conf.value) {alert ('Votre mot de passe et la confirmation ne correspondent pas S'il vous plaît essayez de nouveau.'); form.password.focus (); return false; } // Créer une nouvelle entrée de l'élément, ce sera notre champ de mot de passe haché. var p = document.createElement ("input"); // Ajouter le nouvel élément de notre formulaire. form.appendChild (p); p.name = "p"; p.type = "hidden"; Val.par = hex_sha512 (password.value); // Assurez-vous que le mot de passe en texte clair ne sont pas envoyés. password.value = ""; conf.value = ""; // Enfin soumettre le formulaire. form.submit (); return true; }

Dans les deux cas, le code JavaScript hache le mot de passe et passe dans les données POST par créer et peupler un champ caché.

Partie 7 de 8: créer des pages HTML

1

Créer le formulaire de connexion (index.php).

Ceci est un formulaire HTML avec deux champs de texte, appelé "e-mail" et "mot de passe". Le bouton Envoyer le formulaire appelle la fonction JavaScript formhash (), qui va générer un hash du mot de passe, et d'envoyer «email» et «p» (le mot de passe haché) au serveur. Vous devez créer ce fichier dans le répertoire racine de l'application.

Lors de la connexion, il est préférable d'utiliser quelque chose qui ne soit pas publique, pour ce guide, nous utilisons le courrier électronique comme identifiant de connexion, le nom d'utilisateur peut ensuite être utilisé pour identifier l'utilisateur. Si l'e-mail ne sont pas affichées sur les pages de l'application plus large, il ajoute une autre inconnue pour quiconque tente de casser le compte.

Remarque: même si nous avons le mot de passe crypté de sorte qu'il ne soit pas envoyé en texte clair, il est essentiel que vous utilisez le protocole HTTPS (TLS / SSL) lors de l'envoi des mots de passe dans un système de production. Il ne peut pas être assez souligné que hachage simplement le mot de passe ne suffit pas. Une attaque man-in-the-middle pourrait être monté à lire le hachage d'être envoyé et l'utiliser pour vous connecter.

<? php include_once 'comprend / db_connect.php'; include_once "includes / functions.php '; sec_session_start (); si (login_check (mysqli $) == true) {$ connecté = 'dans'; } Else {$ connecté = 'out'; }?> <! DOCTYPE html> <html> <head> <title> Secure Login: Connexion </ title> <link rel = "stylesheet" href = "styles / main.css" /> <script type = "text / javascript "src =" / js sha512.js "script> </> <script type =" text / javascript "src =" / js forms.js "> </ script> </ head> <body> <? php if (isset ($ _ GET ['error'])) {echo '<p class = "error"> historique d'erreur, </ p>!'; }?> <Form action = "includes / process_login.php" method = "post" name = "login_form"> Courriel: <input type = "text" name = "email" /> Mot de passe: <input type = "password" name="password" id="password"/> <input type="button" value="Login" onclick="formhash(this.form, this.form.password);" /> </form> <?php if (login_check($mysqli) == true) { echo '<p>Currently logged ' . $logged . ' as ' . htmlentities($_SESSION['username']) . '.</p>'; echo '<p>Do you want to change user? <a href="includes/logout.php">Log out</a>.</p>'; } else { echo '<p>Currently logged ' . $logged . '.</p>'; echo "<p>If you don't have a login, please <a href='register.php'>register</a></p>"; } ?> </body> </html>

2

Create the register_success.php page

Create a new PHP web page called register_success.php, in the root directory of the application. This is the page to which the user is redirected after successfully registering. Of course you can make this page anything you like or redirect to another page entirely (or even not at all). C'est à vous. The page should be located in the root directory of the application. The current register_success.php page that we have written looks like this:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Secure Login: Registration Success</title> <link rel="stylesheet" href="styles/main.css" /> </head> <body> <h1>Registration successful!</h1> <p>You can now go back to the <a href="index.php">login page</a> and log in</p> </body> </html>

3

Create the error page

Create a new HTML page in the root directory of the application. Call it error.php This is the page to which users will be directed if an error occurs during the login or registration process, or when trying to establish a secure session. The code given below simply provides a bare bones error page. You will probably need something a bit more sophisticated. However, please note that the input into the page must be properly filtered to guard against XSS attacks. The example page code is:

<?php $error = filter_input(INPUT_GET, 'err', $filter = FILTER_SANITIZE_STRING); if (! $error) { $error = 'Oops! An unknown error happened.'; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Secure Login: Error</title> <link rel="stylesheet" href="styles/main.css" /> </head> <body> <h1>There was a problem</h1> <p class="error"><?php echo $error; ?></p> </body> </html>

Part 8 of 8: Protecting Pages

1

Page Protection Script.

One of the most common problems with authentication systems is the developer forgetting to check if the user is logged in. It is very important you use the code below on every protected page to check that the user is logged in. Make sure you use this function to check if the user is logged in.

// Include database connection and functions here. See 3.1. sec_session_start(); if(login_check($mysqli) == true) { // Add your protected page content here! } else { echo 'You are not authorized to access this page, please login.'; }

As an example of what you should do, we have included a sample protected page. Create a file called protected_page.php in the root directory of the application. The file should contain something like the following:

<?php include_once 'includes/db_connect.php'; include_once 'includes/functions.php'; sec_session_start(); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Secure Login: Protected Page</title> <link rel="stylesheet" href="styles/main.css" /> </head> <body> <?php if (login_check($mysqli) == true) : ?> <p>Welcome <?php echo htmlentities($_SESSION['username']); ?>!</p> <p> This is an example protected page. To access this page, users must be logged in. At some stage, we'll also check the role of the user, so pages will be able to determine the type of user authorised to access the page. </p> <p>Return to <a href="index.php">login page</a></p> <?php else : ?> <p> <span class="error">You are not authorized to access this page.</span> Please <a href="index.php">login</a>. </p> <?php endif; ?> </body> </html>

Our application redirects to this page after a successful login. Your own implementation does not have to do this, of course.

Conseils

With very few changes these example scripts can be modified to work with other SQL systems such as SQLite or PostgreSQL.

If you're wanting to use a different hashing algorithm rather than sha512, try Whirlpool. Avoid using Gost, sha1 (Unless thoroughly salted and in multiple iterations), and as already stated, md5. Encourage your users to create strong, unique passwords with both uppercase and lowercase letters, numbers, and symbols. Consider having your users create a separate login name from their username for added security.

Stay away from the md5() function in login scripts, the md5 hashing algorithm is now considered insecure.

Use HTML and CSS to format the login form and output pages to your liking.

Avertissements

The use of a CAPTCHA on the login page is highly recommended to make brute force and DoS attacks more difficult. We recommend that the CAPTCHA appear on the form after two failed login attempts. This is not yet implemented in the example code.

Make sure that the user cannot see your PHP script, which may occur due to an incorrect server setup. There is a possibility of the users gathering information about your database names and passwords if your PHP code is visible. Ideally any scripts that are included in other scripts or pages should be located in a directory outside of the server's file system and referenced using a relative path eg include '../../includes/myscript.inc.php'.

The login page and the Registration page must use HTTPS. The scripts in this article do not force you to do this and, indeed, you may find it easier not to during development. But you should not use these scripts in a production environment unless you are using HTTPS.

You may get a better solution than this by using a framework such as Zend 2, Symfony or CakePHP. All of these frameworks have arrangements for secure sessions and modules to assist with the login process. You may also find you write better applications if you use a framework.

The Anti Brute Force of this script, that locks a user account, can be misused very easily. We strongly recommend that you use an anti-brute force technique such as a CAPTCHA.

Centralized sign in solutions exist and are known as Single Sign-On, or SSO. Depending on the need, these may offer superior alternatives to framework sign in solutions since a single login is able to span multiple disparate software applications which may reside on multiple domains. Examples of popular SSO solutions are Barebones SSO, Jasig CAS, and JOSSO.

Nothing is 100% secure. Remember to stay in tune with the latest security news to keep improving the security of your scripts.

[Rédacteur: Admin]
Je vous imagine comme

Articles recommandés

Cliquez Top Ranking