Veuillez noter que ce projet n'est plus activement maintenu.
Ce projet a commencé comme un simple devoir scolaire pour un cours PHP que je suivais. Ensuite, j'ai eu besoin de ce type de système pour un site Web que je créais et j'ai décidé de commencer à me développer. Mot d'avertissement : ce projet est/sera très opiniâtre, ce qui signifie que je n'ajouterai que des fonctionnalités que je trouve moi-même suffisamment utiles ou intéressantes pour développer.
password_hash()
de PHP pour hacher et saler les mots de passe. Les noms d'utilisateur sont enregistrés sous forme de texte brut.PASSWORD_DEFAULT
qui, au moment de la rédaction, utilise BCRYPT.AKA « Pourquoi y a-t-il autant de fichiers ? »
Le panneau d'administration sera ici. Comme pour de nombreuses autres applications Web (comme WordPress), le panneau d'administration est facilement accessible en tapant [host]/admin .
Ce dossier comprend deux fichiers utilisés pour définir certaines options de configuration. Plus d'informations ci-dessous.
Juste quelques goodies CSS pour l'interface utilisateur.
Le programme d'installation automatique réside ici.
Ce dossier contient tous les fichiers .js nécessaires au fonctionnement de l'interface utilisateur.
Ce dossier comprend l'épine dorsale du système. Il contient des fichiers .php pour se connecter à la base de données, se connecter et se déconnecter, enregistrer/créer un nouveau compte et modifier les comptes existants. Il existe également scripts.js qui contient des fonctionnalités JavaScript générales pour l'interface utilisateur. Vous devez insérer les informations de votre base de données dans certificates.php, consultez la section de configuration ci-dessous pour obtenir de l'aide.
Vous devriez lire ceci avant de l'utiliser. C'est juste une licence MIT normale.
Ce fichier.
Ceci est la page de gestion du compte. Les utilisateurs peuvent modifier leur nom d'utilisateur et leur mot de passe ici.
Ce fichier est ici juste pour la démo. Les utilisateurs ne peuvent accéder à cette page que s'ils sont connectés. Sinon, ils sont redirigés vers la page de connexion.
Mon point de vue sur la création d'un formulaire de connexion simple avec Bootstrap. N'hésitez pas à le modifier pour l'adapter à vos besoins.
Mon point de vue sur la création d'un formulaire d'inscription simple avec Bootstrap. N'hésitez pas à le modifier pour l'adapter à vos besoins.
Ceci est utilisé par le programme d'installation automatique pour se supprimer une fois l'installation terminée.
Voici la liste des mots anglais les plus courants. Il est utilisé par le suggéreur de nom d'utilisateur. Vous pouvez remplacer la liste par votre propre fichier .txt. Chaque mot de la liste doit être suivi d'un saut de ligne.
Veuillez noter que les options de configuration sont susceptibles de changer. Revenez souvent.
Si vous vérifiez le dossier /config, vous remarquerez qu’il contient deux fichiers différents. Qu'est-ce qui donne ? Le fichier de configuration principal est config.php . Il inclut des paramètres appliqués au niveau du serveur. Vous devriez principalement éditer ce fichier.
Si vous utilisez également l'interface utilisateur frontale que je propose, vous pouvez/devez également modifier config.js. Vous pouvez y gérer l'apparence des choses pour l'utilisateur moyen. N'oubliez pas que ces paramètres sont uniquement côté client et ne sont en aucun cas appliqués et peuvent donc être modifiés par les utilisateurs.
Nom de l'option | Description | Valeur par défaut | Valeurs prises en charge |
---|---|---|---|
$disableUserSelfRegistration | Empêcher les utilisateurs de s'inscrire | FAUX | Booléen |
$nom d'utilisateurMinLongueur | Nom d'utilisateur le plus court autorisé | 3 | 1 -> |
$nom d'utilisateurMaxLength | Nom d'utilisateur le plus long autorisé | 30 | 1 -> |
$mot de passeMinLongueur | Longueur minimale des mots de passe | 8 | 1 -> |
$nom d'utilisateurRegExp | Tous les noms d'utilisateur doivent correspondre à cette expression régulière | n'importe quelle expression régulière | |
$mot de passeRegExp | Tous les mots de passe doivent correspondre à cette expression régulière | n'importe quelle expression régulière | |
$newAccountAccessLevel | Utile pour créer votre premier compte administrateur | "utilisateur" | "utilisateur", "administrateur" |
$Mode de débogage | Vous permet de désactiver la connexion à la base de données (pour le débogage uniquement) | "Non" | "Non" |
$debugAdminNom d'utilisateur | Vous permet de vous connecter en mode débogage | "administrateur" | n'importe quelle chaîne |
$debugAdminMot de passe | Vous permet de vous connecter en mode débogage | "" | n'importe quelle chaîne |
$debugSkipInstall | Ceci est uniquement à des fins de débogage | FAUX | FAUX |
$délai d'attente | Temps d'inactivité (en secondes) requis pour déconnecter l'utilisateur | 900 | n'importe quel entier |
$adminPanelTimeout | Temps d'inactivité requis pour déconnecter l'utilisateur du panneau d'administration | 450 | n'importe quel entier |
$Messages d'erreur | Afficher des messages d'erreur plus détaillés. Pourrait divulguer des informations sensibles ! | défaut | "par défaut", "verbeux" |
$allowUsernameChange | L'utilisateur devrait-il pouvoir changer son nom d'utilisateur | vrai | Booléen |
$forceHTTPS | Redirige toutes les connexions non HTTPS vers HTTPS et envoie HSTS | FAUX | Booléen |
En 2019, il est considéré comme un risque de sécurité énorme de ne pas utiliser HTTPS pour traiter tout type d'informations sensibles (comme les mots de passe). C'est pourquoi il est fortement recommandé de n'utiliser que des solutions d'hébergement qui le prennent en charge et de modifier cette option sur true. De nos jours, vous pouvez même obtenir le certificat SSL entièrement gratuitement auprès de Let's Encrypt, il n'y a donc aucune raison de ne pas l'utiliser. Cependant, sur certains environnements (mal configurés) SERVER["HTTPS"] superglobal n'est pas défini même lorsque HTTPS est en fait utilisé. Cela entraîne une boucle sans fin de redirection. J’ai moi-même appris cela à mes dépens.
Nom de l'option | Description | Valeur par défaut | Valeurs prises en charge |
---|---|---|---|
désactiverUserSelfRegistration | Désactive tous les éléments de l'interface utilisateur liés à l'enregistrement | FAUX | vrai, faux |
nom d'utilisateurMinLength | Nom d'utilisateur le plus court accepté par l'interface utilisateur | 3 | 1 -> |
nom d'utilisateurMaxLength | Nom d'utilisateur le plus long accepté par l'interface utilisateur | 30 | 1 -> |
mot de passeMinLength | Mot de passe le plus court accepté par l'interface utilisateur | 8 | 1 -> |
nom d'utilisateurRègles | Cette chaîne est affichée si le nom d'utilisateur ne correspond pas à l'expression régulière | n'importe quelle chaîne | |
règles de mot de passe | Cette chaîne est affichée si le mot de passe ne correspond pas à l'expression régulière | n'importe quelle chaîne | |
activer les suggestions de nom d'utilisateur | Vous permet de désactiver ou d'activer les suggestions de nom d'utilisateur | vrai | Booléen |
autoriser le changement de nom d'utilisateur | L'utilisateur doit-il pouvoir changer son nom d'utilisateur (interface utilisateur uniquement) | vrai | Booléen |
activer le message de connexion | Afficher n'importe quel message sur la page de connexion | FAUX | Booléen |
connexionMessage | Définir le message à afficher lorsque EnableLoginMessage est vrai | "" | n'importe quelle chaîne |
Comme indiqué précédemment, vous aurez besoin d'une base de données MySQL. La base de données ne nécessite pas beaucoup d'espace (sauf si vous avez BEAUCOUP d'utilisateurs) et toute version assez récente de MySQL devrait fonctionner. Vous pouvez configurer votre base de données et créer un compte administrateur manuellement, ou vous pouvez utiliser mon programme d'installation automatique.
Au cours de la première étape de l'installation, le programme d'installation doit écrire un fichier sur le lecteur de votre hôte. Si vous ne disposez pas des autorisations appropriées pour cela, vous devez effectuer l'installation manuellement. Voir les instructions ci-dessous.
users
avec cinq colonnes : username
, password
, accessLevel
, lastLogin
et rememberMeToken
. Utilisez un type de données chaîne comme CHAR. Personnellement, j'aime utiliser VARCHAR. Pour la lastLogin
je recommande INT(11). J'ajouterais également un champ d'identification à incrémentation automatique comme clé primaire, mais ce n'est pas strictement obligatoire.Si vous utilisez VARCHAR ou un autre type de données avec une longueur de chaîne maximale variable, le tableau ci-dessous vous sera utile.
Champ | Longueur requise (minimum) |
---|---|
nom d'utilisateur | Identique à $usernameMaxLength dans config.php |
mot de passe | Je recommande d'utiliser 255 pour être sûr (car la méthode de cryptage par défaut de PHP peut changer) |
niveau d'accès | 5 |
dernière connexion | 11 |
souviens-toi de moiToken | 255 |
Ne vous inquiétez pas, quelque chose comme ceci devrait vous couvrir :
CREATE TABLE IF NOT EXISTS users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR ( 64 ) NOT NULL UNIQUE,
password VARCHAR ( 255 ) NOT NULL ,
accessLevel VARCHAR ( 10 ) NOT NULL ,
lastLogin INT ( 11 ),
rememberMeToken VARCHAR ( 255 )
);
Après avoir configuré la base de données, vous devrez créer votre premier compte administrateur. Il y a deux façons de procéder :
admin
et un mot de passe généré aléatoirement. (Si vous avez suivi mon exemple SQL ci-dessus et défini la contrainte UNIQUE sur le champ du nom d'utilisateur, le compte ne sera pas créé s'il existe déjà. Vous ne recevrez pas de message d'erreur) Après avoir créé le compte administrateur, vous devez le supprimer. (ou renommez) le dossier /install. Enfin, connectez-vous au compte nouvellement créé et modifiez le mot de passe à l'aide de la page de gestion du compte.OU
$newAccountAccessLevel
dans config/config.php en "admin", puis créer un nouveau compte en utilisant le formulaire d'inscription normal. Vous devez supprimer le dossier /install pour pouvoir accéder à la page de connexion. N'oubliez pas de redéfinir la valeur sur "user" par la suite.IMPORTANT! Je vous rappelle encore une fois que vous DEVEZ supprimer le dossier /install avant de l'utiliser dans un environnement de production en direct. Sinon, n’importe qui peut voir les informations d’identification de votre base de données !
Après la configuration, vous pouvez créer de nouveaux comptes (administrateur ou normal) à l'aide du panneau d'administration.
Cela signifie que le programme d'installation a remarqué que la fonction random_bytes(int)
n'existe pas ou ne fonctionne pas correctement. Si vous utilisez une version PHP antérieure à 7.0, vous devez utiliser une bibliothèque tierce qui implémente cette fonction. Pour PHP 5.x, je recommande celui-ci.
La valeur par défaut de MySQL est 3306.
Cela se produit lorsque l'assistant ne parvient pas à se supprimer. Cela est généralement dû à certaines autorisations restrictives sur l'hôte. Résolvez le problème en supprimant manuellement le dossier /install.
Consultez les conseils de dépannage dans la FAQ générale ci-dessous.
Le panneau d’administration en est à ses premiers stades de développement. Beaucoup de choses pourraient être cassées.
D'autres seront ajoutés à l'avenir.
/admin
Lisez config.php plus attentivement.
Cela signifie que PDOException
s'est produite lors de la tentative de connexion à la base de données. Vous pouvez activer des messages d'erreur plus détaillés dans /config/config.php . Les causes les plus courantes sont :
PDO_MYSQL
n'est pas disponible ou configuré correctement.PDO_MYSQL
. Non, ce n'est pas le cas et ça dure depuis bien trop longtemps, je sais. Je prévois d'y arriver bientôt™. Mise à jour : cela fonctionne maintenant. Veuillez noter qu'il ne mémorise la connexion que pendant 30 jours (pour des raisons de sécurité).
Oui, je sais que la mise en œuvre de quelque chose comme ça ouvre toujours de nouvelles failles de sécurité. Cependant, je n'oblige pas les utilisateurs à l'utiliser ou quoi que ce soit. Si l'utilisateur ne coche pas la case, aucun jeton d'accès n'est créé, il n'y a donc aucun risque de sécurité pour cet utilisateur.
random_bytes()
sécurisée cryptographiquement. Ce jeton est enregistré dans la base de données et deux cookies sont envoyés au navigateur. La valeur du premier cookie est le nom d'utilisateur de l'utilisateur sous forme de texte brut. Le deuxième cookie est bien plus important. Sa valeur est le jeton créé.Le principal problème est que si « le méchant » parvient d’une manière ou d’une autre à accéder au jeton de l’utilisateur, il peut facilement falsifier un cookie et se connecter en tant qu’utilisateur. Il existe deux manières pour le méchant d'accéder au jeton de l'utilisateur : en l'obtenant d'une manière ou d'une autre (par exemple, par injection SQL) à partir de la base de données ou en volant le cookie et/ou sa valeur à l'utilisateur.
Je considère cela comme un risque de sécurité car certaines personnes seraient enclines à utiliser des mots de passe trop simples ou trop identiques. Cependant, je pourrais autoriser cela dans les versions futures via une option de configuration.