{
"regles": [
{
"id": "HEADERS-CORS-WILDCARD-01",
"theme": "cors",
"niveau": "haute",
"description": "Access-Control-Allow-Origin renvoie un joker (*) — autorise n'importe quelle origine à lire la réponse, y compris en présence d'identifiants si mal combiné.",
"motif": "(?i)access-control-allow-origin[^\\n]{0,60}[\"']\\*[\"']",
"action_recommandee": "Remplacer par une liste blanche d'origines explicites vérifiées côté serveur, jamais un joker sur une ressource authentifiée ou sensible."
},
{
"id": "HEADERS-CORS-CREDENTIALS-VRAI-01",
"theme": "cors",
"niveau": "moyenne",
"description": "Access-Control-Allow-Credentials activé — à vérifier qu'il n'est jamais combiné avec un joker sur Access-Control-Allow-Origin (combinaison invalide/dangereuse selon la spécification CORS).",
"motif": "(?i)access-control-allow-credentials[^\\n]{0,40}(true|\"true\")",
"action_recommandee": "Vérifier que Access-Control-Allow-Origin n'est jamais un joker (*) sur les mêmes réponses ; utiliser une origine explicite reflétée depuis une liste blanche."
},
{
"id": "HEADERS-XFRAME-PERMISSIF-01",
"theme": "clickjacking",
"niveau": "moyenne",
"description": "X-Frame-Options avec une valeur permissive ou obsolète (ALLOWALL, ALLOW-FROM *) — protection anti-clickjacking affaiblie ou inopérante selon les navigateurs.",
"motif": "(?i)x-frame-options[^\\n]{0,60}(allowall|allow-from\\s*\\*)",
"action_recommandee": "Utiliser DENY ou SAMEORIGIN, ou migrer vers frame-ancestors dans la Content-Security-Policy (support navigateur plus large et plus fiable)."
},
{
"id": "HEADERS-COOKIE-INSECURE-EXPLICITE-01",
"theme": "cookies",
"niveau": "haute",
"description": "Attribut de cookie de sécurité explicitement désactivé (secure(false) ou http_only(false)) — expose le cookie au vol via un canal non chiffré ou via du JavaScript côté client.",
"motif": "(?i)\\.(secure|http_only)\\s*\\(\\s*false\\s*\\)",
"action_recommandee": "Activer Secure et HttpOnly sur tout cookie de session ou sensible ; n'utiliser secure(false) que sur un environnement de développement local explicitement isolé."
},
{
"id": "HEADERS-HSTS-MAX-AGE-NUL-01",
"theme": "transport",
"niveau": "moyenne",
"description": "Strict-Transport-Security avec max-age=0 — désactive HSTS pour le domaine au lieu de forcer HTTPS, souvent un oubli de configuration de développement laissé en production.",
"motif": "(?i)strict-transport-security[^\\n]{0,80}max-age=0\\b",
"action_recommandee": "Utiliser un max-age élevé (ex. 31536000, un an) en production ; max-age=0 ne doit servir qu'à désactiver volontairement HSTS après un incident, jamais par défaut."
},
{
"id": "HEADERS-REFERRER-POLICY-PERMISSIVE-01",
"theme": "fuite_information",
"niveau": "info",
"description": "Referrer-Policy défini sur unsafe-url — transmet l'URL complète (y compris les paramètres de requête sensibles) même vers une origine tierce.",
"motif": "(?i)referrer-policy[^\\n]{0,60}unsafe-url",
"action_recommandee": "Préférer strict-origin-when-cross-origin (défaut moderne des navigateurs) ou no-referrer pour les pages sensibles."
}
],
"en_tetes_inventaire": [
"X-Frame-Options",
"X-Content-Type-Options",
"Strict-Transport-Security",
"Referrer-Policy",
"Permissions-Policy"
],
"extensions_scannees": [
".rs", ".py", ".js", ".ts", ".go", ".java", ".rb", ".php"
],
"dossiers_ignores": [
"target", "node_modules", ".git", "__pycache__", "dist", "build",
"venv", ".venv", ".mypy_cache", ".pytest_cache", "vendor"
]
}