Skip to content

Aller plus loin : Permissions-Policy et protection anti-bots sur Nginx

Brandon Visca
Published date:

Introduction

Lorsque vous avez déjà mis en place les headers classiques (HSTS, CSP, X-Frame-Options…), il reste encore des moyens d’affiner votre politique de sécurité.

Deux approches particulièrement utiles :

  1. Les Permissions-Policy : pour limiter ce que le navigateur est autorisé à faire (caméra, micro, géolocalisation…)
  2. Le Rate Limiting dans Nginx : pour bloquer ou ralentir les requêtes abusives, souvent utilisées par des bots ou des scripts malveillants

Ces deux mesures combinées offrent un contrôle plus précis du comportement client et protègent votre serveur contre les abus.


  1. Permissions-Policy : contrôle des capacités navigateur

Anciennement connue sous le nom de Feature-Policy, cette en-tête HTTP permet de restreindre ou autoriser l’accès aux fonctionnalités sensibles du navigateur, comme la caméra, le micro, la géolocalisation, etc.

Objectif :

Empêcher les navigateurs d’accéder à des APIs si ce n’est pas nécessaire au bon fonctionnement du site.


Exemple de configuration :

add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), fullscreen=(self), payment=()" always;

camera=(self “https://appli.externe.com”)


Pourquoi l’utiliser ?


  1. Rate limiting avec Nginx : la protection anti-bots native

Les attaques par force brute, les scans automatisés ou les abus de formulaire sont des menaces constantes pour les serveurs web. Heureusement, Nginx dispose de modules intégrés pour contrôler le débit par IP.


Étape 1 : définir une zone de limitation

limit_req_zone $binary_remote_addr zone=antibot:10m rate=10r/s;

location / { limit_req zone=antibot burst=20 nodelay; }

💡 Tu peux adapter cette règle pour les zones sensibles uniquement :

location /login {
    limit_req zone=antibot burst=5;
}

if ($http_user_agent ~* (HTTrack|wget|curl|scanner|sqlmap)) { return 403; }

Et si tu veux aller plus loin :


Exemple combiné : sécurité sur un endpoint de formulaire

location /contact {
    limit_req zone=antibot burst=3;

    add_header Permissions-Policy "microphone=(), camera=(), payment=(), fullscreen=(self)" always;

    try_files $uri $uri/ /contact/index.php?$args;
}

Articles connexes

Previous
Ladybird Browser : Le navigateur web qui refuse de se soumettre à Google (et tant mieux)
Next
Comprendre les blocs location de Nginx et leur impact sur la sécurité