Name : BETA-TESTERS
Project name : ZW3B-API-BETA-TESTERS
Authorized. - 200 - Client API Name and Origin Wildcard OK
Options X-Frame et Processus de réponses aux documents http en mode Sec-Fetch d'origine croisée - La norme Fetch définit les requêtes HTTP, les réponses HTTP et le processus qui les lie : la récupération.
NdM : 2021/09/04 - Cette page est en cours de complément rédactionnel..
J'écris cette documentation pour comprendre la norme de sécurité Sec-Fetch-* - "aller chercher/demander/protéger" une ressource Web.
Dans ce papier je vais d'écrire certaines fonctionnalités de sécurité pour site Web - Que cela (la ressource) soit inter-sites soit intra-site :)
Pour commencer je vais parler du header X-Frame-Options
qui permet de bloquer les contenus de nos sites Web qu'un attaquant voudrait inclure à son site via une iframe
par exemple en simulant que le contenu pourrait lui appartenir !
Puis je vais d'écrire les fonctionnalité récentes tel que CORS, les demandes et réponses d'origines croisées de partage de ressources pour différents type de format de documents transitant pour le web - js/css/html/json et d'autres.
X-Frame-Options
:
L'en-tête de réponse HTTP X-Frame-Options
peut être utilisé pour indiquer si un navigateur doit être autorisé ou non à afficher une page dans une frame
, iframe
, embed
ou object
. Les sites peuvent l'utiliser pour éviter les attaques de détournement de clic, en s'assurant que leur contenu n'est pas intégré à d'autres sites.
La sécurité supplémentaire n'est fournie que si l'utilisateur qui accède au document utilise un navigateur prenant en charge X-Frame-Options
.
DENY
: refuser
SAMEORIGIN
: même origine
ALLOW-FROM uri
: seulement pour l'adresse (obsolète)
SAMEORIGIN
- il ne vérifie pas les ancêtres des cadres pour voir s'ils sont dans la même origine. L'en-tête HTTP Content-Security-Policy
a une directive frame-ancestors que vous pouvez utiliser à la place.
Les sites web peuvent utiliser les entêtes X-Frame-Options
ou une stratégie de sécurité du contenu (CSP) pour contrôler si d'autres sites web peuvent les intégrer dans leurs propres pages. C'est une fonctionnalité de sécurité importante pour empêcher le détournement de clic (clickjacking) (attaque qui permet à des sites malveillants de duper les utilisateurs et utilisatrices pour les amener à cliquer sur les liens d'un site) et les injections de contenu. Ces attaques peuvent être utilisées dans divers buts, comme le vol de données, le défacement de site ou la diffusion de malware.
Pour exemple en ajoutant un header('X-Frame-Options: deny');
en haut d'une page Web cela permet que personne ne puisse inclure votre site/page web via une iframe.
X-Content-Type-Options
: les en-têtes Content-Type ne doivent pas être modifiés ou et suivis
L'entête X-Content-Type-Options
est un marqueur utilisé par le serveur pour indiquer que les types MIME annoncés dans les en-têtes Content-Type
ne doivent pas être modifiés ou et suivis. Cela permet de se détacher du sniffing de type MIME, ou, en d'autres termes, c'est une façon de dire que les webmasters savaient ce qu'ils faisaient.
Cet en-tête a été introduit par Microsoft dans IE 8 comme un moyen pour les webmasters de bloquer le reniflement de contenu qui se passait et pouvait transformer les types MIME non exécutables en types MIME exécutables. Depuis, d'autres navigateurs l'ont introduit, même si leurs algorithmes de reniflage MIME étaient moins agressifs.
A partir de Firefox 72, la désactivation du reniflement MIME est également appliqué aux documents de premier niveau si un Content-type
est fourni. Les pages web HTML qui sont servies avec un type MIME différent de text/html, peuvent alors être juste téléchargées au lieu d'êtres rendues (interprétées et affichées par le navigateur). Assurez vous de valoriser correctement ces 2 en-têtes.
Les testeurs de sécurité du site s'attendent généralement à ce que cet en-tête soit défini.
Note: X-Content-Type-Options ne s'appliquent qu'au blocage des demandes par nosniff pour les destinations de demandes de "script" et "style". Il permet également le blocage en lecture croisé (CORB) pour les fichiers HTML, TXT, JSON, et XML (à l'exception des images SVG image/svg+xml).
nosniff
Content-Security-Policy
(CSP ) : Politique de sécurité de contenu
L'en-tête de réponse HTTP Content-Security-Policy
permet aux administrateurs d'un site web de contrôler les ressources que l'agent utilisateur est autorisé à charger pour une page donnée. Bien qu'il y ait quelques exceptions, ces règles impliquent la plupart du temps de définir les origines du serveur et les points d'accès pour les scripts. Cet en-tête aide à se protéger contre les attaques de cross-site scripting (XSS (en-US) ).
Les directives de récupération (ou fetch directives en anglais) contrôlent les emplacements à partir desquels certains types de ressource peuvent être chargés.
child-src
frame
et iframe
.
Plutôt que la directivechild-src
, si vous souhaitez réguler les contextes de navigation imbriqués et les workers séparément, vous pouvez utiliser respectivement les directivesframe-src
etworker-src
.
connect-src
default-src
font-src
, frame-src
, img-src
, manifest-src
, media-src
, object-src
, prefetch-src
, script-src
, script-src-elem
, script-src-attr
, style-src
, style-src-elem
, style-src-attr
, worker-src
Les directives de document permettent de paramétrer les propriétés d'un document ou d'un environnement pour un web worker auquel une règle de sécurité s'applique.
form-action
frame-ancestors
frame
, iframe
, object
, embed
, ou applet
.
navigate-to
window.location
, window.open
, etc.)
Les directives de rapport permettent de contrôler ce qui se passe lorsqu'une règle CSP est violée. Voir également l'en-tête Content-Security-Policy-Report-Only
.
report-uri
Bien que la directive report-to est prévue remplacer la directive report-uri maintenant dépréciée, report-to n'est pas encore supportée par la plupart des navigateurs modernes...
report-to
SecurityPolicyViolationEvent
.
Les directives de rapport permettent de contrôler ce qui se passe lorsqu'une règle CSP est violée. Voir également l'en-tête Content-Security-Policy-Report-Only
.
block-all-mixed-content
referrer
Referrer-Policy
doit être utilisé à la place. Était utilisée pour indiquer l'en-tête référent (sic) pour les liens sortants.
require-sri-for
trusted-types
upgrade-insecure-requests
Dans cet exemple, on désactive les scripts écrits à même le document (inline), les opérations eval() et les ressources (images, polices, scripts, etc.) peuvent uniquement être chargées via HTTPS :
Script avec 5 lignes
001// en-tête HTTP 002Content-Security-Policy: default-src https: 003 004// version avec la balise HTML meta 005<meta http-equiv="Content-Security-Policy" content="default-src https:">
Dans cet exemple, on ne met pas en place la règle de sécurité mais on récolte les enfreintes qui se seraient produites pour cette règle :
Script avec 1 ligne
001Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/
Les requêtes de n'importe quelle origine (à la fois sur le même site et entre sites) peuvent lire la ressource.
Cross-origin Resource Sharing
(CORS ) : Partage des ressources entre origines multiples
Le cross-origin resource sharing (CORS) ou « partage des ressources entre origines multiples » (en français, moins usité) est un mécanisme qui consiste à ajouter des en-têtes HTTP afin de permettre à un agent utilisateur d'accéder à des ressources d'un serveur situé sur une autre origine que le site courant. Un agent utilisateur réalise une requête HTTP multi-origine (cross-origin
) lorsqu'il demande une ressource provenant d'un domaine, d'un protocole ou d'un port différent de ceux utilisés pour la page courante.
Le standard CORS est utilisé afin de permettre les requêtes multi-origines pour :
Cross-Origin-Read-Blocking
(CORB) : Blocage de lecture d'origine croiséeLe blocage de lecture cross-origin, mieux connu sous le nom de CORB, est un algorithme qui identifie les récupérations de ressources cross-origin douteuses (par exemple, les récupérations qui échoueraient de toute façon comme les tentatives de rendu JSON dans un élément img) et les bloque avant qu'elles n'atteignent une page Web. CORB réduit le risque de fuite de données sensibles en les éloignant des pages Web d'origine croisée.
Cross-Origin-Resource-Policy
(CORP) : Politique de ressources d'origine croisée
Cross-Origin Resource Policy est une stratégie définie par l'en-tête HTTP Cross-Origin-Resource-Policy
qui permet aux sites Web et aux applications d'opter pour la protection contre certaines demandes provenant d'autres origines (telles que celles émises avec des éléments tels que script
et img
), pour atténuer les attaques spéculatives par canal latéral, comme Spectre, ainsi que les attaques par inclusion de scripts intersites.
CORP est une couche de protection supplémentaire au-delà de la politique de même origine par défaut. Cross-Origin Resource Policy complète le Cross-Origin Read Blocking (CORB), qui est un mécanisme pour empêcher certaines lectures cross-origin par défaut.
same-site
: même-site
Attention : C'est moins sécurisé qu'une origine. L'algorithme pour vérifier si deux origines sont le même site est défini dans la norme HTML et consiste à vérifier le domaine enregistrable.
same-origin
: même origine
cross-origin
: origine croisée
Cross-Origin-Opener-Policy
(COOP) : Politique d'ouverture d'origine croisée
L'en-tête de réponse HTTP Cross-Origin-Opener-Policy
(COOP) vous permet de vous assurer qu'un document de niveau supérieur ne partage pas un groupe de contexte de navigation avec des documents d'origine croisée.
COOP traitera et isolera votre document et les attaquants potentiels ne pourront pas accéder à votre objet global s'ils l'ouvraient dans une fenêtre contextuelle, empêchant ainsi un ensemble d'attaques d'origine croisée appelée XS-Leaks.
Si un document d'origine croisée avec COOP est ouvert dans une nouvelle fenêtre, le document d'ouverture n'y fera pas référence et la propriété window.opener de la nouvelle fenêtre sera nulle. Cela vous permet d'avoir plus de contrôle sur les références à une fenêtre que rel=noopener, ce qui n'affecte que les navigations sortantes.
unsafe-none
: dangereux-aucun
same-origin-allow-popups
: même-origine-autoriser-popups
same-origin
: même-origine
Certaines fonctionnalités dépendent de l'isolement des origines croisées
Certaines fonctionnalités telles que les objets SharedArrayBuffer ou Performance.now() avec des minuteries non étranglées ne sont disponibles que si votre document a un en-tête COOP avec la valeur de même origine définie.
Script avec 2 lignes
001Cross-Origin-Opener-Policy: same-origin 002Cross-Origin-Embedder-Policy: require-corp
Voir aussi l'en-tête Cross-Origin-Embedder-Policy
que vous devrez également définir.
Pour vérifier si l'isolation d'origine croisée a réussi, vous pouvez tester la propriété crossOriginIsolated disponible pour les contextes de fenêtre et de travail :
Script avec 5 lignes
001if (crossOriginIsolated) { 002 // Post SharedArrayBuffer 003} else { 004 // Do something else 005}
Cross-Origin-Embedder-Policy
(COEP) : Politique d'intégration d'origine croisée
L'en-tête de réponse HTTP Cross-Origin-Embedder-Policy
(COEP) empêche un document de charger des ressources d'origine croisée qui n'accordent pas explicitement l'autorisation de document (à l'aide de CORP ou CORS).
unsafe-none
: dangereux-aucun
require-corp
: exiger-corp
Certaines fonctionnalités dépendent de l'isolement des origines croisées
Vous ne pouvez accéder à certaines fonctionnalités telles que les objets SharedArrayBuffer ou Performance.now() avec des minuteries non étranglées, si votre document a un en-tête COEP avec la valeur require-corp définie.
Script avec 2 lignes
001Cross-Origin-Embedder-Policy: require-corp 002Cross-Origin-Opener-Policy: same-origin
Voir aussi l'en-tête Cross-Origin-Opener-Policy
que vous devrez également définir.
Pour vérifier si l'isolation d'origine croisée a réussi, vous pouvez tester la propriété crossOriginIsolated disponible pour les contextes de fenêtre et de travail :
Script avec 5 lignes
001if (crossOriginIsolated) { 002 // Post SharedArrayBuffer 003} else { 004 // Do something else 005}
Éviter le blocage COEP avec CORS
Si vous activez COEP à l'aide de require-corp et qu'une ressource d'origine croisée doit être chargée, elle doit prendre en charge CORS et vous devez explicitement marquer la ressource comme chargeable à partir d'une autre origine pour éviter le blocage de COEP. Par exemple, vous pouvez utiliser l'attribut crossorigin pour cette image à partir d'un site tiers :
Script avec 1 ligne
001<img src="https://thirdparty.com/img.png" crossorigin>
La politique de même origine est un mécanisme de sécurité critique qui restreint la manière dont un document ou un script chargé par une origine peut interagir avec une ressource d'une autre origine.
Il aide à isoler les documents potentiellement malveillants, réduisant ainsi les vecteurs d'attaque possibles. Par exemple, il empêche un site Web malveillant sur Internet d'exécuter JS dans un navigateur pour lire les données d'un service de messagerie Web tiers (auquel l'utilisateur est connecté) ou d'un intranet d'entreprise (qui est protégé contre l'accès direct par l'attaquant par n'ayant pas d'adresse IP publique) et relayant ces données à l'attaquant.
La norme Fetch définit les requêtes, les réponses et le processus qui les lie : la récupération.
Présentation des métadonnées Fetch : firefox 90 supports fetch metadata request headers .
Comme illustré dans le scénario d'attaque ci-dessus, l'en-tête de demande HTTP Sec-Fetch-Site
permet au serveur d'applications Web de faire la distinction entre une demande de même origine provenant de l'application Web correspondante et une demande d'origine croisée provenant d'un site Web contrôlé par un attaquant.
L'inspection des en-têtes Sec-Fetch-* permet finalement au serveur d'applications Web de rejeter ou d'ignorer également les demandes malveillantes en raison du contexte supplémentaire fourni par la famille d'en-têtes Sec-Fetch-*
. Au total, il existe quatre en-têtes Sec-Fetch-*
différents : Dest
, Mode
, Site
et User
qui, ensemble, permettent aux applications Web de se protéger et de protéger leurs utilisateurs finaux contre les attaques intersites mentionnées précédemment.
Alors que Firefox sera bientôt livré avec sa nouvelle architecture de sécurité d'isolation de site qui résoudra quelques-uns des problèmes ci-dessus, nous recommandons que les applications Web utilisent les en-têtes Fetch Metadata nouvellement pris en charge qui fournissent un mécanisme de défense en profondeur pour les applications de toutes sortes.
Sec-Fetch-Dest
: indique la destination de la demande
L'en-tête de demande de métadonnées d'extraction Sec-Fetch-Dest
indique la destination de la demande. C'est l'initiateur de la demande d'extraction d'origine, c'est-à-dire où (et comment) les données extraites seront utilisées.
Cela permet aux serveurs de déterminer s'il faut traiter une demande en fonction de son adéquation avec la manière dont elle est censée être utilisée. Par exemple, une demande avec une destination audio doit demander des données audio, pas un autre type de ressource (par exemple, un document qui inclut des informations utilisateur sensibles).
Script avec 21 lignes
001Sec-Fetch-Dest: audio 002Sec-Fetch-Dest: audioworklet 003Sec-Fetch-Dest: document 004Sec-Fetch-Dest: embed 005Sec-Fetch-Dest: empty 006Sec-Fetch-Dest: font 007Sec-Fetch-Dest: frame 008Sec-Fetch-Dest: iframe 009Sec-Fetch-Dest: image 010Sec-Fetch-Dest: manifest 011Sec-Fetch-Dest: object 012Sec-Fetch-Dest: paintworklet 013Sec-Fetch-Dest: report 014Sec-Fetch-Dest: script 015Sec-Fetch-Dest: serviceworker 016Sec-Fetch-Dest: sharedworker 017Sec-Fetch-Dest: style 018Sec-Fetch-Dest: track 019Sec-Fetch-Dest: video 020Sec-Fetch-Dest: worker 021Sec-Fetch-Dest: xslt
Ces directives correspondent aux valeurs retournées par Request.destination.
Une requête intersites générée par un élément img
entraînerait une requête avec les en-têtes de requête HTTP suivants (notez que la destination est une image) :
Script avec 3 lignes
001Sec-Fetch-Dest: image 002Sec-Fetch-Mode: no-cors 003Sec-Fetch-Site: cross-site
Sec-Fetch-Mode
: Ces directives correspondent aux valeurs de Request.mode.
L'en-tête de demande de métadonnées d'extraction Sec-Fetch-Mode
indique le mode de la demande.
De manière générale, cela permet à un serveur de faire la distinction entre : les requêtes provenant d'un utilisateur naviguant entre les pages HTML, et les requêtes de chargement d'images et d'autres ressources. Par exemple, cet en-tête contiendrait naviguer pour les requêtes de navigation de niveau supérieur, tandis que no-cors est utilisé pour charger une image.
cors
: cross-origin resource sharing - origine croisée de partage de ressources (partage de ressources inter-origine)
navigate
: naviguation
no-cors
: pas d'origine croisée de partage de ressources
same-origin
: même origine
websocket
:
Si un utilisateur clique sur un lien de page vers une autre page sur la même origine, la requête résultante aurait les en-têtes suivants (notez que le mode est navigation) :
Script avec 3 lignes
001Sec-Fetch-Dest : document 002Sec-Fetch-Mode : navigate (navigation) 003Sec-Fetch-Site : same-origin (même origine)
Une requête intersites générée par un élément img
entraînerait une requête avec les en-têtes de requête HTTP suivants (notez que le mode est no-cors) :
Script avec 3 lignes
001Sec-Fetch-Dest: image 002Sec-Fetch-Mode : no-cors (sans cors) 003Sec-Fetch-Site : same-site (même origine)
Sec-Fetch-Site
: indique la relation entre l'origine d'un initiateur de demande et l'origine de la ressource demandée.
L'en-tête de demande de métadonnées d'extraction Sec-Fetch-Site
indique la relation entre l'origine d'un initiateur de demande et l'origine de la ressource demandée. En d'autres termes, cet en-tête indique à un serveur si une demande de ressource provient de la même origine, du même site, d'un site différent, ou est une demande "initiée par l'utilisateur". Le serveur peut ensuite utiliser ces informations pour décider si la demande doit être autorisée.
Les demandes de même origine sont généralement autorisées par défaut, mais ce qui se passe pour les demandes provenant d'autres origines peut en outre dépendre de la ressource demandée ou des informations contenues dans d'autres en-têtes de demande de métadonnées Fetch. Par défaut, les demandes qui ne sont pas acceptées doivent être rejetées avec un code de réponse 403.
cross-site
: intersites
same-origin
: même origine
same-site
: même-site
none
: rien
Une requête d'extraction vers https://mysite.example/foo.json provenant d'une page Web sur https://mysite.example (avec le même port) est une requête de même origine. Le navigateur générera l'en-tête Sec-Fetch-Site: same-origin comme indiqué ci-dessous, et le serveur autorisera généralement la requête :
Script avec 4 lignes
001GET /foo.json 002Sec-Fetch-Dest : none (vide) 003Sec-Fetch-Mode : cors 004Sec-Fetch-Site : same-origin (même origine)
Une requête d'extraction vers la même URL à partir d'un autre site, par exemple potentiellement-evil.com, amène le navigateur à générer un en-tête différent (par exemple Sec-Fetch-Site : cross-site), que le serveur peut choisir d'accepter ou de rejeter :
Script avec 4 lignes
001GET /foo.json 002Sec-Fetch-Dest : none (vide) 003Sec-Fetch-Mode : cors 004Sec-Fetch-Site : cross-site (intersites)
Sec-Fetch-User
:
L'en-tête de requête de récupération de métadonnées Sec-Fetch-User
n'est envoyé que pour les requêtes initiées par l'activation de l'utilisateur, et sa valeur sera toujours ?1
.
Un serveur peut utiliser cet en-tête pour identifier si une requête de navigation à partir d'un document, d'un iframe, etc., a été émise par l'utilisateur.
?1
:
?1
. Lorsqu'une demande est déclenchée par autre chose qu'une activation de l'utilisateur, la spécification exige que les navigateurs omettent complètement l'en-tête.
Si un utilisateur clique sur un lien vers une autre page de la même origine, la requête résultante aura les en-têtes suivants :
Script avec 4 lignes
001Sec-Fetch-Dest: document 002Sec-Fetch-Mode: navigate 003Sec-Fetch-Site: same-origin 004Sec-Fetch-User: ?1
Bonne gestion de vos ressources à travers le réseau international.
Cordialement,
Romain.
Reason: <acronym title="Cross-Origin Resource Sharing" lang="EN">CORS</acronym> preflight channel did not succeed
(Raison : le canal de contrôle en amont CORS n'a pas réussi)