CentralCSP
Reporting APITypes de rapports

Hash de script

Le report csp-hash envoie un hash de chaque script chargé par la page, la base pour un inventaire de scripts côté navigateur.

Dernière mise à jour:

Un report csp-hash transporte le hash d'un script (ou d'une autre sous-ressource) que la page a chargé. Contrairement à un report de violation, il ne s'agit pas d'un blocage : vous l'activez avec une source expression 'report-sha256' et le navigateur reporte un hash pour chaque ressource correspondante. Ce flux vous permet de construire un inventaire des scripts réellement exécutés dans le navigateur, rattachés à une bibliothèque, une version et des CVE connues.

Chromium uniquement

Le reporting de hash de script est activé par défaut dans Chromium, donc il fonctionne sans essai d'origine, mais il reste propre à ce moteur : Firefox et Safari ne l'envoient pas. La casse des champs diffère aussi du brouillon CSP (voir Pièges) : traitez donc le payload comme spécifique à Chromium. Voir Prise en charge par les navigateurs ci-dessous.

Quand le navigateur l'envoie

Quand une directive de type script porte 'report-sha256' (ou 'report-sha384' / 'report-sha512'), le navigateur émet un report csp-hash pour chaque ressource correspondante qu'il charge, et affiche aussi le hash dans la console DevTools. Il reporte au lieu de bloquer, sans rien changer à ce qui s'exécute. ReportingObserver ne voit pas les reports de hash ; ils ne partent que vers l'endpoint.

Configuration

Reporting-Endpoints: hashes-endpoint="https://<Endpoint-ID>.report.centralcsp.com"
Content-Security-Policy-Report-Only: script-src 'self' 'report-sha256'; report-to hashes-endpoint

Exemple de payload

{
  "type": "csp-hash",
  "age": 12,
  "url": "https://example.com/",
  "user_agent": "Mozilla/5.0 ...",
  "body": {
    "documentURL": "https://example.com/",
    "subresourceURL": "https://example.com/main.js",
    "hash": "sha256-85738f8f9a7f1b04b5329c590ebcb9e425925b6c0d...",
    "type": "subresource",
    "destination": "script"
  }
}

Le body d'un report csp-hash contient ces champs, à l'intérieur de l'enveloppe de report commune.

Référence des champs

ChampSignification
documentURLLa page sur laquelle le script s'est chargé.
subresourceURLL'URL du script ou de la ressource chargée.
hashLe hash sous la forme <alg>-<base64>, par exemple sha256-....
typeLa catégorie de hash (par exemple subresource).
destinationLa destination de la requête, par exemple script.

Comment le recevoir

Déclarez un endpoint et ajoutez 'report-sha256' à script-src ; gardez la politique en Report-Only pour qu'elle ne bloque jamais. C'est exactement le mécanisme qui alimente l'inventaire Technologies de CentralCSP, où chaque hash reporté est rattaché à une bibliothèque, une version et des CVE connues, et l'inventaire de scripts PCI DSS qui enregistre le statut de revue de chaque script, sans snippet ni extension de navigateur.

Ce qu'il vous apprend sur la sécurité

Un hash de script que vous n'avez pas déployé est un signal de supply-chain : un asset de CDN altéré, un script de formjacking ou de Magecart injecté, ou un tiers inattendu. Le reporting continu des hash, couplé à des alertes sur les hash nouveaux ou modifiés, vous permet de repérer ce changement dès qu'il atteint un vrai navigateur, et non lors d'une revue post-incident.

Pièges

La casse des champs n'est pas figée : Chromium émet du camelCase (documentURL, subresourceURL) tandis que l'exemple du brouillon de l'éditeur CSP utilise du snake_case (document_url, subresource_url). Vérifiez sur une capture réelle.

Une version antérieure de la conception utilisait un mot-clé 'report-hashes' ; celui qui a été livré est 'report-sha256' (et les variantes sha384/sha512). Le mot-clé et la forme du report évoluent encore dans le brouillon CSP, attendez-vous donc à ce qu'ils changent.

Prise en charge par les navigateurs

Navigateurs basés sur Chromium uniquement, où il est activé par défaut. Firefox et Safari ne le prennent pas en charge. La forme des champs suit Chromium plutôt que le brouillon CSP, traitez donc tout payload capturé comme spécifique à Chromium.

Voir aussi

Sources

On this page