Juste une simple solution d'authentification utilisateur dans un squelette de framework ultra-simple qui fonctionne immédiatement (et est livré avec un installateur automatique), utilisant l'implémentation officielle de hachage/saltage de mot de passe bcrypt à l'épreuve du temps de PHP 5.5+, plus quelques fonctionnalités intéressantes qui accéléreront considérablement le temps entre l'idée et le premier prototype d'application utilisable. Rien de plus. Ce projet se concentre sur la simplicité hardcore. Tout est aussi simple que possible, conçu pour les petits projets, le travail d'agence typique et les ébauches rapides. Si vous souhaitez créer des applications d'entreprise massives avec toutes les fonctionnalités des frameworks modernes, jetez un œil à Laravel, Symfony ou Yii, mais si vous souhaitez simplement créer rapidement quelque chose qui fonctionne, alors ce script pourrait être intéressant pour vous.
L'architecture aussi simple que possible de HUGE a été inspirée par plusieurs conférences, diapositives et articles sur d'énormes applications qui - étonnamment et intentionnellement - reviennent aux bases de la programmation, en utilisant une programmation procédurale, des classes statiques, des constructions extrêmement simples, pas totalement SÈCHES. code etc. tout en gardant le code extrêmement lisible (StackOverflow, Wikipedia, SoundCloud).
Quelques mots à la mode intéressants dans ce contexte : KISS, YAGNI, Feature Creep, Minimum viable product.
Pour garder ce projet stable, sécurisé, propre et minimal, j'ai décidé de réduire le développement d'HUGE au minimum. Ne vous inquiétez pas, c'est en fait une bonne chose : les nouvelles fonctionnalités signifient généralement de nouveaux bugs, de nombreux tests, correctifs, incompatibilités et, pour certaines personnes, même un stress de mise à jour intense. Comme HUGE est un script critique pour la sécurité, les nouvelles fonctionnalités ne sont pas aussi importantes qu'un noyau stable et sécurisé, c'est pourquoi les gens l'utilisent. Cela signifie:
Et pour être honnête, maintenir un framework gratuitement pendant mes rares temps libres n’est pas non plus ce que je souhaite faire de façon permanente. :)
Enfin, une petite note : le monde PHP a considérablement évolué, nous avons d'excellents frameworks avec des fonctionnalités impressionnantes et de grandes équipes professionnelles derrière, des documentations très bien écrites et de grandes communautés, il n'y a donc tout simplement aucune raison de consacrer beaucoup de travail à un autre framework. Au lieu de cela, veuillez vous engager dans les frameworks populaires, votre travail aura alors beaucoup plus d'impact et sera utilisé par beaucoup plus de personnes !
Merci à tout le monde autour de ce projet, passez un merveilleux moment ! XOXO, Chris
En 2010/2011, il n'existait aucune solution de connexion utile dans le monde PHP, du moins pas pour les non-experts. J'ai donc commis la pire erreur que tout jeune développeur puisse commettre : essayer de créer quelque chose par moi-même sans avoir la moindre idée des bases de la sécurité. Ce qui a aggravé la situation, c'est que le Web était (et est) plein de tutoriels totalement erronés sur la création de systèmes d'authentification des utilisateurs, même les plus grandes entreprises du monde l'ont complètement mal fait (nous parlons ici de SONY, LinkedIn et Adobe), et également de nombreux frameworks majeurs dans tous les grands langages de programmation (!) utilisaient des technologies de sauvegarde de mot de passe totalement obsolètes et non sécurisées.
Cependant, en 2012, l'expert en sécurité Anthony Ferrara a publié une petite bibliothèque PHP, permettant un hachage de mots de passe extrêmement sécurisé, moderne et correct en PHP 5.3 et 5.4, utilisable par tout développeur sans aucun stress et sans aucune connaissance des éléments de sécurité internes. Le script était tellement génial qu'il a été écrit au cœur de PHP 5.5, c'est le standard de facto de nos jours.
Lorsque cela est sorti, j'ai essayé d'utiliser cette bibliothèque nue pour créer un système de connexion prêt à l'emploi entièrement fonctionnel pour plusieurs projets privés et commerciaux, et j'ai mis le code sur GitHub. Beaucoup de gens ont trouvé cela utile, ont contribué et corrigé des bugs au projet, créé des forks, des versions plus petites et plus grandes. Le résultat est ce projet.
Remarque : désormais, en 2015, la plupart des principaux frameworks intègrent par défaut une excellente logique d'authentification des utilisateurs. Ce n’était pas le cas il y a des années. Du point de vue actuel, il serait peut-être plus judicieux de choisir Laravel, Yii ou Symfony pour des projets sérieux. Mais n'hésitez pas à essayer HUGE, l'installateur automatique lancera une installation entièrement fonctionnelle en quelques minutes et sans aucune configuration.
Et pourquoi le nom « ÉNORME » ? C'est une belle combinaison avec TINY, MINI et MINI2, MINI3, qui font partie de mes autres projets plus anciens. Micro-frameworks super minimaux pour le développement extrêmement rapide et simple de sites Web simples.
Voir une démo en direct de l'ancienne version 3.0 ici et du phpinfo() du serveur ici.
Il y a beaucoup de travail derrière ce projet. Je pourrais vous faire économiser des centaines, voire des milliers d'heures de travail (calculez cela en coûts de développement). Ainsi, lorsque vous gagnez de l'argent en utilisant ÉNORME, soyez juste et redonnez quelque chose à l'open source. HUGE est totalement gratuit pour un usage privé et commercial.
Soutenez le projet en louant un serveur chez DigitalOcean ou en offrant simplement un café sur BuyMeACoffee.com. Merci! :)
N'hésitez pas également à contribuer à ce projet.
Licence sous MIT. Totalement gratuit pour les projets privés ou commerciaux.
Assurez-vous de connaître les bases de la programmation orientée objet et de MVC, d'être capable d'utiliser la ligne de commande et d'avoir déjà utilisé Composer. Ce script n'est pas destiné aux débutants.
Yo, entièrement automatique. Pourquoi ? Parce que j'ai toujours détesté passer des journées à essayer de savoir comment installer quelque chose. Cela vous fera gagner beaucoup de temps et de nerfs. Donnez un café si vous l'aimez.
Si vous utilisez Vagrant pour votre développement, alors simplement
vagrant box add ubuntu/trusty64
vagrant up
dans ce dossier.5 minutes plus tard, vous aurez un ÉNORME entièrement installé dans Ubuntu 14.04 LTS. Le code complet sera automatiquement synchronisé avec le dossier actuel. Le mot de passe root MySQL et le mot de passe root PHPMyAdmin sont définis sur 12345678 . Par défaut 192.168.33.111 est l’IP de votre nouvelle box.
Installation extrêmement simple sur un serveur Ubuntu 14.04 LTS typique, frais et nu :
Téléchargez le script d'installation
wget https://raw.githubusercontent.com/panique/huge/master/_one-click-installation/bootstrap.sh
Rendre le exécutable
chmod +x bootstrap.sh
Exécutez-le ! Donnez-lui quelques minutes pour effectuer toutes les tâches. Et oui, vous pourrez me remercier plus tard :)
sudo ./bootstrap.sh
Composer install
sur le dossier racine de l'application pour installer les dépendances"L'email ne fonctionne pas" ? Voir le dépannage ci-dessous. FAIRE
Ceci est juste un guide rapide pour configurer facilement un environnement de développement !
Assurez-vous d'avoir installé Apache, PHP 5.5+ et MySQL. Tutoriel ici. Nginx fonctionnera certainement aussi, mais aucune directive d'installation n'est encore disponible.
Modifiez vhost pour rendre possible des URL propres et acheminer tout le trafic vers le dossier /public de votre projet :
sudo nano /etc/apache2/sites-available/000-default.conf
et donne au fichier l'apparence
<VirtualHost *:80>
DocumentRoot "/var/www/html/public"
<Directory "/var/www/html/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Activez mod_rewrite et redémarrez Apache.
sudo a2enmod rewrite
service apache2 restart
Installez curl (nécessaire pour utiliser git), openssl (nécessaire pour cloner depuis GitHub, car github est uniquement https), PHP GD, la bibliothèque graphique (nous créons des captchas et des avatars) et git.
sudo apt-get -y install curl
sudo apt-get -y install php5-curl
sudo apt-get -y install openssl
sudo apt-get -y install php5-gd
sudo apt-get -y install git
git clone ÉNORME
sudo git clone https://github.com/panique/huge " /var/www/html "
Installer le compositeur
curl -s https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Accédez au dossier du projet, chargez les packages Composer (--dev est facultatif, vous connaissez le problème)
cd /var/www/html
composer install --dev
Exécutez les instructions SQL. Via phpmyadmin ou via la ligne de commande par exemple. 12345678 est l'exemple de mot de passe. Notez que ceci est écrit sans espace.
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/01-create-database.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/02-create-table-users.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/03-create-table-notes.sql "
Rendre le dossier avatar accessible en écriture (assurez-vous que c'est le bon chemin !)
sudo chown -R www-data " /var/www/html/public/avatars "
Si cela ne fonctionne pas pour vous, vous pouvez essayer à la dure en définissant alternativement
sudo chmod 0777 -R " /var/www/html/public/avatars "
Supprimer le fichier de démonstration par défaut d'Apache
sudo rm " /var/www/html/index.html "
Modifiez la configuration de l'application dans application/config/config.development.php et indiquez les informations d'identification de votre base de données.
Dernière partie (pas nécessaire pour un premier test) : définissez vos informations d'identification SMTP dans le même fichier et définissez EMAIL_USE_SMTP sur true, afin de pouvoir envoyer des e-mails appropriés. Il est fortement recommandé d'utiliser SMTP pour l'envoi de courrier ! L'envoi natif via mail() de PHP ne fonctionnera pas dans presque tous les cas (blocage du spam). J'utilise SMTP2GO.
Vérifiez ensuite l'IP/le domaine de votre serveur. Tout devrait bien fonctionner.
Il s'agit d'une configuration NGINX non testée. Veuillez commenter le ticket si vous rencontrez des problèmes.
server {
# your listening port
listen 80;
# your server name
server_name example.com;
# your path to access log files
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
# your root
root /srv/www/example.com/public_html;
# huge
index index.php;
# huge
location / {
try_files $uri /index.php?url=$uri&$args;
}
# your PHP config
location ~ .php$ {
try_files $uri = 401;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Un grand merci à Razuro pour cette belle configuration : placez-le dans votre dossier racine, mais ne mettez aucun web.config dans votre dossier public.
<?xml version="1.0" encoding="UTF-8"?><configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="public/index.php?url={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Trouvez le billet original ici.
Par défaut, il y a deux utilisateurs démo, un utilisateur normal et un utilisateur administrateur. Pour plus d'informations à ce sujet, veuillez consulter la partie rôle de l'utilisateur du petit bloc de documentation à l'intérieur de ce fichier Lisez-moi.
Utilisateur normal : le nom d'utilisateur est demo2
et le mot de passe est 12345678
. L'utilisateur est déjà activé. Utilisateur administrateur (peut supprimer et suspendre d'autres utilisateurs) : le nom d'utilisateur est demo
, le mot de passe est 12345678
. L'utilisateur est déjà activé.
Il existe plusieurs fichiers dans le dossier racine du projet qui peuvent être irritants :
README et CHANGELOG s'expliquent d'eux-mêmes.
Une véritable documentation est en préparation. En attendant, jetez un œil au code et utilisez les fonctionnalités de complétion de code de votre IDE pour avoir une idée du fonctionnement des choses. C'est assez évident lorsque vous regardez les fichiers du contrôleur, les fichiers de modèle et la façon dont les données sont affichées dans les fichiers de vue. Un grand désolé qu'il n'y ait pas encore de documentation, mais le temps est rare et nous faisons tous cela gratuitement pendant notre temps libre :)
Il existe actuellement deux types d'utilisateurs : les utilisateurs normaux et les administrateurs. Il y a exactement les mêmes, mais...
Les utilisateurs administrateurs peuvent supprimer et suspendre d'autres utilisateurs, ils disposent d'un bouton supplémentaire "admin" dans la navigation. Les utilisateurs administrateurs ont une valeur de 7
dans le champ de la table de base de données user_account_type
. Ils ne peuvent pas mettre à niveau ou rétrograder leurs comptes (car cela n'aurait aucun sens).
Les utilisateurs normaux n’ont certainement pas de fonctionnalités d’administration. Mais ils peuvent mettre à niveau et rétrograder leurs comptes (essayez-le via /user/changeUserRole), ce qui est fondamentalement une implémentation ultra-simple du concept d'utilisateur de base/d'utilisateur premium. Les utilisateurs normaux ont une valeur de 1
ou 2
dans le champ de la table de base de données user_account_type
. Par défaut, tous les nouveaux utilisateurs enregistrés sont des utilisateurs normaux avec le rôle d'utilisateur 1, bien sûr.
Consultez la section « Tests avec des utilisateurs de démonstration » de ce fichier Lisez-moi pour plus d'informations.
Il existe également une pull request très intéressante ajoutant des rôles et des autorisations utilisateur, qui n'est pas intégrée au projet car trop avancée et complexe. Mais c’est peut-être exactement ce dont vous avez besoin, n’hésitez pas à essayer.
Pour empêcher les attaques CSRF, HUGE le fait de la manière la plus courante, en utilisant un jeton de sécurité lorsque l'utilisateur soumet des formulaires critiques. Cela signifie : lorsque PHP restitue un formulaire pour l'utilisateur, l'application place une "chaîne aléatoire" à l'intérieur du formulaire (en tant que champ de saisie caché), générée via Csrf::makeToken() (application/core/Csrf.php), qui enregistre également ce jeton dans la session. Lorsque le formulaire est soumis, l'application vérifie si la requête POST contient exactement le jeton de formulaire qui se trouve à l'intérieur de la session.
Cette fonctionnalité de prévention CSRF est actuellement implémentée sur le processus de formulaire de connexion (voir application/view/login/index.php ) et le processus de formulaire de changement de nom d'utilisateur (voir application/view/user/editUsername.php ), la plupart des autres formulaires ne sont pas sécurisés. critique et doit rester aussi simple que possible.
Donc, pour faire cela avec un formulaire normal, simplement : Dans votre formulaire, avant le bouton de soumission, mettez : <input type="hidden" name="csrf_token" value="<?= Csrf::makeToken(); ?>" />
Ensuite, dans l'action du contrôleur, validez le jeton CSRF soumis avec le formulaire en faisant :
// check if csrf token is valid
if (!Csrf::isTokenValid()) {
LoginModel::logout();
Redirect::home();
exit();
}
Un grand merci à OmarElGabry pour cette mise en œuvre !
En théorie : Oui, mais cette fonctionnalité n'a pas fonctionné lors de mes tests. Comme il s'agit d'une fonctionnalité externe, veuillez consulter le ticket correspondant pour en savoir plus.
Il existe des fonctionnalités géniales ou des idées de fonctionnalités créées par des personnes formidables, mais ces fonctionnalités sont trop intéressantes pour être intégrées à la version principale de HUGE, mais jetez un œil à ces tickets si vous êtes intéressé :
L'idée de ce projet est et était de fournir une application barebone ultra simple avec un système d'authentification utilisateur complet qui fonctionne parfaitement et de manière stable. En raison de la nature hautement liée à la sécurité de ce script, tout changement signifie beaucoup de travail, beaucoup de tests, détecter les cas extrêmes, etc., et à la fin, j'ai passé 90 % du temps à tester et à corriger de nouvelles fonctionnalités ou de nouvelles fonctionnalités brisent celles existantes. des trucs, et faire ça n'est vraiment pas ce que quiconque veut faire gratuitement pendant les rares temps libres :)
Pour garder le projet stable, propre et maintenable, j'aimerais bien annoncer la "fin de vie douce" pour ce projet, c'est-à-dire :
A. HUGE ne bénéficiera pas de nouvelles fonctionnalités à l'avenir, mais... B. des corrections de bugs et des corrections seront apportées, probablement pendant des années
Pendant que HUGE était en développement, il y avait 3 règles principales qui m'ont aidé (et probablement d'autres) à écrire du code minimal, propre et fonctionnel. Cela pourrait également vous être utile :
Comme indiqué dans l'introduction de ce README, il existe également des concepts puissants qui pourraient vous aider lors du développement de trucs intéressants : KISS, YAGNI, Feature Creep, Minimum viable product.
Pour éviter un travail inutile pour nous tous, je recommanderais à tout le monde d'utiliser HUGE pour un projet simple qui n'a besoin que des fonctionnalités qui existent déjà, et si vous avez vraiment besoin d'une architecture RESTful, de migrations, de routage, de 2FA, etc., alors c'est plus facile, plus propre et plus rapide pour utiliser simplement Laravel, Symfony ou Zend.
Cependant, voici les fonctionnalités possibles suggérées par la communauté, tirées de nombreux tickets. N'hésitez pas à les implémenter dans vos forks du projet :
Il y avait deux (!) forums de support pour les v1 et v2 de ce projet (ÉNORME c'est la v3), et tous deux ont été vandalisés par des personnes qui n'ont même pas lu le fichier readme et/ou les directives d'installation. La question la plus posée était "le script ne fonctionne pas, aide svp" sans donner aucune information utile (comme le code ou la configuration du serveur ou même la version utilisée). Pendant que j'écris ces lignes, quelqu'un vient de demander via Twitter "comment installer sans Composer". Vous voyez ce que je veux dire :) - 99% des questions n'étaient pas nécessaires si les gens avaient lu les lignes directrices, effectué une recherche minimale par eux-mêmes ou arrêté de compliquer inutilement les choses. Et même en écrivant des réponses détaillées, la plupart d'entre eux ont encore tout gâché, ce qui a entraîné des diatribes et des plaintes (pour une assistance gratuite pour un logiciel gratuit !). C'était tout simplement frustrant de gérer cela tous les jours, surtout quand les gens tiennent pour acquis qu'il est du devoir des développeurs open source de fournir un support détaillé, gratuit et personnel pour chaque demande d'aide "svp".
J'ai donc décidé d'arrêter complètement tout support gratuit. Pour des questions sérieuses sur des problèmes réels dans le script, veuillez utiliser la fonctionnalité Problèmes de GitHub.
Des mots durs, mais comme pratiquement tous les projets Internet publics sont harcelés, vandalisés et trollés de nos jours par des personnes très étranges, il est nécessaire : Quelques règles simples.
Respectez le fait qu'il ne s'agit que d'un simple script écrit par des bénévoles non rémunérés pendant leur temps libre. Il ne s'agit PAS d'un logiciel professionnel que vous avez acheté pour 10 000 $. Il n'y a aucune raison de se plaindre (!) des logiciels open source gratuits. L'attitude contre le logiciel libre est vraiment frustrante de nos jours, les gens prennent tout pour acquis sans se rendre compte du travail qui se cache derrière, et du fait qu'ils obtiennent des logiciels sérieux totalement gratuitement, économisant des milliers de dollars. Si vous ne l’aimez pas, ne l’utilisez pas. Si vous souhaitez une fonctionnalité, essayez de participer au processus, peut-être même de la créer vous-même et de l'ajouter au projet ! Soyez gentil et respectueux. Les critiques constructives sont toujours les bienvenues !
Ne dénigrez pas, ne détestez pas, ne spammez pas, ne vandalisez pas. S'il vous plaît, ne demandez pas de soutien personnel gratuit, ne demandez pas si quelqu'un pourrait faire votre travail à votre place. Avant de demander quelque chose, assurez-vous d'avoir lu le README, suivi chaque didacticiel, revérifié le code et essayé de résoudre le problème par vous-même.
Les trolls et les personnes très ennuyeuses recevront un bannissement/blocage permanent. GitHub dispose d'une équipe anti-abus très puissante.
Veuillez vous engager uniquement dans la branche de développement . La branche master contiendra toujours la version stable.
Scrutinizer (branche principale), Scrutinizer (branche de développement), Code Climate, Codacy, SensioLabs Insight.
En raison des conséquences possibles lors de la publication d'un bug sur un projet open source public, je vous demanderais de bien vouloir envoyer les très gros bugs à mon adresse e-mail, sans les publier ici. Si le bug n'intéresse pas les attaquants : N'hésitez pas à créer un ticket GitHub normal.
Voir les problèmes actifs ici : https://github.com/panique/huge/issues?state=open
Problème intéressant : lorsqu'un utilisateur accède à votre site Web, le navigateur de l'utilisateur demandera également une ou plusieurs (!) favicons (de différentes tailles). Si ces fichiers statiques n'existent pas, votre application commencera à générer une réponse 404 et une page 404 pour chaque fichier. Cela gaspille beaucoup de puissance du serveur et est également inutile, alors assurez-vous de toujours avoir des favicons ou gérez cela à partir du niveau Apache/nginx.
HUGE essaie de gérer cela en envoyant une image vide dans l'en-tête du view/_templates/header.php !
Plus à l'intérieur de ce ticket : retournez le bon 404 pour les favicon.ico manquants, les images manquantes, etc.
Plus d'informations ici sur Stackflow : Comment empêcher les requêtes favicon.ico ? N'est-il pas idiot qu'un petit favicon nécessite encore une autre requête HTTP ? Comment faire en sorte que le favicon entre dans un sprite ?
Je blogue également sur Dev Metal .