Outils de développement
Qu’est-ce qu’une Iframe en bac à sable ?
Un guide capacité par capacité sur le sandboxing iframe, les origines opaques, les interactions de jetons et la conception d'aperçu HTML plus sûre.
Par Vigneshwaran Vijayakumar, développeur et éditeur | | Révisé sous le Politique éditoriale de ClockTools
Table des matières
Une iframe en bac à sable est un document de navigateur intégré avec des restrictions supplémentaires appliquées par l'iframe. bac à sable attribut. Avec un vide bac à sable valeur, le navigateur démarre à partir d'une ligne de base restrictive ; individuel autoriser-* les jetons renvoient uniquement les fonctionnalités dont le contenu intégré a besoin. Pour un aperçu HTML, la conception utile la plus sûre n'est pas de « faire confiance au code ». Il s'agit de « donner à l'aperçu une limite distincte, d'ajouter les autorisations minimales et de garder les secrets hors de l'expérience ».
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 propres en-têtes du site encadré sont toujours importants, mais le cadre n'est pas automatiquement supprimé de toutes les fonctionnalités du navigateur.
Ajout bac à sable demande au navigateur d'imposer un ensemble supplémentaire de restrictions. Le Norme WHATWG HTML définit l'attribut comme un ensemble de jetons non ordonnés, séparés par des espaces. L’absence d’un jeton maintient la restriction sandbox correspondante en place ; l'ajout d'un jeton lève une restriction particulière.
Cette direction est facile à mal interpréter :
```html
<iframe sandbox srcdoc="<p>Aperçu statique</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.
```html
<iframe
sandbox="allow-scripts autorise-formulaires"
srcdoc="<button type='button'>Exécuter</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.
| Zone réglementée | Ce que la ligne de base restrictive empêche | Pourquoi un aperçu peut s'avérer important |
|---|---|---|
| Exécution du script | JavaScript ne s'exécute pas | Static HTML/CSS previews may not need it |
| 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 un aperçu de naviguer dans 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 lancer des fichiers par défaut |
| Modaux | L'alerte, la confirmation et l'invite sont bloquées | 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 restaurent les jetons d’autorisation communs ?
Considérez chaque jeton comme une décision de capacité et non comme un commutateur pratique.
| Jeton | Capacité restaurée | Question à poser avant de l'ajouter |
|---|---|---|
autoriser les scripts | JavaScript exécution | Cet aperçu nécessite-t-il réellement un comportement ? |
formulaires d'autorisation | Soumission du formulaire | L'exemple peut-il envoyer des données vers une destination externe ? |
autoriser les modaux | alerte, confirmer, et invite | Une boîte de dialogue peut-elle piéger ou interrompre l'utilisateur à plusieurs reprises ? |
autoriser les popups | Création de contextes de navigation popup | Une nouvelle fenêtre fait-elle partie de l’exercice prévu ? |
autoriser les téléchargements | Initiation au téléchargement | Le code utilisateur doit-il créer des fichiers locaux ? |
autoriser la même origine | Conservation de l'origine normale de la ressource | Cette origine pourrait-elle partager des privilèges ou du stockage avec l'hôte ? |
autoriser l'activation de la navigation supérieure par l'utilisateur | 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 un par un est nécessaire mais pas suffisant. The origin of the framed document, whether it is srcdoc ou une URL distante, la politique de sécurité du contenu de l'hôte et tout pont de message entre le cadre et le parent affectent tous la limite.
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 autoriser la même origine, le contenu en bac à sable est traité comme provenant d'une origine spéciale qui échoue aux contrôles normaux de même origine. Les développeurs appellent souvent cela une origine opaque ou unique.
Pour un en ligne srcdoc aperçu, cette séparation est précieuse. L'aperçu peut restituer un document sans être traité comme la même origine d'application que la page de l'éditeur. Il ne peut pas simplement accéder au DOM du parent ou lire le stockage de même origine comme s'il s'agissait d'un autre composant de l'hôte.
L’origine opaque ne signifie pas « hors ligne » ou « réseau désactivé ». Si les scripts sont autorisés, le code d'aperçu peut toujours effectuer des requêtes réseau autorisées par les politiques du navigateur et la destination. Il peut utiliser le processeur et la mémoire, manipuler son propre DOM et communiquer via des canaux que l'hôte expose délibérément. La frontière réduit l’autorité ; il ne certifie pas le code.
MDN met particulièrement en garde contre la combinaison autoriser les scripts et autoriser la même origine lorsque le contenu intégré est de même origine et peut supprimer son propre attribut sandbox. La leçon importante est contextuelle : ne restaurez pas les deux capacités simplement parce qu’un exemple échoue sans elles.
Comment l'aperçu ClockTools configure-t-il son bac à sable ?
Le direct ClockTools éditeur HTML en temps réel construit l'aperçu avec srcdoc. Lorsque JavaScript est activé, sa valeur de sandbox iframe est :
autoriser les scripts autoriser les formulaires autoriser les modaux
La mise en œuvre omet intentionnellement autoriser la même origine, autoriser les popups, les autorisations de navigation supérieure et l'autorisation de téléchargement. L'interface qualifie l'aperçu de bac à sable opaque, rendant la décision d'origine visible plutôt que de la cacher dans le code source.
Cette configuration prend en charge des exemples d'enseignement courants : les scripts peuvent mettre à jour l'aperçu, les formulaires peuvent exercer le comportement de validation et de soumission du navigateur, et des exemples modaux peuvent s'exécuter. Il ne transforme pas le code inconnu en code fiable. Les propres conseils de l'éditeur conseillent donc aux utilisateurs d'éviter les secrets et de revoir 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érifier | État en direct observé | Signification |
|---|---|---|
| Source de l'aperçu | srcdoc document présent | Le HTML actuel est intégré directement dans le cadre |
| Attribut bac à sable | autoriser les scripts autoriser les formulaires autoriser les modaux | 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 de support | Console et chèques visibles | Les commentaires sur l'exécution et les documents sont disponibles |
Le titre de l'iframe était « Aperçu en direct HTML », ce qui donne également à la technologie d'assistance une étiquette d'objectif pour le document intégré.
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.
autoriser les scripts plus autoriser la même origine
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
formulaires d'autorisation restaure la soumission, mais les scripts et les éléments HTML ordinaires peuvent également envoyer des requêtes par d'autres moyens. Ne placez jamais d’informations d’identification, de données client privées ou de jetons de porteur dans un aperçu non fiable et supposez que le bac à sable les contiendra.
Popups et comportement d'échappement
autoriser les popups permet à un cadre d'ouvrir un nouveau contexte de navigation. autoriser les popups à s'échapper du bac à sable permet au nouveau contexte d'éviter les indicateurs de bac à sable hérités. Cela peut être utile pour une publicité délibérément isolée ou un lien externe, mais cela élargit la surface d’examen.
Navigation supérieure
Les autorisations de navigation supérieure permettent au cadre de remplacer la page hôte dans des conditions définies. Un terrain de jeu de code en a rarement besoin. Si la navigation fait partie de la leçon, envisagez d'intercepter et d'afficher la destination au lieu d'accorder le contrôle d'aperçu sur la page de niveau supérieur.
Qu’est-ce qu’un bac à sable ne peut pas protéger ?
Un bac à sable est un mécanisme de navigateur, et non une plateforme complète de 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.
La frontière change également avec le temps, à mesure que les navigateurs et les normes évoluent. Feature behavior should be tested in the browsers the audience actually uses, and the token list should be reviewed against current specifications.
Comment concevoir un aperçu du code du navigateur ?
Commencez par le vide bac à sable attribut, puis ajoutez une capacité à la fois. Pour chaque ajout, créez un petit test d'acceptation et un test d'abus correspondant.
| Travail de lecteur | Point de départ minimal | Tester avant la sortie |
|---|---|---|
| Rendre statique HTML et CSS | Bac à sable vide | Les scripts, formulaires, fenêtres contextuelles et navigation supérieure restent bloqués |
| Enseigner les scripts DOM | Ajouter autoriser les scripts | Les exécutions de scripts, le DOM hôte et le stockage restent isolés |
| Démontrer la validation de formulaire natif | Considérez formulaires d'autorisation 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 autoriser les modaux 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 |
Gardez le protocole de message de trame parent étroit. Validez l'expéditeur, la forme du message et les commandes autorisées. N'acceptez pas de code arbitraire ou d'instructions de navigation via un message générique « d'exécution », à moins qu'il ne s'agisse du produit explicitement isolé que vous avez l'intention de créer.
Offrez un mode JavaScript-off pour l'inspection statique. Ajoutez des contrôles d’arrêt, de réinitialisation ou de rechargement pour les exemples d’emballement. Erreurs de la console Surface sans mettre en miroir les données parent sensibles dans le cadre. Traitez les feuilles de style et les scripts externes comme des dépendances réseau dont les hôtes et les contenus futurs échappent au contrôle de l'éditeur.
Pour une expérience ciblée, le éditeur HTML en temps réel expose les largeurs réactives, la capture de la console, les vérifications et son état de bac à sable opaque. Pour les travaux de publication impliquant des packages, des serveurs, des informations d'identification, des tests ou un déploiement, déplacez le code vers un référentiel local et utilisez un workflow de développement et de révision de sécurité plus complet.
Foire aux questions
À quoi sert l’attribut iframe sandbox ?
Il applique des restrictions supplémentaires au document encadré. Une valeur sandbox vide part de la ligne de base restrictive, tandis que les jetons d'autorisation séparés par des espaces restaurent les fonctionnalités sélectionnées telles que les scripts ou les formulaires.
Le mode bac à sable signifie-t-il que l'iframe est totalement sûr ?
Non. Le sandboxing réduit l'autorité mais ne garantit pas que le code est fiable, bloque chaque requête réseau, empêche l'épuisement des ressources, nettoie HTML ou protège les secrets placés dans l'aperçu.
Qu'est-ce qu'une origine opaque dans une iframe en bac à sable ?
Lorsque l'autorisation de même origine est absente, le document encadré est traité comme ayant une origine spéciale qui échoue aux contrôles normaux de même origine. Cela permet d'éviter qu'il agisse comme la même origine d'application que le parent.
Pourquoi les scripts d'autorisation avec autorisation de même origine sont-ils risqués ?
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 terrain de jeu HTML devrait-il autoriser JavaScript ?
Seulement lorsque le travail de lecteur en a besoin. Une visionneuse statique HTML/CSS peut bloquer les scripts. Un terrain de jeu interactif peut ajouter des scripts d'autorisation tout en préservant une origine opaque et en superposant les contrôles de ressources, de messagerie, de réinitialisation et de gestion des secrets.

