FreeMessage
Une application web sociale où l'on publie des messages (texte et image) dans des catégories thématiques, où l'on réagit aux publications et où on les commente.
Fiche projet
- Stack
- PHP 8 · Twig 3 · MySQL / MariaDB · HTML / CSS / JavaScript vanilla · Composer
- Architecture
- MVC construit à la main, sans framework
- Base de données
- 6 tables relationnelles avec clés étrangères
- Interface
- Responsive, en CSS pur, sans framework ni étape de build
- 8catégories thématiques
- 6tables SQL
- 0framework
Le projet en bref
FreeMessage est un réseau social organisé en 8 catégories : jeux vidéo, musique, films, livres, sport, peinture et dessin, photographie et séries. Je l'ai développé en PHP natif, sans framework, avec une architecture MVC construite à la main : un routeur, des contrôleurs, des modèles et des vues Twig.
L'objectif était de comprendre et de maîtriser tout ce qu'un framework fait habituellement à notre place : le routage, les sessions, la sécurité des formulaires, l'envoi de fichiers et l'accès à la base de données.
Fonctionnalités
Comptes utilisateurs
- Inscription et connexion avec des mots de passe hachés (
password_hash/password_verify). - Pages protégées : un visiteur non connecté est redirigé vers la page de connexion.
- Profil personnel : biographie modifiable, changement d'identifiant et liste de ses propres publications.
Publications
- Publier un message dans une catégorie, avec ou sans image.
- Envoi d'images sécurisé : extensions autorisées (jpg, png, gif, webp), taille limitée à 5 Mo, vérification que le fichier est bien une image (
getimagesize) et renommage pour éviter les collisions. - Deux tris des publications d'une catégorie : les plus récentes ou les plus likées.
- Dates en français (« 28 juillet ») grâce à un filtre Twig personnalisé.
- Suppression de ses propres publications.
Interactions
- Likes et dislikes asynchrones : la réaction est envoyée avec
fetch(), sans recharger la page. - Une seule réaction par message : like et dislike s'excluent. Un second clic annule la réaction, et passer de l'un à l'autre met à jour les deux compteurs.
- Commentaires sur chaque publication, avec le motif Post/Redirect/Get pour qu'un rechargement de la page ne renvoie pas le commentaire.
Panneau d'administration
- Gestion des publications, avec leurs commentaires, et gestion des comptes utilisateurs.
- Recherche et tri des tableaux côté client (par date, par exemple).
- Accès réservé au compte administrateur.
Interface
- Responsive : barre de navigation en bas de l'écran sur mobile et tablette, barre latérale sur ordinateur.
- Design modernisé en CSS pur, sans framework CSS ni étape de build.
Sécurité
| Menace | Protection mise en place |
|---|---|
| Injection SQL | Toutes les requêtes passent par des requêtes préparées mysqli |
| CSRF | Jeton unique par session (random_bytes), vérifié sur chaque requête POST avec hash_equals |
| XSS | Échappement automatique des sorties par Twig |
| Mots de passe | Hachage avec password_hash (bcrypt) |
| Fichiers malveillants | Liste blanche d'extensions, limite de taille, contrôle du contenu réel du fichier |
| Double soumission | Motif PRG (Post/Redirect/Get) |
Architecture
Chaque requête HTTP passe par .htaccess vers un point d'entrée unique,
routeur.php, qui vérifie le jeton CSRF et distribue les routes. Le contrôleur porte la
logique métier et le rendu des vues ; le modèle regroupe les requêtes SQL vers MySQL / MariaDB
(tables utilisateur, message, commentaire, réaction, catégorie et type).
- URL propres (
/categorie/3,/commentaires/12…) grâce à la réécriture d'URL Apache. - Héritage de templates Twig : un gabarit parent (navigation, pied de page) et une vue enfant par page.
- Compteurs dénormalisés (
nbrLike,nbrDislike,nbrCom) dans la table des messages, pour trier par popularité sans jointure coûteuse.
Compétences mobilisées
- Conception d'une architecture MVC sans framework
- Modélisation d'une base de données relationnelle (6 tables, clés étrangères)
- Sécurité web : CSRF, injection SQL, XSS, envoi de fichiers, hachage des mots de passe
- JavaScript asynchrone (
fetch) pour une interface plus fluide - Moteur de templates Twig, dont la création d'un filtre personnalisé
- Responsive design en CSS natif
- Gestion des dépendances avec Composer et suivi de version avec Git