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 tierces qui n'utilisent pas COEP eux-mêmes.

L'authentification sans identifiants dans les iFrames est activée par défaut à partir de la version 110 de Chrome. Il résout le problème le plus courant rencontré par les développeurs qui travaillent avec la règle COEP (Cross-Origin-Embedder-Policy): l'intégration d'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, telles que Spectre. Pour atténuer ce risque, les navigateurs proposent un environnement isolé activable appelé isolation multi-origine, qui nécessite de déployer COEP. L'isolation d'origine croisée permet aux sites Web d'utiliser des fonctionnalités privilégiées, y compris SharedArrayBuffer, performance.measureUserAgentSpecificMemory() et les minuteurs haute précision avec une meilleure résolution.

Pour activer l'isolation cross-origin, 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é comme alternative à require-corp. Pour en savoir plus, consultez la documentation.

Défis liés à l'activation de COEP

Bien que l'isolation cross-origin offre aux pages Web une meilleure sécurité et la possibilité 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 éléments iframe inter-origines doivent déployer COEP et CORP. Les éléments iframe sans ces en-têtes ne seront pas chargés par le navigateur.

L'iFrame sans identifiants à la rescousse

Nous lançons <iframe credentialless> pour vous aider à intégrer des iFrames tiers qui ne définissent pas COEP. En ajoutant l'attribut credentialless à l'élément <iframe>, l'iframe est chargée à partir d'un contexte différent et vide. En particulier, il est chargé sans cookies. Cela permet de supprimer la restriction COEP.

Exemple :

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

Cette iFrame est créée dans un nouveau contexte éphémère et n'a accès à aucun des cookies associés au site Web de niveau supérieur. Au lieu de cela, il commence avec un pot de biscuits vide. De même, les API de stockage telles que LocalStorage, CacheStorage, IndexedDB, etc., chargent et stockent des données dans la nouvelle partition éphémère. La partition est limitée au 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 iFrames sans identifiants ne sont pas soumis aux règles d'intégration COEP. Ils restent sécurisés: comme ils sont chargés à partir d'un nouveau contexte vide à chaque fois, ils ne doivent pas contenir de données personnalisées, ce que recherchent les pirates informatiques. Si une iFrame ne contient que des données publiques, elle n'est pas intéressante pour un pirate informatique.

Démo

Vous pouvez consulter une démo d'une iframe sans identifiants.

Questions fréquentes

Cette fonctionnalité sera-t-elle adoptée par d'autres navigateurs ?

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

Oui. Il est hérité. Une fois qu'une iframe n'utilise plus d'identifiants, cela s'applique à toutes les iframes de l'ensemble du sous-arbre, 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. Elles sont créées dans un nouveau contexte de premier niveau standard et ne nécessitent pas d'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 est vrai dans une iframe sans identifiants et faux dans le cas contraire. Sa valeur est undefined dans un navigateur Web qui n'est pas compatible avec <iframe credentialless>.

Ressources