← Retour à la liste
★★★★½ 4.9 / 5
Catégorie 04SKILLS

Drupal Security

XSS, CSRF, SQL injection, AccessResult, RGPD, audit CI/CD — blindage Drupal D8-D11

Installation
Via npx (recommandé)npx skill add ThomasRoger76/drupal-security
Via gitgit clone https://github.com/ThomasRoger76/drupal-security.git ~/.claude/skills/drupal-security
Vérifier dans Claude Code/skills
VersionD8-D11 (OWASP Top 10, RGPD)
PrixGratuit
Plateformes
Drupal 8Drupal 9Drupal 10Drupal 11
Commandes8
Exemples3
SKL
À propos

Skill de connaissance pure qui transforme Claude en expert sécurité Drupal 8-11+ — génère du code conforme OWASP Top 10 sans effort conscient et intègre l'audit CI/CD automatisé dans chaque projet. Contenu injecté : les 3 péchés capitaux (XSS via |raw, SQL injection par concaténation, contrôle accès par uid==1 ou hasRole hardcodé), les 5 contextes XSS avec le bon outil (#plain_text, Xss::filter, Html::escape, check_markup, TrustedCallbackInterface), protection CSRF (_csrf_token routing + X-CSRF-Token header REST), AccessResult::forbiddenIf avec cache contexts (accès ET performance), SQL placeholders + escapeLike, uploads private://, module Key pour les secrets hors settings.php (vars env Docker/Kubernetes), TFA TOTP obligatoire par rôle, conformité RGPD (effacement Art.17, portabilité Art.20, consentement, PII masqués dans les logs), audit CI/CD automatisé (drush pm:security, composer audit, Trivy image scan, headers HTTP curl). Pas d'agents — skill de connaissance pure. Gain mesuré : code sécurisé OWASP Top 10 sans checklist manuelle, AccessResult avec cache contexts correct du premier essai (évite les trous de sécurité ET les problèmes de cache Drupal), audit CI/CD intégré détecte les SA actives à chaque déploiement.

Fonctionnalités clés
Les 3 péchés capitaux — bloqués systématiquementXSS via |raw sur input utilisateur, SQL injection par concaténation, contrôle accès par uid==1 ou hasRole(). Ces 3 erreurs représentent 80% des CVEs Drupal critiques.
XSS — 5 contextes, 5 outils corrects#plain_text, Xss::filter() whitelist, Html::escape() pour attributs, check_markup() pour formats Drupal, TrustedCallbackInterface pour callbacks #pre_render. Auto-escape Twig par défaut.
AccessResult avec cache contexts — accès et performanceAccessResult::forbiddenIf() avec addCacheContexts(['user.permissions']) et addCacheTags(). hook_entity_access() pour la logique métier, hook_node_access_records() pour le multi-tenant.
Key module — secrets hors settings.php et hors gitdrupal/key avec provider env pour lire les secrets depuis les variables d'environnement Docker/Kubernetes. Rotation de clé sans redéploiement, audit CI pour les clés commitées par erreur.
RGPD — effacement, portabilité, consentement, PII dans les logshook_user_cancel() anonymise les PII, hook_user_predelete() supprime les données liées. Controller export JSON pour la portabilité Art.20. Logger Decorator masque emails/IPs dans watchdog.
Audit CI/CD — pm:security, composer audit, Trivy, headersPipeline automatisé : drush pm:security (SA actives), composer audit (CVEs PHP), Trivy scan image Docker (CVEs système), curl headers (X-Frame, HSTS, CSP). Exit code non-zéro si critique.
Commandes
CommandeDescription
drush pm:securityLister les modules avec des Security Advisories actives (Drush 12+)
composer auditScanner les dépendances PHP pour les CVEs connues (Composer 2.4+)
drush security-reviewRapport d'audit automatisé (permissions, fichiers, PHP errors, settings)
drush core:requirements --format=tableVérifier les erreurs de configuration sécurité (trusted_host_patterns, etc.)
curl -si https://mon-site.com | grep -E 'X-Frame|X-Content|HSTS|CSP'Vérifier les headers HTTP de sécurité en production
drush role:perm:check --role=editorLister toutes les permissions du rôle editor — audit des droits
drush php:eval "\Drupal::service('key.repository')->getKey('api_stripe')->getKeyValue();"Tester la lecture d'une clé API depuis le Key module
find web/modules/custom/ -name '*.twig' | xargs grep -l '|raw'Détecter tous les usages de |raw dans les templates du projet
Exemples
XSS prevention — les 5 contextes avec le bon outilCODE
<?php
// Contexte 1 — texte pur dans un render array
$build['titre'] = ['#plain_text' => $user_input];

