Aller au contenu

3. Middelware d'authentification⚓︎

Compétences

B3.5. Cybersécurisation d’une solution applicative et de son développement

  • Prise en compte de la sécurité dans un projet de développement d’une solution applicative

Définition Middelware

Dans le contexte d'un framework PHP, un middleware est une composante logicielle qui agit comme une couche intermédiaire entre la requête entrante et la réponse sortante dans le processus de traitement d'une application web. Les middlewares sont couramment utilisés pour effectuer des tâches spécifiques telles que l'authentification, l'autorisation, la gestion des cookies, la mise en cache, la journalisation, la compression des réponses, et d'autres opérations liées au traitement de la requête.

Un middleware peut être conçu pour intervenir à différents moments du cycle de vie d'une requête HTTP. Dans de nombreux frameworks PHP, notamment Laravel et Symfony, les middlewares sont souvent utilisés dans le processus de gestion des requêtes HTTP.

3.1 l'authentification⚓︎

source du cours : laravel.sillo.org

Laravel a beaucoup évolué sur la prise en compte du middelware d'authentification. Pour la version Laravel 12 dans laquelle nous sommes aujourd'hui, le framework met à disposition des starters Kit, qui vont déployer models, vues et contrôleur liés aux différentes étapes de l'authentification. On va utiliser le package Laravel\breeze, pour le middelware d'authentification en choisissant le starter kit Blade. Celui ci est un kit de démonstration créé par LaravelDaily pour s'affranchir de la lourdeur des starters kits vue/React/LiveWrire.

Fonctionnalité du kit : fournit des fonctionnalités telles que l'authentification, la connexion, l'enregistrement, une page de tableau de bord et les paramètres de profil.

Point d'attention

  • Vous veillerez à taguer une version stable de votre projet todo, avant de commencer la mise en place du middelware.
  • Mettez de côté le fichier web.php et app.js (Ils seront écrasé lors des installations)

▶️ Installer le paquetage laravel/breeze via composer :

composer require laravel/breeze --dev

Après cela, exécutez la commande suivante :

php artisan breeze:install

❗ Choisir Blade

illustration

😰 Si une erreur > Créer un fichier welcome.blade.php dans les vues

Puis compléter l'installation par :

📋 Texte
npm install
npm run dev

▶️ Occupons nous de la partie base de données.

création du seeder Users

