El modelo de seguridad de la Web se basa en la política de mismo origen. El código de https://mybank.com
solo debería tener acceso a los datos de https://mybank.com
, y nunca se le debería permitir el acceso a https://evil.example.com
.
Cada origen se mantiene aislado del resto de la Web, lo que brinda a los desarrolladores una zona de pruebas segura en la que pueden compilar y jugar. En teoría, esto es brillante. En la práctica, los atacantes han encontrado formas inteligentes de subvertir el sistema.
Los ataques de secuencias de comandos entre sitios (XSS), por ejemplo, omiten la misma política de origen cuando engañan a un sitio para que entregue código malicioso junto con el contenido previsto. Este es un gran problema, ya que los navegadores confían en todo el código que aparece en una página como parte legítima del origen de seguridad de esa página. La Hoja de referencia de XSS es una muestra antigua pero representativa de los métodos que un atacante podría usar para inyectar código malicioso y infringir esta confianza. Si un atacante inyecta cualquier código de forma correcta, habrá terminado: los datos de la sesión del usuario se comprometen y la información que debería mantenerse en secreto se robará a los chicos malos. Obviamente, queremos evitarlo si es posible.
En esta descripción general, se destaca una defensa que puede reducir de forma significativa el riesgo y el impacto de los ataques de XSS en navegadores modernos: la Política de Seguridad del Contenido (CSP).
Resumen
- Usa listas de entidades permitidas para indicarle al cliente qué está permitido y qué no.
- Obtén información sobre las directivas disponibles.
- Conoce las palabras clave que usan.
- El código intercalado y
eval()
se consideran perjudiciales. - Denuncia incumplimientos de política ante tu servidor antes de aplicarlos.
Lista de entidades permitidas de fuentes
El problema que aprovechan los ataques XSS es la incapacidad del navegador para distinguir entre una secuencia de comandos que forma parte de tu aplicación y una secuencia de comandos insertada de forma malintencionada por un tercero. Por ejemplo, el botón de +1 de Google en la parte inferior de esta página carga y ejecuta código de https://apis.google.com/js/plusone.js
en el contexto del origen de esta página. Confiamos en ese código, pero no podemos esperar que el navegador descubra por sí solo que el código de apis.google.com
es genial, mientras que el código de apis.evil.example.com
probablemente no lo sea. El navegador descarga y ejecuta sin problemas cualquier código que solicite una página, sin importar la fuente.
En lugar de confiar ciegamente en todo que entrega un servidor, la CSP define el encabezado HTTP Content-Security-Policy
, que te permite crear una lista de entidades permitidas de fuentes de contenido de confianza y le indica al navegador que solo ejecute o renderice recursos de esas fuentes. Incluso si un atacante puede encontrar un hueco a través del cual insertar una secuencia de comandos, esta no coincidirá con la lista de entidades permitidas y, por lo tanto, no se ejecutará.
Dado que confiamos en que apis.google.com
entregará código válido y confiamos en que nosotros hacemos lo mismo, definamos una política que permita que se ejecute solo la secuencia de comandos cuando provenga de una de esas dos fuentes:
Content-Security-Policy: script-src 'self' https://apis.google.com
Parece simple, ¿verdad? Como probablemente adivinaste, script-src
es una directiva que controla un conjunto de privilegios relacionados con la secuencia de comandos para una página específica. Especificamos 'self'
como una fuente válida de secuencia de comandos y https://apis.google.com
como otra. El navegador descarga y ejecuta JavaScript desde apis.google.com
mediante HTTPS, además del origen de la página actual.
Cuando defines esta política, el navegador simplemente muestra un error en lugar de cargar la secuencia de comandos de cualquier otra fuente. Cuando un atacante inteligente logra insertar código en tu sitio, se encontrará con un mensaje de error en lugar del resultado exitoso que esperaban.
La política se aplica a una amplia variedad de recursos
Si bien los recursos de secuencias de comandos son los riesgos de seguridad más obvios, la CSP proporciona un amplio conjunto de directivas de políticas que permiten un control bastante detallado sobre los recursos que puede cargar una página. Ya viste script-src
, por lo que el concepto debería estar claro.
Analicemos rápidamente el resto de las directivas de recursos. La siguiente lista representa el estado de las directivas a partir del nivel 2. Se publicó una especificación de nivel 3, pero no se implementó en gran medida en los navegadores principales.
base-uri
restringe las URLs que pueden aparecer en el elemento<base>
de una página.child-src
enumera las URLs para los trabajadores y el contenido de marcos incorporados. Por ejemplo:child-src https://youtube.com
habilitaría la incorporación de videos de YouTube, pero no de otros orígenes.connect-src
limita los orígenes a los que puedes conectarte (a través de XHR, WebSockets y EventSource).font-src
especifica los orígenes que pueden entregar fuentes web. Las fuentes web de Google se pueden habilitar a través defont-src https://themes.googleusercontent.com
.form-action
enumera los extremos válidos para el envío desde etiquetas<form>
.frame-ancestors
especifica las fuentes que pueden incorporar la página actual. Esta directiva se aplica a las etiquetas<frame>
,<iframe>
,<embed>
y<applet>
. Esta directiva no se puede usar en las etiquetas<meta>
y solo se aplica a los recursos que no son HTML.frame-src
dejó de estar disponible en el nivel 2, pero se restablece en el nivel 3. Si no está presente, igualmente se recurrirá achild-src
como antes.img-src
define los orígenes desde los que se pueden cargar las imágenes.media-src
restringe los orígenes permitidos para enviar video y audio.object-src
permite controlar Flash y otros complementos.plugin-types
limita los tipos de complementos que puede invocar una página.report-uri
especifica una URL a la que un navegador enviará informes cuando se incumpla una política de seguridad del contenido. No se puede usar esta directiva en etiquetas<meta>
.style-src
es el equivalente descript-src
para las hojas de estilo.upgrade-insecure-requests
indica a los usuarios-agentes que reescriban los esquemas de URL y cambien de HTTP a HTTPS. Esta directiva es para sitios web con una gran cantidad de URL antiguas que se deben reescribir.worker-src
es una directiva de CSP de nivel 3 que restringe las URLs que se pueden cargar como trabajador, trabajador compartido o service worker. Desde julio de 2017, esta directiva tiene implementaciones limitadas.
De forma predeterminada, las directivas son muy abiertas. Si no estableces una política específica para una directiva, por ejemplo, font-src
, esa directiva se comporta de forma predeterminada como si especificaras *
como la fuente válida (por ejemplo, podrías cargar fuentes de cualquier lugar, sin restricciones).
Puedes anular este comportamiento predeterminado si especificas una directiva default-src
. Esta directiva define los valores predeterminados para la mayoría de las directivas que dejas sin especificar. En general, esto se aplica a cualquier directiva que termine con -src
. Si default-src
está configurado como https://example.com
y no especificas una directiva font-src
, podrás cargar fuentes de https://example.com
y de ninguna otra parte. En nuestros ejemplos anteriores, solo especificamos script-src
, lo que significa que las imágenes, fuentes, etc., se pueden cargar desde cualquier origen.
Las siguientes directivas no usan default-src
como resguardo. Recuerda que no establecerlas equivale a permitir todo.
base-uri
form-action
frame-ancestors
plugin-types
report-uri
sandbox
Puedes usar todas las directivas que consideres necesarias para tu aplicación específica. Solo debes enumerarlas en el encabezado HTTP y separar las directivas con punto y coma. Asegúrate de enumerar todos los recursos necesarios de un tipo específico en una única directiva. Si escribes algo como script-src https://host1.com; script-src https://host2.com
, simplemente se ignorará la segunda directiva. Algo como lo siguiente especificaría correctamente que ambos orígenes son válidos:
script-src https://host1.com https://host2.com
Por ejemplo, si tienes una aplicación que carga todos sus recursos desde una red de distribución de contenidos (por ejemplo, https://cdn.example.net
) y sabes que no necesitas complementos ni contenido con marcos, tu política podría ser similar a la siguiente:
Content-Security-Policy: default-src https://cdn.example.net; child-src 'none'; object-src 'none'
Detalles de la implementación
Verás los encabezados X-WebKit-CSP
y X-Content-Security-Policy
en varios instructivos en la Web. En el futuro, debes ignorar estos encabezados con prefijo. Los navegadores modernos (a excepción de IE) admiten el encabezado Content-Security-Policy
sin prefijo. Ese es el encabezado que deberías usar.
Independientemente del encabezado que utilices, la política se define página por página: deberás enviar el encabezado HTTP junto con cada respuesta que quieras asegurarte de estar protegida. Esto proporciona mucha flexibilidad, ya que puedes ajustar la política para páginas específicas según sus necesidades específicas. Tal vez un conjunto de páginas de tu sitio tenga el botón de +1 y otras no. Puedes permitir que el código del botón se cargue solo cuando sea necesario.
La lista de fuentes de contenido en cada directiva es flexible. Puedes especificar las fuentes por esquema (data:
, https:
), o variar en especificidad desde solo el nombre de host (example.com
, que coincide con cualquier origen en ese host: cualquier esquema y cualquier puerto) hasta un URI completamente calificado (https://example.com:443
, que solo coincide con HTTPS, solo con example.com
y solo con el puerto 443). Se aceptan comodines, pero solo como un esquema, un puerto o en la posición de más a la izquierda del nombre de host: *://*.example.com:*
coincidiría con todos los subdominios de example.com
(pero no en sí mismo example.com
), mediante cualquier esquema, en cualquier puerto.
La lista de fuentes de contenido acepta cuatro palabras clave:
'none'
, como es de esperarse, no coincide con nada.'self'
coincide con el origen actual, pero no con sus subdominios.'unsafe-inline'
permite JavaScript y CSS intercalados. (Más adelante trataremos esto con más detalle).'unsafe-eval'
permite mecanismos de texto a JavaScript, comoeval
. (Ya hablaremos de esto también).
Estas palabras clave requieren comillas simples. Por ejemplo, script-src 'self'
(con comillas) autoriza la ejecución de JavaScript desde el host actual; script-src self
(sin comillas) permite JavaScript desde un servidor llamado "self
" (y no desde el host actual), que probablemente no es lo que querías.
Zona de pruebas
Hay una directiva más que vale la pena mencionar: sandbox
. Es un poco diferente de los otros que analizamos, ya que impone restricciones sobre las acciones que puede realizar la página en lugar de los recursos que puede cargar. Si está presente la directiva sandbox
, se trata la página como si se cargara dentro de un <iframe>
con un atributo sandbox
. Esto puede tener una amplia variedad de efectos en la página, como forzarla a un origen único y evitar el envío de formularios, entre otros. Este artículo va un poco más allá del alcance de este artículo, pero puedes encontrar todos los detalles sobre los atributos válidos de la zona de pruebas en la sección "Zona de pruebas" de la especificación HTML5.
La metaetiqueta
El mecanismo de entrega preferido de la CSP es un encabezado HTTP. Sin embargo, puede ser útil establecer una política en una página directamente en el lenguaje de marcado. Para ello, usa una etiqueta <meta>
con un atributo http-equiv
:
<meta
http-equiv="Content-Security-Policy"
content="default-src https://cdn.example.net; child-src 'none'; object-src 'none'"
/>
No se puede usar para frame-ancestors
, report-uri
ni sandbox
.
El código intercalado se considera perjudicial
Debería quedar claro que la CSP se basa en orígenes de lista de entidades permitidas, ya que es una forma no ambigua de indicarle al navegador que trate conjuntos específicos de recursos como aceptables y que rechace al resto. Sin embargo, las listas de entidades permitidas basadas en el origen no resuelven la mayor amenaza que representan los ataques de XSS: la inyección de secuencias de comandos intercaladas.
Si un atacante puede insertar una etiqueta de secuencia de comandos que contiene directamente una carga útil maliciosa (<script>sendMyDataToEvilDotCom();</script>
), el navegador no tiene un mecanismo para distinguirla de una etiqueta legítima de secuencia de comandos intercalada. La CSP resuelve este problema bloqueando por completo las secuencias de comandos intercaladas: es la única forma de asegurarse.
Este bloqueo incluye no solo secuencias de comandos incorporadas directamente en las etiquetas script
, sino también controladores de eventos intercalados y URLs de javascript:
. Deberás mover el contenido de las etiquetas script
a un archivo externo y reemplazar las URLs de javascript:
y <a ... onclick="[JAVASCRIPT]">
por las llamadas addEventListener()
adecuadas. Por ejemplo, puedes reescribir lo siguiente:
<script>
function doAmazingThings() {
alert('YOU AM AMAZING!');
}
</script>
<button onclick="doAmazingThings();">Am I amazing?</button>
a algo como esto:
<!-- amazing.html -->
<script src="amazing.js"></script>
<button id="amazing">Am I amazing?</button>
<div style="clear:both;"></div>
// amazing.js
function doAmazingThings() {
alert('YOU AM AMAZING!');
}
document.addEventListener('DOMContentLoaded', function () {
document.getElementById('amazing').addEventListener('click', doAmazingThings);
});
El código reescrito tiene varias ventajas más allá de que funciona bien con la CSP. Ya es una práctica recomendada, sin importar el uso de la CSP. JavaScript intercalado combina la estructura y el comportamiento exactamente de la manera deseada. Los recursos externos son más fáciles de almacenar en caché para los navegadores, más fáciles de comprender para los desarrolladores y propicios para la compilación y la reducción. Escribirás mejor código si te tomas el trabajo de mover el código a recursos externos.
El estilo intercalado se trata de la misma manera: tanto el atributo style
como las etiquetas style
deben consolidarse en hojas de estilo externas para protegerse de una variedad de métodos de robo de datos sorprendentemente inteligentes que permite CSS.
Si necesitas tener estilo y secuencia de comandos intercalados, puedes habilitarlos agregando 'unsafe-inline'
como fuente permitida en una directiva script-src
o style-src
. También puedes usar un nonce o un hash (consulta a continuación), pero realmente no deberías hacerlo.
Bloquear las secuencias de comandos intercaladas es la mayor victoria de seguridad que puede obtener la CSP, y prohibir el estilo intercalado también endurece la aplicación. Asegurarse de que todo funcione correctamente después de mover todo el código
es un poco de esfuerzo al principio, pero ese es un problema que vale la pena hacer.
Si debes usarlo,
La CSP nivel 2 ofrece retrocompatibilidad para las secuencias de comandos intercaladas, ya que te permite agregar secuencias de comandos intercaladas específicas a la lista de entidades permitidas mediante un nonce criptográfico (número usado una vez) o un hash. Aunque esto puede resultar engorroso, es útil como sustituto.
Para usar un nonce, asigna un atributo nonce a tu etiqueta de secuencia de comandos. Su valor debe coincidir con uno de la lista de fuentes de confianza. Por ejemplo:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
// Some inline code I can't remove yet, but need to asap.
</script>
Ahora, agrega el nonce a tu directiva script-src
junto a la palabra clave nonce-
.
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
Recuerda que los nonces deben volver a generarse para cada solicitud de página y deben ser indescifrables.
Los hashes funcionan de la misma manera. En lugar de agregar código a la etiqueta de la secuencia de comandos, crea un hash SHA de la secuencia de comandos y agrégalo a la directiva script-src
.
Por ejemplo, supongamos que tu página incluye lo siguiente:
<script>
alert('Hello, world.');
</script>
Tu política contendría lo siguiente:
Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='
Hay que tener en cuenta algunos aspectos. El prefijo sha*-
especifica el algoritmo que genera el hash. En el ejemplo anterior, se usa sha256-
. La CSP también es compatible con sha384-
y sha512-
. Cuando generes el hash, no incluyas las etiquetas <script>
. Además, el uso de mayúsculas y los espacios en blanco son importantes, incluidos los espacios en blanco iniciales o finales.
Si realizas una Búsqueda de Google sobre cómo generar un hash SHA, verás soluciones en distintos idiomas. Con Chrome 40 o versiones posteriores, puedes abrir Herramientas para desarrolladores y volver a cargar tu página. La pestaña Console contendrá mensajes de error con el hash SHA256 correcto para cada una de tus secuencias de comandos intercaladas.
Evaluación también
Incluso cuando un atacante no pueda insertar una secuencia de comandos de forma directa, podría engañar a tu aplicación para que convierta texto inerte en JavaScript ejecutable y lo ejecute en su nombre. eval()
, new Function(), setTimeout([string], ...)
y setInterval([string], ...)
son vectores a través de los cuales el texto inyectado podría terminar ejecutando algo malicioso de forma inesperada. La respuesta predeterminada de la CSP a este riesgo es bloquear por completo todos estos vectores.
Esto afecta de varias formas la manera en la que compilas las aplicaciones:
- Debes analizar JSON a través del
JSON.parse
integrado, en lugar de depender deeval
. Las operaciones nativas de JSON están disponibles en todos los navegadores desde IE8 y son completamente seguras. - Vuelve a escribir cualquier llamada a
setTimeout
osetInterval
que estés haciendo actualmente con funciones intercaladas en lugar de strings. Por ejemplo:
setTimeout("document.querySelector('a').style.display = 'none';", 10);
se escribiría mejor de la siguiente manera:
setTimeout(function () {
document.querySelector('a').style.display = 'none';
}, 10);
- Evita las plantillas intercaladas en el entorno de ejecución: Muchas bibliotecas de plantillas usan
new Function()
libremente para acelerar la generación de plantillas en el tiempo de ejecución. Es una aplicación noventa de programación dinámica, pero existe el riesgo de evaluar texto malicioso. Algunos frameworks admiten CSP de inmediato, y recurren a un analizador sólido en ausencia deeval
. La directiva ng-csp de AngularJS es un buen ejemplo de esto.
Sin embargo, una mejor opción sería un lenguaje de plantillas que ofrezca precompilación (Handlebars lo hace, por ejemplo). La compilación previa de tus plantillas puede hacer que la experiencia del usuario sea aún más rápida que la implementación del entorno de ejecución más rápida y, además, es más segura. Si eval y sus hermanos de texto a JavaScript son esenciales para tu aplicación, puedes habilitarlos agregando 'unsafe-eval'
como fuente permitida en una directiva script-src
, pero no lo recomendamos. Bloquear la capacidad de ejecutar cadenas
hace que sea mucho más difícil para un atacante ejecutar código
no autorizado en tu sitio.
Informes
La capacidad de la CSP para bloquear recursos que no son de confianza del cliente es una gran ventaja para tus usuarios, pero sería bastante útil que se envíe algún tipo de notificación al servidor para que puedas identificar y corregir, en primer lugar, cualquier error que permita la inserción maliciosa. Para ello, puedes indicarle al navegador que POST
los informes de incumplimientos con formato JSON en una ubicación especificada en una directiva report-uri
.
Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
Esos informes se verán más o menos de la siguiente manera:
{
"csp-report": {
"document-uri": "http://example.org/page.html",
"referrer": "http://evil.example.com/",
"blocked-uri": "http://evil.example.com/evil.js",
"violated-directive": "script-src 'self' https://apis.google.com",
"original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser"
}
}
Encontrarás información útil que te ayudará a localizar la causa específica del incumplimiento, incluida la página en la que se produjo el incumplimiento (document-uri
), la URL de referencia de esa página (a diferencia del campo de encabezado HTTP, la clave no está mal escrita), el recurso que infringió la política de la página (blocked-uri
), la directiva específica que infringió (violated-directive
) y la política completa de la página (original-policy
).
Solo informes
Si recién comienzas a usar CSP, tiene sentido evaluar el estado actual de tu aplicación antes de implementar una política rigurosa para los usuarios.
Como punto de partida para una implementación completa, puedes pedirle al navegador que supervise una política y que informe los incumplimientos, pero que no aplique las restricciones. En lugar de enviar un encabezado Content-Security-Policy
, envía un encabezado Content-Security-Policy-Report-Only
.
Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
La política especificada en el modo de solo informes no bloqueará los recursos restringidos, pero enviará informes de incumplimientos a la ubicación que especifiques. Incluso puedes enviar ambos encabezados, aplicar una política mientras se supervisa otra. Esta es una excelente manera de evaluar el efecto de los cambios en la CSP de tu aplicación: activa los informes para una política nueva, supervisa los informes de incumplimiento y corrige los errores que aparezcan. Cuando estés conforme con su efecto, comienza a aplicar la política nueva.
Uso en el mundo real
CSP 1 es bastante utilizable en Chrome, Safari y Firefox, pero tiene una compatibilidad muy limitada en IE 10. Puedes ver los detalles en caniuse.com. La CSP nivel 2 está disponible en Chrome desde la versión 40. Los sitios enormes como Twitter y Facebook implementaron el encabezado (vale la pena leer el caso de éxito de Twitter) y el estándar está muy listo para que comiences a implementarlo en tus propios sitios.
El primer paso a fin de crear una política para tu aplicación es evaluar los recursos que cargas en realidad. Una vez que creas que tienes claro cómo se organizan las cosas en tu app, configura una política que se base en esos requisitos. Analicemos algunos casos de uso comunes y determinemos la mejor manera de admitirlos dentro de los límites de protección de CSP.
Caso de uso n.o 1: Widgets de redes sociales
El botón de +1 de Google incluye una secuencia de comandos de
https://apis.google.com
e incorpora un<iframe>
dehttps://plusone.google.com
. Necesitas una política que incluya ambos orígenes para incorporar el botón. Una política mínima seríascript-src https://apis.google.com; child-src https://plusone.google.com
. También debes asegurarte de que el fragmento de JavaScript que Google proporciona se extraiga y se incluya en un archivo JavaScript externo. Si tenías una política basada en el nivel 1 que usa el nivel 2 deframe-src
requería que la cambiaras achild-src
. Esto ya no es necesario en el nivel de CSP 3.El botón Me gusta de Facebook tiene varias opciones de implementación. Te recomendamos que uses la versión
<iframe>
, ya que puede ser una zona de pruebas segura del resto de tu sitio. Requiere una directivachild-src https://facebook.com
para funcionar correctamente. Ten en cuenta que, de forma predeterminada, el código<iframe>
que proporciona Facebook carga una URL relativa,//facebook.com
. Cambia eso para especificar HTTPS de forma explícita:https://facebook.com
. No hay razones para usar HTTP si no es necesario.El botón de tweet de Twitter se basa en el acceso a una secuencia de comandos y un marco, ambos alojados en
https://platform.twitter.com
. (Asimismo, Twitter proporciona una URL relativa de forma predeterminada. Edita el código para especificar HTTPS cuando lo copies o pegues de forma local). Conscript-src https://platform.twitter.com; child-src https://platform.twitter.com
, estará todo listo, siempre que muevas el fragmento de JavaScript que proporciona Twitter a un archivo JavaScript externo.Otras plataformas tienen requisitos similares y se pueden abordar de manera similar. Te sugerimos que simplemente configures un
default-src
de'none'
y que mires tu consola a fin de determinar qué recursos necesitarás habilitar para que funcionen los widgets.
Incluir varios widgets es sencillo: simplemente combina las directivas de la política y recuerda fusionar todos los recursos de un mismo tipo en una sola. Si quisieras los widgets de las tres redes sociales, la política se vería así:
script-src https://apis.google.com https://platform.twitter.com; child-src https://plusone.google.com https://facebook.com https://platform.twitter.com
Caso de uso n.o 2: Bloqueo
Imagina por un momento que diriges el sitio de un banco y quieres asegurarte de que solo se puedan cargar los recursos que escribiste. En esta situación,
comienza con una política predeterminada que bloquee absolutamente todo (default-src 'none'
) y continúa desde allí.
Supongamos que el banco carga todas las imágenes, el estilo y la secuencia de comandos desde una CDN en https://cdn.mybank.net
, y se conecta mediante XHR a https://api.mybank.com/
para extraer varios bits de datos. Se usan marcos, pero solo para páginas locales del sitio (sin orígenes de terceros). El sitio no cuenta con Flash, fuentes ni extras. El encabezado de CSP más restrictivo que podríamos enviar es el siguiente:
Content-Security-Policy: default-src 'none'; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; img-src https://cdn.mybank.net; connect-src https://api.mybank.com; child-src 'self'
Caso de uso n.o 3: Solo SSL
El administrador de un foro de debate sobre anillos de boda quiere asegurarse de que todos los recursos se carguen solo a través de canales seguros, pero en realidad no escribe mucho código. Volver a escribir grandes partes del software del foro de terceros que está lleno de secuencias de comandos y estilo intercalados está más allá de sus capacidades. La siguiente política sería efectiva:
Content-Security-Policy: default-src https:; script-src https: 'unsafe-inline'; style-src https: 'unsafe-inline'
Aunque https:
se especifica en default-src
, las directivas de estilo y secuencia de comandos no heredan automáticamente esa fuente. Cada directiva reemplaza por completo el valor predeterminado para ese tipo específico de recurso.
El futuro
La Política de Seguridad del Contenido de nivel 2 es una recomendación candidata. El grupo de trabajo de seguridad para aplicaciones web del W3C ya comenzó a trabajar en la próxima iteración de la especificación, la Política de Seguridad del Contenido de nivel 3.
Si te interesa el debate sobre estas próximas características, obtén una vista rápida de los archivos de la lista de distribución public-webappsec@ o únete.