Sans identifiants iFrame: intégrez facilement des iFrames dans des environnements COEP

Arthur Sonzogni
Arthur Sonzogni

Les développeurs qui utilisent COEP peuvent désormais intégrer des iFrames tiers qui ne l'utilisent pas eux-mêmes.

L'iFrame sans identifiants est activé par défaut à partir de la version 110 de Chrome. Il permet de résoudre les problèmes les plus courants rencontrés par les développeurs qui utilisent Cross-Origin-Embedder-Policy (COEP): intégrer des iFrames tiers qui ne définissent pas COEP.

Pourquoi avons-nous besoin du COEP ?

Certaines API Web augmentent le risque d'attaques par canal auxiliaire, comme Spectre. Pour réduire ce risque, les navigateurs proposent un environnement isolé basé sur l'activation, appelé isolation multi-origine, qui nécessite le déploiement de COEP. L'isolation multi-origine permet aux sites Web d'utiliser des fonctionnalités privilégiées, telles que SharedArrayBuffer, performance.measureUserAgentSpecificMemory(), et des minuteurs de haute précision avec une meilleure résolution.

Pour activer l'isolation multi-origine, les sites Web doivent envoyer les en-têtes HTTP suivants:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

COEP:credentialless peut également être utilisé à la place de require-corp. Pour en savoir plus, consultez la documentation.

Difficultés liées à la mise en place du COEP

Bien que l'isolation multi-origine renforce la sécurité des pages Web et permette d'activer des fonctionnalités puissantes, le déploiement de COEP peut s'avérer difficile. L'un des plus grands défis est que tous les iFrames multi-origines doivent déployer les protocoles COEP et CORP. Les tags iFrame sans ces en-têtes ne sont pas chargés par le navigateur.

La solution aux identifiants iFrame

Nous lançons <iframe credentialless> pour faciliter l'intégration d'iFrames tiers qui ne définissent pas COEP. Si vous ajoutez l'attribut credentialless à l'élément <iframe>, l'iFrame est chargé à partir d'un autre contexte vide. Plus précisément, elle est chargée sans cookies. Cela permet de supprimer la restriction COEP.

Exemple :

<iframe credentialless src="https://example.com">

Cet iFrame est créé dans un nouveau contexte éphémère et n'a accès à aucun des cookies associés au site Web de premier niveau. Au lieu de cela, elle commence par un pot de cookies vide. De même, les API de stockage telles que LocalStorage, CacheStorage, IndexedDB, etc. chargent et stockent les données dans la nouvelle partition éphémère. Le champ d'application de la partition est à la fois le document de premier niveau actuel et l'origine de l'iFrame. Tout cet espace de stockage est effacé une fois le document de premier niveau déchargé.

Les iFrame sans identifiant ne sont pas soumis aux règles d'intégration COEP. Elles sont toujours sécurisées: comme elles sont chargées à chaque fois à partir d'un nouveau contexte vide, elles ne doivent pas contenir de données personnalisées, ce que recherchent les pirates informatiques. Si un iFrame ne contient que des données publiques, il n'a aucune valeur pour un pirate informatique.

Démo

Pour voir une démonstration d'un iFrame sans identifiant,

Questions fréquentes

D'autres navigateurs utiliseront-ils cette fonctionnalité ?

Un élément <iframe> est-il imbriqué dans un élément <iframe credentialless> sans identifiants ?

Oui. Il est hérité. Une fois qu'un iFrame est sans identifiant, cela s'applique à tous les iFrames de la sous-arborescence entière, même sans attribut credentialless.

Les pop-ups créés à partir de <iframe credentialless> sont-ils également sans identifiant ?

Les pop-ups s'ouvrent comme si noopener était défini. Ils sont créés dans un nouveau contexte de premier niveau standard et ne sont pas sans identifiants. Ils ne peuvent pas communiquer avec l'iFrame sans identifiants.

Comment détecter que le document a été intégré dans un iFrame sans identifiants ?

window.credentialless a la valeur "true" dans un iFrame sans identifiants, et la valeur "false" dans le cas contraire. Sa valeur est undefined dans un navigateur Web qui n'est pas compatible avec <iframe credentialless>.

Ressources