PHP
// Ajouter les namespaces nécessaires ! 
public function run()
    {
        // Exemple d'insertion d'un utilisateur
        DB::table('users')->insert([
            'name' => 'John Doe',
            'email' => 'john.doe@example.com',
            'email_verified_at' => now(),
            'password' => Hash::make('mdp'), // Assurez-vous de hasher le mot de passe
            'remember_token' => Str::random(10),
            'created_at' => now(),
            'updated_at' => now(),
        ]);

        // Ajoutez d'autres utilisateurs au besoin
Ajouter le seeder UserSeeder dans le DatabaseSeeder

PHP
        $this->call([
            UsersSeeder::class,
            TodosSeeder::class,
            CategoriesSeeder::class,
        ]);
Puis relancer la migration avec les tables concernant l'authentification (Users, password_reset_tokens, sessions).

📋 Texte
php artisan migrate:fresh --seed

▶️ Il faut à présent activer le middelware d'authentication sur nos routes todo. Reprendre le web.php et ajouter les lignes dans le nouveau web.php qui contient en plus des liens vers la gestion de l'autentification.

PHP
// Groupe de routes avec middleware d'authentification
Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');

Route::middleware('auth')->group(function () {
    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
    Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
PHP
// Activation du middleware d'authentification pour toutes les routes Todos. Création d'un groupe de routes.
Route::middleware('auth')->group(function () {
    // Action correspondant au form de la vue (donc POST) et appel de la fonction saveTodo du controller
    // Route concernant les todos
    Route::get('/', [TodosController::class, 'liste'])->name('todo.liste');
    [...]
});
Fixer l'erreur sur @Vite
📋 Texte
rm -rf public/build // Supprimer le contenu du répertoire public/build
npm install
npm run dev
php artisan view:clear

L'installation de breeze/blade a également casser le fichier app.js. Remettre les lignes suivantes :

PHP
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap-icons/font/bootstrap-icons.css';
import '@popperjs/core';

▶️ Observer dans l'arborescence ce que vous a apporté l'installation de Breeze (dans views, dans js/Pages/auth)

Illustration

A faire

  • Explorer le module d'authentification.
  • Créer dans le menu l'accès au "Profil de l'utilisateur"
  • Tester toutes les mires mises à votre disposition : changer un mot de passe, se souvenir ...
  • Dans le menu, encadrer l'acces aux fonctionnalités soumises à authentification avec @auth ... @endauth

3.2 Mot de passe oublié / mail sans SMTP⚓︎

Pour éviter un vrai envoi d’email, mais conserver la fonctionnalité d'envoi de mail.

▶️ On commence par créer un fichier de log dédié. Dans config\logging.php ajouter l'entrée suivante :

📋 Texte
// canal dédié aux mails
        'mail' => [
            'driver' => 'single',
            'path' => storage_path('logs/mails.log'),
            'level' => 'debug',
        ],
▶️ puis dans le .env
📋 Texte
MAIL_MAILER=custom_log
MAIL_FROM_ADDRESS="noreply@exemple.local"
MAIL_FROM_NAME="Laravel Todo 2026"
▶️ puis dans le mailer config\mail.php, ajouter l'entrée suivante :
📋 Texte
// mailer personnalisé pointant vers notre canal
    'custom_log' => [
        'transport' => 'log',
        'channel' => 'mail', // nom du canal défini plus haut
    ],
→ Les mails seront écrits dans storage/logs/mails.log.

tester 👀
  • aller sur /forgot-password
  • Saisir ton email utilisateur
  • Ouvre storage/logs/mails.log
  • Copier l'adresse de Reset du mot de passe : http://localhost:8000/reset-password/eyJhbGciOiJI...
  • Copier-colle cette URL dans ton navigateur
  • Saisir le nouveau mot de passe
  • Se reconnecter avec le nouveau mot de passe

3.3 Questions de CyberSécurité⚓︎

Laravel est un framework très utilisé et donc sensible à une attaque Cyber. Il faut toujours rester en veille sur le framework et apporter les correctifs nécessaires dès que possible.

Ressources Documentaires :

3.3.1 Validation des entrées⚓︎

Toujours s’assurer que toutes les données saisies par l’utilisateur sont validées et assainies constitue la première ligne de défense contre de nombreuses attaques courantes, comme l’injection SQL ou le cross-site scripting (XSS). Laravel fournit de puissantes règles de validation que tu peux utiliser pour garantir l’intégrité des données.

PHP
$request->validate([
    'username' => 'required|string|max:255',
    'email' => 'required|email|unique:users,email',
    'password' => 'required|min:8|confirmed',
]);
  • Required → champ obligatoire
  • string → doit être une chaîne de caractères
  • max:255 → longueur maximale 255 caractères
  • email → doit être une adresse e-mail valide
  • unique:users,email → l’e-mail ne doit pas déjà exister dans la table users
  • min:8 → minimum 8 caractères
  • confirmed → doit correspondre au champ password_confirmation

Exemple déjà mis en place dans NewPasswordController.php :

PHP
public function store(Request $request): RedirectResponse
    {
        $request->validate([
            'token' => ['required'],
            'email' => ['required', 'email'],
            'password' => ['required', 'confirmed', Rules\Password::defaults()],
        ]);

A faire

Ajouter une règle pour vérifier que le todo est une chaine obligatoire de caractères de moins de 256 car.

PHP
public function saveTodo(Request $request)
    {
        // Vérification des entrées du formulaire
        $request->validate([
            'texte' => 'required|string|max:256',
        ]);
        ....
    }

3.3.2 Prevention contre SQL Injection⚓︎

L'utilisation de l'ORM Eloquent aide à prévenir les attaques par injection SQL. Utilisez toujours des requêtes paramétrées et évitez de concaténer l'entrée de l'utilisateur dans les instructions SQL.

PHP
// Safe query using Eloquent
$user = User::where('email', $email)->first();

3.3.3 Prévention des attaques XSS⚓︎

Pour éviter les attaques XSS, toujours échapper à l'entrée de l'utilisateur avant de la rendre dans la vue. Le moteur de modèle Blade de Laravel échappe automatiquement à la sortie des données en utilisant le {{ }} syntaxe.

PHP
<!-- Rendu sûr dans Blade -->
{{ $user->name }}

3.3.4 CSRF Protection⚓︎

Laravel inclut une protection intégrée de la CSRF. Assurez-vous que vos formulaires incluent le jeton CSRF en utilisant le @csrf Directive.

dans template.blade.php : <meta name="csrf-token" content="{{ csrf_token() }}"> et dans home.blade.php :

HTML
<form action="{{ route('todo.save') }}" method="POST" class="add">
    @csrf 

3.3.5 Limitation de débit et régulation des requêtes⚓︎

Pour protéger l'application contre les attaques par force brute, on peut mettre en place une limitation du nombre de requêtes grâce au middleware ThrottleRequests de Laravel.

PHP
Route:: middleware('throttle:10,1')-> groupe(fonction () {    
Route :: post('/login', [LoginController::class, 'login']);
});
  • throttle:10,1 signifie : → maximum 10 requêtes par minute (le second chiffre indique la durée en minutes).
  • Si la limite est dépassée, Laravel renvoie automatiquement une réponse 429 (Too Many Requests).

3.3.6 Journalisation et supervision⚓︎

Mettre en place la journalisation et la supervision pour détecter et traiter rapidement les incidents de sécurité. Laravel intègre la journalisation, configurable dans config/logging.php.

PHP
Log::info('User logged in', ['user_id' => $user->id]);