Outils de développement
Qu'est-ce qu'une iframe en bac à sable ?
Un guide fonction par fonction de l'isolation des iframes, des origines opaques, des interactions entre jetons et d'un aperçu HTML plus sûr.
Par Vigneshwaran Vijayakumar, développeur et éditeur | | Révisé conformément à la politique éditoriale de ClockTools
Table des matières
Une iframe en bac à sable est un document intégré auquel l'attribut sandbox impose des restrictions supplémentaires. Avec une valeur sandbox vide, le navigateur applique une configuration restrictive ; les jetons allow-* rétablissent uniquement les fonctionnalités nécessaires au contenu. Pour un aperçu HTML, le principe n'est pas de « faire confiance au code », mais d'isoler l'aperçu, d'ajouter le minimum d'autorisations et de ne pas y placer de secrets.
Qu'est-ce qui change lorsqu'une iframe est mise en bac à sable ?
Une iframe ordinaire crée un contexte de navigation imbriqué. La politique de même origine, la politique d'autorisations, la politique de sécurité du contenu et les en-têtes du site intégré restent importants, mais l'iframe n'est pas automatiquement privée de toutes les fonctionnalités du navigateur.
Ajouter sandbox demande au navigateur d'appliquer des restrictions supplémentaires. La norme HTML WHATWG définit cet attribut comme un ensemble non ordonné de jetons séparés par des espaces. Sans un jeton, la restriction correspondante reste active ; l'ajouter lève une restriction particulière.
Cette direction est facile à mal interpréter :
<iframe sandbox srcdoc="<p>Static preview</p>"></iframe>C'est la forme restrictive. Cela ne signifie pas « aucune option de bac à sable sélectionnée ». Cela signifie que le bac à sable est actif et qu'aucune de ses fonctionnalités facultatives n'a été restaurée.
<iframe
sandbox="allow-scripts allow-forms"
srcdoc="<button type='button'>Run</button>">
</iframe>Cette version autorise les scripts et le comportement des formulaires tout en laissant d'autres restrictions en place. Le résultat exact en matière de sécurité dépend toujours de l’origine du contenu et de ce que l’application environnante expose.
Quelles restrictions s'appliquent par défaut ?
La norme complète contient plus de détails qu’une simple liste de contrôle, mais ces catégories expliquent la plupart des comportements d’aperçu.
| Fonction restreinte | Ce que la configuration restrictive empêche | Pourquoi cela compte pour un aperçu |
|---|---|---|
| Exécution du script | JavaScript ne s'exécute pas | Les aperçus HTML/CSS statiques peuvent s'en passer |
| Soumission du formulaire | Les formulaires ne peuvent pas être soumis | Les exemples interactifs peuvent nécessiter une validation sans réelle soumission |
| Popups et nouveaux contextes | Les nouvelles fenêtres et onglets sont contraints | Empêche un exemple de générer librement des pages |
| Navigation de niveau supérieur | Le frame ne peut pas remplacer librement la page hôte | Empêche l'aperçu de remplacer la page de l'éditeur |
| Traitement d'origine | Le contenu peut se voir attribuer une origine opaque unique | Sépare le stockage et l'accès de même origine de l'hôte |
| Téléchargements | Les téléchargements sont bloqués sans l'autorisation appropriée | Empêche un exemple de déclencher des téléchargements par défaut |
| Boîtes de dialogue modales | Alert, confirm et prompt sont bloqués | Certains exemples pédagogiques utilisent des dialogues, mais ils interrompent l'utilisateur |
Le Référence iframe MDN répertorie les jetons actuels et explique ce que chacun restaure. Vérifiez cette référence au lieu de copier une ancienne liste de jetons dans un contrôle de sécurité de longue durée.
Que rétablissent les jetons d'autorisation courants ?
Considérez chaque jeton comme une décision d'autorisation, pas comme un simple réglage de confort.
| Jeton | Capacité restaurée | Question à poser avant de l'ajouter |
|---|---|---|
allow-scripts | Exécution de JavaScript | Cet aperçu nécessite-t-il réellement un comportement ? |
allow-forms | Soumission du formulaire | L'exemple peut-il envoyer des données vers une destination externe ? |
allow-modals | alert, confirm, et prompt | Une boîte de dialogue peut-elle piéger ou interrompre l'utilisateur à plusieurs reprises ? |
allow-popups | Création de contextes de navigation popup | Une nouvelle fenêtre fait-elle partie de l’exercice prévu ? |
allow-downloads | Déclenchement d'un téléchargement | Le code utilisateur doit-il créer des fichiers locaux ? |
allow-same-origin | Conservation de l'origine normale de la ressource | Cette origine pourrait-elle partager des privilèges ou du stockage avec l'hôte ? |
allow-top-navigation-by-user-activation | Navigation de niveau supérieur initiée par l'utilisateur | Quitter l'éditeur est-il une action explicite de l'utilisateur ? |
Certains jetons interagissent. Les examiner séparément est nécessaire, mais insuffisant. L'origine du document intégré, sa source srcdoc ou distante, la politique de sécurité du contenu de l'hôte et le protocole de messages entre l'iframe et son parent influencent tous l'isolation.
Le diagramme décrit une limite d'autorisation. Il ne prétend pas qu’un jeu de jetons rende le code arbitraire inoffensif.
Pourquoi une origine opaque est-elle importante ?
Sans allow-same-origin, le contenu du bac à sable reçoit une origine spéciale qui ne satisfait pas les vérifications habituelles de même origine. On parle souvent d'origine opaque ou unique.
Pour un aperçu srcdoc intégré, cette séparation est utile : le document peut s'afficher sans partager l'origine applicative de l'éditeur. Il ne peut pas accéder directement au DOM du parent ou au stockage de même origine comme un composant ordinaire de l'hôte.
Une origine opaque ne signifie pas « hors ligne » ou « réseau désactivé ». Si les scripts sont autorisés, l'aperçu peut effectuer les requêtes permises par le navigateur et la destination, utiliser le processeur et la mémoire, modifier son DOM et communiquer par les canaux exposés par l'hôte. Cette limite réduit ses privilèges ; elle ne certifie pas le code.
MDN met particulièrement en garde contre l'association de allow-scripts et allow-same-origin lorsque le contenu intégré est de même origine et peut supprimer son propre attribut sandbox. Ne rétablissez pas les deux fonctionnalités simplement parce qu'un exemple ne fonctionne pas sans elles.
Comment l'aperçu ClockTools configure-t-il son bac à sable ?
L'éditeur HTML en temps réel ClockTools construit l'aperçu avec srcdoc. Lorsque JavaScript est activé, l'attribut sandbox de son iframe vaut :
allow-scripts allow-forms allow-modals
L'implémentation omet volontairement allow-same-origin, allow-popups, les autorisations de navigation principale et de téléchargement. L'interface décrit l'aperçu comme un bac à sable opaque, rendant ce choix d'origine visible plutôt que de le cacher dans le code source.
Cette configuration permet des exemples pédagogiques courants : les scripts modifient l'aperçu, les formulaires testent la validation et la soumission du navigateur, et les exemples de boîtes de dialogue fonctionnent. Elle ne rend pas fiable un code inconnu. L'éditeur recommande donc d'éviter les secrets et d'examiner les scripts inconnus.
La page capture également les messages de la console et expose un panneau de vérification des documents. Ce sont des fonctionnalités d'observabilité, pas des autorisations sandbox. Un panneau de console permet d'expliquer un échec ; cela n'empêche pas une demande. Un contrôle structurel peut signaler une étiquette manquante ; il ne procède pas à un examen de sécurité complet.
Qu'a montré un contrôle de capacité ?
J'ai inspecté l'élément d'aperçu rendu dans l'espace de travail ClockTools en direct plutôt que de me fier uniquement au texte marketing.
| Vérification | État observé dans l'outil en ligne | Signification |
|---|---|---|
| Source de l'aperçu | srcdoc document présent | Le HTML actuel est intégré directement dans le cadre |
| Attribut bac à sable | allow-scripts allow-forms allow-modals | Trois capacités sont restaurées |
| Jeton de même origine | Absent | L'aperçu conserve une origine opaque |
| Étiquette d'interface | « bac à sable opaque » | La limite est divulguée à l'utilisateur |
| Panneaux complémentaires | Console et vérifications visibles | Informations disponibles sur l'exécution et le document |
Le titre de l'iframe était « Live HTML preview », ce qui décrit aussi la fonction du document intégré pour les technologies d'assistance.
Cette inspection confirme la limite configurée à ce moment-là. Cela ne prouve pas que tous les scripts possibles sont sûrs et ne remplace pas un examen du pont de messages, de la gestion des ressources externes, de la politique de sécurité du contenu ou des futures modifications du code.
Quelles combinaisons de jetons méritent une prudence particulière ?
Utilisez un examen basé sur les menaces au lieu d’une recette de jetons universels.
allow-scripts plus allow-same-origin
Cette paire peut sérieusement affaiblir l'isolation lorsque le document incorporé est de même origine et peut affecter ses conditions d'intégration. Si les deux sont requis, diffusez du contenu non fiable provenant d’une origine délibérément distincte et analysez les chemins d’échappement plutôt que de traiter l’attribut comme la seule limite.
Formulaires et accès au réseau
allow-forms rétablit la soumission, mais les scripts et les éléments HTML peuvent envoyer des requêtes autrement. Ne placez jamais d'identifiants, de données privées de clients ou de jetons bearer dans un aperçu non fiable en supposant que le bac à sable les protégera.
Fenêtres contextuelles et sortie du bac à sable
allow-popups permet à une iframe d'ouvrir un nouveau contexte de navigation. allow-popups-to-escape-sandbox permet à ce contexte de ne pas hériter des restrictions du bac à sable. Cela peut être utile pour une publicité délibérément isolée ou un lien externe, mais élargit le périmètre à examiner.
Navigation de la page principale
Les autorisations de navigation principale permettent à l'iframe de remplacer la page hôte dans certaines conditions. Un environnement d'expérimentation de code en a rarement besoin. Si la navigation fait partie de la leçon, envisagez d'intercepter la destination et de l'afficher plutôt que de donner à l'aperçu le contrôle de la page principale.
Qu’est-ce qu’un bac à sable ne peut pas protéger ?
Un bac à sable est un mécanisme du navigateur, pas une plateforme complète pour exécuter du code hostile.
- Cela n'empêche pas un utilisateur d'ouvrir le même contenu directement en dehors du cadre.
- Cela ne garantit pas que les scripts autorisés seront rapides, polis ou exempts de boucles infinies.
- Il ne bloque pas automatiquement chaque requête réseau.
- Il ne nettoie pas HTML et ne prouve pas qu'une URL est sûre.
- Il ne sécurise pas les secrets déjà placés dans l'aperçu.
- Il ne remplace pas la validation côté serveur pour les formulaires réels.
- Il ne valide pas l’accessibilité, la sémantique ou le comportement entre navigateurs.
- Il ne protège pas un autre service qui accepte une demande de l'aperçu.
Cette limite évolue avec les navigateurs et les normes. Testez les fonctionnalités dans les navigateurs réellement utilisés par votre public et confrontez la liste des jetons aux spécifications actuelles.
Comment concevoir un aperçu de code dans le navigateur ?
Commencez avec une valeur sandbox vide, puis ajoutez une fonctionnalité à la fois. Pour chacune, créez un petit test d'acceptation et un test d'abus correspondant.
| Besoin du lecteur | Point de départ minimal | Test avant publication |
|---|---|---|
| Afficher du HTML et du CSS statiques | Bac à sable vide | Les scripts, formulaires, fenêtres contextuelles et navigation supérieure restent bloqués |
| Enseigner les scripts DOM | Ajouter allow-scripts | Le script s'exécute ; le DOM et le stockage de l'hôte restent isolés |
| Démontrer la validation native des formulaires | Considérez allow-forms seulement si la soumission est requise | Les destinations inattendues ne peuvent pas recevoir de données sensibles |
| Démonstration de boîtes de dialogue | Ajouter allow-modals temporairement | Les dialogues répétés ne peuvent pas rendre l'hôte inutilisable |
| Charger des projets contrôlés par l'utilisateur | Origine séparée et contrôles en couches | Sandbox, CSP, messagerie, ressources et limites sont examinés ensemble |
Limitez le protocole de messages entre l'iframe et son parent. Validez l'expéditeur, la structure du message et les commandes autorisées. N'acceptez pas de code arbitraire ou d'instructions de navigation par un message générique « execute », sauf si vous construisez explicitement ce type de produit isolé.
Proposez un mode sans JavaScript pour l'inspection statique. Ajoutez des commandes d'arrêt, de réinitialisation ou de rechargement pour les exemples incontrôlables. Affichez les erreurs de console sans recopier les données sensibles du parent dans l'iframe. Traitez les feuilles de style et scripts externes comme des dépendances réseau dont les hôtes et le contenu futur échappent à l'éditeur.
Pour une expérience ciblée, l' éditeur HTML en temps réel propose des largeurs d'affichage adaptatives, la capture de console, des vérifications et son état de bac à sable opaque. Pour un travail de publication avec paquets, serveurs, identifiants, tests ou déploiement, transférez le code dans un dépôt local et utilisez un processus plus complet de développement et de revue de sécurité.
Questions fréquemment posées
Foire aux questions
À quoi sert l’attribut iframe sandbox ?
Il impose des restrictions supplémentaires au document intégré. Une valeur sandbox vide active la configuration restrictive ; les jetons d'autorisation séparés par des espaces rétablissent certaines fonctionnalités, comme les scripts ou les formulaires.
Une iframe en bac à sable est-elle totalement sûre ?
Non. Le bac à sable réduit les privilèges, mais ne garantit ni la fiabilité du code, ni le blocage de toutes les requêtes réseau, ni la prévention de l'épuisement des ressources, ni l'assainissement du HTML, ni la protection des secrets placés dans l'aperçu.
Qu'est-ce qu'une origine opaque dans une iframe en bac à sable ?
Sans allow-same-origin, le document intégré reçoit une origine spéciale qui ne satisfait pas les vérifications habituelles de même origine. Cela l'empêche d'agir comme s'il partageait l'origine applicative du parent.
Pourquoi associer allow-scripts et allow-same-origin est-il risqué ?
Pour le contenu de même origine, la restauration des deux fonctionnalités peut compromettre l’isolation que le bac à sable était censé fournir, y compris dans les scénarios dans lesquels du code encadré peut supprimer le bac à sable. Utilisez une origine distincte et un examen complet des menaces lorsque les deux sont requis.
Une iframe en bac à sable peut-elle effectuer des requêtes réseau ?
Potentiellement, oui. Le sandboxing n’agit pas comme un pare-feu réseau universel. Les scripts autorisés et les ressources HTML peuvent toujours effectuer des requêtes autorisées par la stratégie du navigateur et la destination.
Un environnement d'expérimentation HTML doit-il autoriser JavaScript ?
Seulement si le besoin du lecteur le justifie. Un aperçu HTML/CSS statique peut bloquer les scripts. Un environnement interactif peut ajouter allow-scripts en conservant une origine opaque et des contrôles complémentaires sur les ressources, les messages, la réinitialisation et les secrets.

