Content Security Policy
=
« Politique de Sécurité des Contenus »
<?php
header("Content-Security-Policy: <vos directives>");
?>
Test sur un site réel
<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self' www.google-analytics.com stats.g.doubleclick.net ; style-src 'self' data: ; img-src 'self' www.google-analytics.com stats.g.doubleclick.net data: ; frame-src 'self' ; report-uri /csp-parser.php ; ");
?>
Si aucune directive de définie pour un type de contenu
=> utilise cette valeur
default-src 'self' ;
# self = même port, nom de domaine, protocole => OK
Autoriser un nom de domaine
script-src 'self' www.google-analytics.com ;
# fichiers JS sur ce domaine => OK
Autoriser des contenus embarqués
style-src 'self' data: ;
# Data-Uri dans une CSS => OK
Tout ce qui n’est pas expressément autorisé dans les directives CSP… sera interdit.
Interdit = Bloqué, non affiché, non exécuté.
Pas autorisé le JS inline (<script>, onclick, etc.) => ✖
script-src 'self' 'unsafe-inline' ;
Pareil pour CSS !
Élément | Autorisé ? |
---|---|
styles_mini.css, jquery-mini.js | ☑ |
analytics.js (google-analytics.com) | ☑ |
evil.js (nicolas-hoffmann.net)
styles/JS inline |
NIET |
Deux méthodes
Faut pas y craindre = bourrin
report-uri /csp-parser.php ;
# envoie les erreurs sur cette adresse
<?php
$data = file_get_contents('php://input');
if ($data = json_decode($data, true)) {
$data = json_encode(
$data,
JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES
);
mail(EMAIL, SUBJECT, $data);
}
?>
Voir CSP Report URI, exemples
<?php
header("Content-Security-Policy-Report-Only: <vos directives>");
?>
Faire « comme si »
Pour votre attention.
Pour discuter :
Nicolas Hoffmann / @Nico3333fr