// Contexte 2 — HTML partiel (whitelist de balises)
$build['corps'] = ['#markup' => Markup::create(Xss::filter($html, ['b', 'i', 'em', 'strong', 'a']))];

// Contexte 3 — attribut HTML (href, class, data-*)
$attr = Html::escape($user_input);

// Contexte 4 — format de texte Drupal (Basic HTML, Full HTML)
$build['body'] = ['#markup' => check_markup($text, 'basic_html')];

// Contexte 5 — callback #pre_render (TrustedCallbackInterface obligatoire)
class MonCallback implements TrustedCallbackInterface {
  public static function trustedCallbacks(): array { return ['build']; }
  public static function build(array $element): array { return $element; }
}

// En Twig — auto-escape par défaut, jamais |raw sur input utilisateur
// {{ node.field_body.value }}      ✅ auto-escaped
// {{ node.field_body.value|raw }}  ❌ XSS si contenu utilisateur
hook_entity_access — contrôle d'accès multi-tenant avec cacheCODE
<?php
// mon_module.module (ou classe #[Hook] D11)
function mon_module_entity_access(
  EntityInterface $entity,
  string $operation,
  AccountInterface $account
): AccessResultInterface {
  if (!$entity instanceof NodeInterface) return AccessResult::neutral();

  // Accès multi-organisation — chaque user ne voit que ses nodes
  if ($operation === 'view' && $entity->bundle() === 'rapport') {
    $user_org  = $account->get('field_organisation')->target_id ?? 0;
    $node_org  = $entity->get('field_organisation')->target_id ?? 0;
    return AccessResult::forbiddenIf($user_org !== $node_org)
      ->addCacheContexts(['user'])
      ->addCacheTags(['node:' . $entity->id()]);
  }
  return AccessResult::neutral();
}
Audit de sécurité — script CI/CD completCODE
#!/bin/bash
# .gitlab-ci.yml — job security-audit
FAIL=0

echo "=== SA actives ===" && drush pm:security || FAIL=1
echo "=== CVEs PHP ===" && composer audit --no-dev || FAIL=1

echo "=== Headers HTTP ===" && {
  HEADERS=$(curl -si https://$SITE_URL | grep -i -E 'X-Frame-Options|X-Content-Type|Strict-Transport|Content-Security')
  echo "$HEADERS"
  echo "$HEADERS" | grep -qi 'X-Frame-Options' || { echo "MISSING X-Frame-Options"; FAIL=1; }
  echo "$HEADERS" | grep -qi 'Strict-Transport' || { echo "MISSING HSTS"; FAIL=1; }
}

echo "=== Fichiers sensibles ===" && {
  curl -si https://$SITE_URL/.env | grep -q "200" && { echo "EXPOSED .env"; FAIL=1; }
  curl -si https://$SITE_URL/sites/default/settings.php | grep -q "200" && { echo "EXPOSED settings.php"; FAIL=1; }
}

exit $FAIL
Points forts & faibles
Points forts
+Génère du code sécurisé systématiquement — pas besoin de se souvenir des patterns
+AccessResult avec cache contexts corrects — sécurité ET performance
+Audit CI/CD clé en main — détection des SA et CVEs automatisée
+RGPD couvert techniquement — effacement, portabilité, consentement
Points faibles
CSP (Content-Security-Policy) complexe à configurer sans casser le site
TFA nécessite une gestion des appareils de confiance (edge cases non couverts)
Verdict

Le skill de sécurité Drupal le plus complet. Couvre de l'XSS au RGPD en passant par le contrôle d'accès multi-tenant avec cache. Génère du code conforme OWASP Top 10 systématiquement.

Développeurs Drupal, équipes sécurité, auditeurs cherchant à durcir un site Drupal existant