Why hosted pages are served with CSP sandbox
Por qué las páginas alojadas se sirven con CSP sandbox
Pourquoi les pages hébergées sont diffusées avec CSP sandbox
Por que páginas hospedadas são servidas com CSP sandbox
A host that serves HTML written by other people is running other people's code in the browser of anyone who visits. That is not a bug to patch later — it is the product. This page is the header we set, what it costs a hosted page, and what it deliberately leaves alone.
Un alojamiento que sirve HTML escrito por otras personas está ejecutando el código de esas personas en el navegador de quien las visite. Eso no es un fallo que se parchea luego: es el producto. Esta página es la cabecera que ponemos, lo que le cuesta a una página alojada y lo que a propósito no toca.
Un hébergeur qui diffuse du HTML écrit par d’autres personnes exécute le code de ces personnes dans le navigateur de quiconque les visite. Ce n’est pas un défaut que l’on corrige plus tard : c’est le produit. Cette page donne l’en-tête que nous posons, ce qu’il coûte à une page hébergée et ce qu’il ne touche délibérément pas.
Uma hospedagem que serve HTML escrito por outras pessoas está executando o código delas no navegador de quem as visita. Isso não é um defeito que se corrige depois: é o produto. Esta página é o cabeçalho que colocamos, o que ele custa para uma página hospedada e o que deliberadamente não encosta.
The failure being prevented
Suppose a hundred sites are served from one origin and the control panel sits on that same origin, authenticated by a cookie scoped to it. One hosted page with a malicious script — or an innocent one that loaded a malicious third party — can then read that cookie from any visitor who happens to be signed in, and use it as their own session. Nothing in the uploaded files had to be exploited; the arrangement was enough.
Two independent things stop that here, and neither one alone is the answer.
El fallo que se evita
Supón que cien sitios se sirven desde un mismo origen y el panel de control está en ese mismo origen, autenticado con una cookie acotada a él. Una página alojada con un script malicioso — o una inocente que cargó un tercero malicioso — puede entonces leer esa cookie de cualquier visitante que resulte estar registrado y usarla como suya. No hacía falta explotar nada de los ficheros subidos: el montaje era suficiente.
Aquí cortan eso dos cosas independientes, y ninguna de las dos vale por sí sola.
L’accident évité
Supposez que cent sites soient diffusés depuis une même origine et que le tableau de bord se trouve sur cette origine, authentifié par un cookie limité à celle-ci. Une page hébergée contenant un script malveillant — ou une page innocente ayant chargé un tiers malveillant — peut alors lire ce cookie de n’importe quel visiteur connecté et s’en servir comme de sa propre session. Rien dans les fichiers envoyés n’avait à être exploité : le montage suffisait.
Ici, deux éléments indépendants coupent cet accident, et aucun des deux ne répond à lui seul.
A falha que se evita
Suponha que cem sites sejam servidos por uma mesma origem e que o painel de controle esteja nessa mesma origem, autenticado por um cookie restrito a ela. Uma página hospedada com um script malicioso — ou uma inocente que carregou um terceiro malicioso — pode então ler esse cookie de qualquer visitante que esteja logado e usá-lo como se fosse a sessão dele. Não precisava explorar nada dos arquivos enviados: a montagem bastava.
Aqui duas coisas independentes cortam isso, e nenhuma das duas resolve sozinha.
Layer one: the address itself
Every project gets its own origin: <slug>.deployloft.com. The panel lives on deployloft.com, and its session cookie is set without a Domain attribute, which makes it a host-only cookie — the browser will not send it to anything.deployloft.com, ever. It is also HttpOnly, so page script cannot read it even on the panel's own host, and SameSite=Lax, so a third-party page cannot get the browser to attach it to a background request.
That is the layer that does the real work. The second one exists so the first cannot be undone by a mistake in a filename.
Primera capa: la dirección
Cada proyecto tiene su propio origen: <slug>.deployloft.com. El panel vive en deployloft.com y su cookie de sesión se pone sin atributo Domain, lo que la convierte en una cookie de solo ese host: el navegador nunca la enviará a cosa.deployloft.com. Es además HttpOnly, así que el script de la página no puede leerla ni siquiera en el host del panel, y SameSite=Lax, así que una página de terceros no consigue que el navegador la adjunte a una petición de fondo.
Esa es la capa que hace el trabajo de verdad. La segunda existe para que un error en un nombre de fichero no pueda deshacerla.
Première couche : l’adresse elle-même
Chaque projet reçoit sa propre origine : <slug>.deployloft.com. Le tableau de bord vit sur deployloft.com, et son cookie de session est posé sans attribut Domain, ce qui en fait un cookie réservé à cet hôte : le navigateur ne l’enverra jamais à chose.deployloft.com. Il est aussi HttpOnly, donc le script de la page ne peut pas le lire même sur l’hôte du tableau de bord, et SameSite=Lax, donc une page tierce ne peut pas faire attacher ce cookie à une requête de fond.
C’est la couche qui fait le vrai travail. La seconde existe pour qu’une erreur dans un nom de fichier ne puisse pas l’annuler.
Primeira camada: o próprio endereço
Cada projeto recebe sua origem: <slug>.deployloft.com. O painel fica em deployloft.com e seu cookie de sessão é definido sem atributo Domain, o que o torna um cookie de host único — o navegador nunca o enviará para alguma.coisa.deployloft.com. Ele também é HttpOnly, então o script da página não consegue lê-lo nem no host do painel, e SameSite=Lax, então uma página de terceiros não consegue fazer o navegador anexá-lo a uma requisição de fundo.
Essa é a camada que faz o trabalho real. A segunda existe para que um erro num nome de arquivo não possa desfazê-la.
Layer two: the sandbox header
The HTML we serve for a hosted page carries exactly this:
content-security-policy: sandbox allow-scripts allow-forms allow-popups allow-modals allow-downloads allow-pointer-lock allow-orientation-lock
sandbox with no token at all would freeze the page: no scripts, no forms, no popups. The tokens above put those back — but notice what is not on the list. allow-same-origin is the one that matters, and it is absent on purpose. Without it the document gets an opaque origin: it is treated as if it came from somewhere with no name, so it has no standing to use web storage or send cookies, even for its own host.
Why repeat a protection the address already gives? Because the address is a fact about routing and the header is a fact about every response. A future change to how the panel is reached, a preview host added for someone, a wildcard DNS edit made at the wrong moment — none of those can turn a hosted page into a peer of the console while this header stays where it is.
Segunda capa: la cabecera sandbox
El HTML que servimos de una página alojada lleva exactamente esto:
content-security-policy: sandbox allow-scripts allow-forms allow-popups allow-modals allow-downloads allow-pointer-lock allow-orientation-lock
sandbox sin ningún token congelaría la página: ni scripts, ni formularios, ni ventanas. Los de arriba devuelven eso — pero fíjate en lo que no está en la lista. allow-same-origin es la que importa y falta a propósito. Sin ella el documento recibe un origen opaco: se trata como si viniera de un sitio sin nombre, así que no tiene derecho a usar almacenamiento web ni a enviar cookies, ni siquiera las de su propio host.
¿Por qué repetir lo que la dirección ya da? Porque la dirección es un hecho del enrutado y la cabecera es un hecho de cada respuesta. Un cambio futuro en cómo se llega al panel, un host de vistas previas añadido para alguien, una edición del DNS comodín en el momento equivocado: nada de eso puede convertir una página alojada en igual del panel mientras esta cabecera siga donde está.
Seconde couche : l’en-tête sandbox
Le HTML que nous diffusons pour une page hébergée porte exactement ceci :
content-security-policy: sandbox allow-scripts allow-forms allow-popups allow-modals allow-downloads allow-pointer-lock allow-orientation-lock
sandbox sans aucun jeton gèlerait la page : pas de scripts, pas de formulaires, pas de fenêtres. Les jetons ci-dessus les rendent — mais remarquez ce qui n’est pas sur la liste. allow-same-origin est celui qui compte, et il absent volontairement. Sans lui, le document reçoit une origine opaque : il est traité comme venant d’un endroit sans nom, donc il n’a pas qualité pour utiliser le stockage web ni envoyer des cookies, même ceux de son propre hôte.
Pourquoi redoubler une protection que l’adresse donne déjà ? Parce que l’adresse est un fait de routage et l’en-tête un fait de chaque réponse. Un changement futur de la façon dont on atteint le tableau de bord, un hôte d’aperçus ajouté pour quelqu’un, une modification du DNS joker faite au mauvais moment : rien de tout cela ne peut transformer une page hébergée en égale de la console tant que cet en-tête reste en place.
Segunda camada: o cabeçalho sandbox
O HTML que servimos para uma página hospedada traz exatamente isto:
content-security-policy: sandbox allow-scripts allow-forms allow-popups allow-modals allow-downloads allow-pointer-lock allow-orientation-lock
sandbox sem nenhum token congelaria a página: sem scripts, sem formulários, sem janelas. Os tokens acima devolvem isso — mas repare no que não está na lista. allow-same-origin é o que importa, e falta de propósito. Sem ele o documento recebe uma origem opaca: é tratado como se viesse de um lugar sem nome, então não tem direito a usar armazenamento web nem a enviar cookies, nem os do seu próprio host.
Por que repetir uma proteção que o endereço já dá? Porque o endereço é um fato do roteamento e o cabeçalho é um fato de cada resposta. Uma mudança futura em como se chega ao painel, um host de pré-visualização adicionado para alguém, uma edição do DNS curinga no momento errado: nada disso pode transformar uma página hospedada em igual do painel enquanto este cabeçalho estiver onde está.
What stops working inside your page
localStorage,sessionStorageandIndexedDBthrow when touched. Anything built on them silently degrades or fails: a saved theme toggle, a shopping cart, a comment embed, an offline cache you wrote yourself.document.cookieis unavailable, so a script cannot set or read a cookie for your subdomain. Analytics that identify a visitor by a stored cookie will not persist an identifier across visits.- The page cannot frame or navigate the panel, and it cannot become an origin that the browser trusts with anything.
None of this is a limit of the storage or the network. It is the browser refusing to give a document with no origin any state to keep. All of it is the default, and there is a switch below that gives one of your projects its origin back.
Qué deja de funcionar dentro de tu página
localStorage,sessionStorageeIndexedDBlanzan error al tocarlos. Todo lo construido encima se degrada o falla en silencio: un interruptor de tema que recuerda, un carrito, un bloque de comentarios integrado, una caché offline que escribiste tú.document.cookieno está disponible, así que un script no puede poner ni leer una cookie de tu subdominio. Una analítica que identifica al visitante por una cookie guardada no va a persistir un identificador entre visitas.- La página no puede enmarcar ni navegar al panel, y no puede convertirse en un origen en el que el navegador deposite nada.
Nada de esto es un límite del almacenamiento o de la red. Es el navegador negándose a darle a un documento sin origen estado que conservar. Así viene por defecto, y más abajo hay un interruptor que le devuelve el origen a uno de tus proyectos.
Ce qui cesse de fonctionner dans votre page
localStorage,sessionStorageetIndexedDBlèvent une erreur dès qu’on y touche. Tout ce qui est construit dessus se dégrade ou échoue en silence : un choix de thème mémorisé, un panier, un bloc de commentaires intégré, un cache hors-ligne écrit par vous.document.cookien’est pas disponible, donc un script ne peut ni poser ni lire un cookie pour votre sous-domaine. Une analytique qui identifie un visiteur par un cookie stocké ne conservera pas d’identifiant d’une visite à l’autre.- La page ne peut pas encadrer ni naviguer vers le tableau de bord, et ne peut pas devenir une origine à laquelle le navigateur confierait quoi que ce soit.
Rien de tout cela ne vient d’une limite du stockage ou du réseau. C’est le navigateur qui refuse de donner à un document sans origine un état à conserver. C’est le réglage par défaut, et il y a plus bas un commutateur qui rend son origine à un de vos projets.
O que deixa de funcionar dentro da sua página
localStorage,sessionStorageeIndexedDBlançam erro ao serem tocados. O que é construído em cima se degrada ou falha em silêncio: um botão de tema que lembra, um carrinho, um bloco de comentários embutido, um cache offline que você escreveu.document.cookienão está disponível, então um script não pode pôr nem ler um cookie do seu subdomínio. Uma análise que identifica o visitante por um cookie guardado não vai persistir um identificador entre visitas.- A página não pode emoldurar nem navegar até o painel, e não pode virar uma origem na qual o navegador confie alguma coisa.
Nada disso é limite do armazenamento ou da rede. É o navegador se recusando a dar a um documento sem origem algum estado para guardar. É assim por padrão, e mais abaixo existe um interruptor que devolve a origem a um dos seus projetos.
The switch: letting one of your sites keep data
Everything above is the default, and it is the right default for content you did not write. A site of your own is another case: a school page that remembers the theme, a course that saves progress, a form that keeps a draft between visits. Each project has a switch for that — Settings → Browser storage in the panel — and turning it one on adds allow-same-origin to the HTML of that site only.
content-security-policy: sandbox allow-scripts allow-forms allow-popups allow-modals allow-downloads allow-pointer-lock allow-orientation-lock allow-same-origin
It is per project, never for the whole account, and it is off until you flip it. What does not move with it: the panel session cookie is __Host-dl_session, which no page on a subdomain can set for deployloft.com; the console rejects any call whose origin is not the panel, reads included; and the other sandbox tokens stay, so the page still cannot navigate your tab to somewhere else or release a popup from the sandbox.
What you take on when you turn it on: the scripts already in that folder, and anything you pull from a CDN, now run with a real origin and can write on that subdomain. It is worth switching on for folders you built.
El interruptor: que uno de tus sitios guarde datos
Todo lo de arriba es lo predeterminado, y es lo predeterminado correcto para contenido que no has escrito tú. Un sitio tuyo es otro caso: una página de escuela que recuerda el tema, un curso que guarda el avance, un formulario que conserva el borrador entre visitas. Cada proyecto tiene un interruptor para eso — Ajustes → Datos en el navegador en el panel — y encenderlo añade allow-same-origin solo al HTML de ese sitio.
content-security-policy: sandbox allow-scripts allow-forms allow-popups allow-modals allow-downloads allow-pointer-lock allow-orientation-lock allow-same-origin
Va por proyecto, nunca por la cuenta entera, y está apagado hasta que lo pulses. Lo que no se mueve con él: la cookie de sesión del panel es __Host-dl_session, y ninguna página de un subdominio puede ponerla para deployloft.com; la consola rechaza toda llamada cuyo origen no sea el panel, incluidas las lecturas; y el resto de los tokens del sandbox se queda, así que la página sigue sin poder llevarte a otra dirección ni soltar una ventana fuera del sandbox.
Lo que asumes al encenderlo: los scripts que ya van en esa carpeta, y lo que bajes de una CDN, corren con origen real y pueden escribir en ese subdominio. Merece la pena encenderlo en carpetas que hayas construido tú.
Le commutateur : laisser un de vos sites garder des données
Tout ce qui précède est le réglage par défaut, et c’est le bon pour un contenu que vous n’avez pas écrit. Un site qui vous appartient est un autre cas : une page d’école qui mémorise le thème, un cours qui enregistre la progression, un formulaire qui garde son brouillon d’une visite à l’autre. Chaque projet a un commutateur pour cela — Réglages → Données dans le navigateur dans le tableau de bord — et l’allumer ajoute allow-same-origin au seul HTML de ce site.
content-security-policy: sandbox allow-scripts allow-forms allow-popups allow-modals allow-downloads allow-pointer-lock allow-orientation-lock allow-same-origin
Il est par projet, jamais pour le compte entier, et il est éteint tant que vous ne le pulsez pas. Ce qui ne bouge pas avec lui : le cookie de session du tableau de bord est __Host-dl_session, qu’aucune page d’un sous-domaine ne peut poser pour deployloft.com ; la console refuse tout appel dont l’origine n’est pas le panneau, y compris les lectures ; et les autres jetons du sandbox restent, donc la page ne peut toujours pas vous mener ailleurs dans votre onglet ni libérer une fenêtre hors du sandbox.
Ce que vous acceptez en l’allumant : les scripts déjà présents dans ce dossier, et tout ce que vous tirez d’un CDN, s’exécutent avec une origine réelle et peuvent écrire sur ce sous-domaine. À allumer pour des dossiers construits par vous.
O interruptor: deixar um dos seus sites guardar dados
Tudo acima é o padrão, e é o padrão certo para conteúdo que você não escreveu. Um site seu é outro caso: uma página de escola que lembra o tema, um curso que guarda o progresso, um formulário que mantém o rascunho entre visitas. Cada projeto tem um interruptor para isso — Configurações → Dados no navegador no painel — e acendê-lo adiciona allow-same-origin só ao HTML daquele site.
content-security-policy: sandbox allow-scripts allow-forms allow-popups allow-modals allow-downloads allow-pointer-lock allow-orientation-lock allow-same-origin
É por projeto, nunca para a conta inteira, e fica apagado até você ligá-lo. O que não muda com ele: o cookie de sessão do painel é __Host-dl_session, que nenhuma página de subdomínio consegue pôr para deployloft.com; a console rejeita qualquer chamada cuja origem não seja o painel, leituras incluídas; e os outros tokens do sandbox continuam, então a página ainda não pode te levar a outro endereço nem soltar uma janela fora do sandbox.
O que você assume ao acender: os scripts que já estão naquela pasta, e o que você puxar de uma CDN, rodam com origem real e podem escrever naquele subdomínio. Vale acender para pastas que você mesmo construiu.
What is deliberately left alone
Your own JavaScript runs. Your CSS, images, fonts, workers, canvas, WebGL and WebAssembly work as they do anywhere else. External requests — to your analytics, your map tiles, a public API — leave the page normally, and a hosted page may frame a third-party site or embed a video.
The reason the header says only sandbox and nothing about sources is that we are not in a position to write your content policy. A host that guesses one either blocks a script you need or quietly stops working for the person who added a tag later. So the rule is drawn in one place instead: the document may do everything, except be an origin.
That is also why a strict CSP would have been the wrong tool here. A source list restricts which code runs; the sandbox token restricts whose identity the running code has. Only the second one survives your adding a script we never anticipated.
Lo que a propósito se deja en paz
Tu JavaScript corre. Tu CSS, tus imágenes, tus fuentes, tus workers, tu canvas, WebGL y tu WebAssembly funcionan como en cualquier otro sitio. Las peticiones externas — a tu analítica, a tus mosaicos de mapa, a una API pública — salen de la página normal, y una página alojada puede enmarcar un sitio de terceros o incrustar un vídeo.
La razón de que la cabecera diga solo sandbox y nada sobre orígenes de carga es que no estamos en posición de escribir tu política de contenido. Un alojamiento que se la inventa o bloquea un script que necesitas o deja de funcionar en silencio para quien añade una etiqueta después. Así que la raya se tira en un solo sitio: el documento puede hacer de todo, menos ser un origen.
Por eso una CSP estricta habría sido la herramienta equivocada aquí. Una lista de orígenes restringe qué código corre; el token sandbox restringe la identidad con la que corre. Solo la segunda sobrevive a que añadas un script que nadie previó.
Ce qu’on laisse exprès tranquille
Votre JavaScript s’exécute. Votre CSS, vos images, vos polices, vos workers, votre canvas, WebGL et votre WebAssembly fonctionnent comme ailleurs. Les requêtes externes — vers votre analytique, vos tuiles de carte, une API publique — partent de la page normalement, et une page hébergée peut encadrer un site tiers ou intégrer une vidéo.
Si l’en-tête ne dit que sandbox et rien sur les sources, c’est que nous ne sommes pas en position d’écrire votre politique de contenu. Un hébergeur qui l’invente bloque soit un script dont vous avez besoin, soit cesse discrètement de fonctionner pour celui qui ajoute une balise plus tard. La ligne est donc tracée en un seul endroit : le document peut tout faire, sauf être une origine.
C’est aussi pour cela qu’une CSP stricte aurait été le mauvais outil ici. Une liste de sources restreint quel code s’exécute ; le jeton sandbox restreint l’identité avec laquelle il s’exécute. Seul le second survit à l’ajout d’un script que personne n’avait prévu.
O que deliberadamente se deixa em paz
Seu JavaScript roda. Seu CSS, suas imagens, suas fontes, seus workers, seu canvas, WebGL e seu WebAssembly funcionam como em qualquer outro lugar. As requisições externas — para sua análise, seus mosaicos de mapa, uma API pública — saem da página normalmente, e uma página hospedada pode emoldurar um site de terceiros ou embutir um vídeo.
A razão de o cabeçalho dizer só sandbox e nada sobre fontes é que não estamos em posição de escrever a sua política de conteúdo. Uma hospedagem que a inventa ou bloqueia um script que você precisa, ou para de funcionar em silêncio para quem adiciona uma tag depois. Então a régua se puxa em um só lugar: o documento pode tudo, menos ser uma origem.
Por isso uma CSP rígida teria sido a ferramenta errada aqui. Uma lista de fontes restringe qual código roda; o token sandbox restringe a identidade com que ele roda. Só o segundo sobrevive a você adicionar um script que ninguém previu.
The rest of the response
x-content-type-options: nosniff— a file is served as the type it was accepted as, and the browser is told not to guess otherwise.referrer-policy: no-referrer— clicking a link on a hosted page does not hand your path and query string to whoever owns the link.access-control-allow-origin: *andcross-origin-resource-policy: cross-origin— your own JavaScript, or a page on another site, may read the files of your site. A font or a JSON data file that cannot be fetched is not safer, it is just broken.cache-controlby file: HTML isno-cache, so the person who opens your link after you publish reads the new page; an asset whose name contains a content hash ismax-age=31536000, immutable; everything else sits for five minutes with an hour of stale-while-revalidate.
The panel, which is our own code rather than yours, is the opposite shape: default-src 'self', no inline scripts, frame-ancestors 'none' and cross-origin-opener-policy: same-origin. Restrictive where we control the source, permissive where we do not, and separated by an origin either way.
El resto de la respuesta
x-content-type-options: nosniff— un fichero se sirve con el tipo con el que fue aceptado, y se avisa al navegador de que no adivine otro.referrer-policy: no-referrer— pulsar un enlace en una página alojada no entrega tu ruta y tus parámetros a quien sea dueño del enlace.access-control-allow-origin: *ycross-origin-resource-policy: cross-origin— tu propio JavaScript, o la página de otro sitio, puede leer los ficheros del tuyo. Una fuente o un JSON de datos que no se puede pedir no es más seguro: está roto.cache-controlsegún el fichero: el HTML esno-cache, para que quien abra tu enlace después de publicar lea la página nueva; un recurso con la firma de contenido en el nombre esmax-age=31536000, immutable; el resto aguanta cinco minutos con una hora de stale-while-revalidate.
El panel, que es código nuestro y no tuyo, tiene la forma contraria: default-src 'self', sin scripts en línea, frame-ancestors 'none' y cross-origin-opener-policy: same-origin. Restrictivo donde mandamos nosotros, permisivo donde no, y separado en cualquier caso por un origen.
Le reste de la réponse
x-content-type-options: nosniff— un fichier est diffusé avec le type sous lequel il a été accepté, et le navigateur est averti de ne pas en deviner un autre.referrer-policy: no-referrer— cliquer un lien sur une page hébergée ne remet pas votre chemin et vos paramètres à la personne propriétaire de ce lien.access-control-allow-origin: *etcross-origin-resource-policy: cross-origin— votre propre JavaScript, ou la page d’un autre site, peut lire les fichiers du vôtre. Une police ou un JSON de données qu’on ne peut pas demander n’est pas plus sûr : il est cassé.cache-controlselon le fichier : le HTML estno-cache, pour que celui qui ouvre votre lien après votre publication lise la nouvelle page ; une ressource dont le nom porte son empreinte estmax-age=31536000, immutable; le reste tient cinq minutes avec une heure de stale-while-revalidate.
Le tableau de bord, qui est notre code et non le vôtre, a la forme inverse : default-src 'self', aucun script en ligne, frame-ancestors 'none' et cross-origin-opener-policy: same-origin. Restrictif là où nous commandons la source, permissif là où nous ne commandons rien, et séparé dans les deux cas par une origine.
O resto da resposta
x-content-type-options: nosniff— um arquivo é servido com o tipo sob o qual foi aceito, e o navegador é avisado para não adivinhar outro.referrer-policy: no-referrer— clicar um link numa página hospedada não entrega seu caminho e seus parâmetros a quem for dono do link.access-control-allow-origin: *ecross-origin-resource-policy: cross-origin— seu próprio JavaScript, ou a página de outro site, pode ler os arquivos do seu. Uma fonte ou um JSON de dados que não se pode pedir não é mais seguro: está quebrado.cache-controlconforme o arquivo: o HTML éno-cache, para que quem abrir seu link depois de publicar leia a página nova; um recurso com a assinatura de conteúdo no nome émax-age=31536000, immutable; o resto fica cinco minutos com uma hora de stale-while-revalidate.
O painel, que é código nosso e não seu, tem a forma contrária: default-src 'self', sem scripts em linha, frame-ancestors 'none' e cross-origin-opener-policy: same-origin. Restritivo onde mandamos, permissivo onde não mandamos, e separado dos dois lados por uma origem.
Check it yourself
Open any hosted page, press F12 and read the document response headers — they are the ones quoted above, not a screenshot of them. Or run it from a terminal:
curl -sI https://yoursite.deployloft.com/ | grep -i content-security-policy
If you decide you need web storage inside your site, this is not the place to do it, and the honest answer is a host that gives your page a real origin. Everything else about folder hosting still applies here.
Compruébalo tú
Abre cualquier página alojada, pulsa F12 y lee las cabeceras de la respuesta del documento — son las citadas arriba, no una captura de ellas. O ejecutalo desde una terminal:
curl -sI https://tusitio.deployloft.com/ | grep -i content-security-policy
Si decides que necesitas almacenamiento web dentro de tu sitio, este no es el lugar, y la respuesta honesta es un alojamiento que le dé a tu página un origen de verdad. Todo lo demás del alojamiento de carpetas sigue valiendo aquí.
Vérifiez-le vous-même
Ouvrez une page hébergée, appuyez sur F12 et lisez les en-têtes de la réponse du document — ce sont ceux cités ci-dessus, pas une capture d’eux. Ou lancez-le depuis un terminal :
curl -sI https://votresite.deployloft.com/ | grep -i content-security-policy
Si vous décidez d’avoir besoin du stockage web dans votre site, ce n’est pas ici qu’il faut le faire, et la réponse honnête est un hébergeur qui donne à votre page une véritable origine. Tout le reste de l’hébergement de dossiers s’applique toujours ici.
Confira você mesmo
Abra qualquer página hospedada, aperte F12 e leia os cabeçalhos da resposta do documento — são os citados acima, não uma captura deles. Ou rode isso de um terminal:
curl -sI https://seusite.deployloft.com/ | grep -i content-security-policy
Se você decidir que precisa de armazenamento web dentro do seu site, este não é o lugar, e a resposta honesta é uma hospedagem que dê à sua página uma origem de verdade. Todo o resto da hospedagem de pastas continua valendo aqui.