Extensión de los hashes admitidos en script-src

Carlos Joan Rafael Ibarra Lopez
Carlos Joan Rafael Ibarra Lopez
Mustafa Emre Acer
Mustafa Emre Acer

Publicado: 17 de noviembre de 2025

A partir de Chrome 141, puedes unirte a la prueba de origen para probar las nuevas funciones de la Política de seguridad del contenido (CSP) que Chrome está introduciendo. Estas funciones ayudan a los sitios web a protegerse contra los ataques de XSS, ya que permiten incluir en la lista de entidades permitidas fuentes conocidas de JavaScript de manera más eficaz. Incluir en la lista de entidades permitidas el código JavaScript conocido y bloquear todas las demás fuentes es una forma eficaz de evitar los ataques de XSS. El código JavaScript que inyecte el atacante no estará en la lista de entidades permitidas y, por lo tanto, se bloqueará.

Sin estas funciones, es difícil tener una CSP "estricta" que incluya en la lista de entidades permitidas todas las fuentes de JavaScript sin tener un mecanismo de comunicación de nonce entre el host de la secuencia de comandos y el sitio, o sin conocer el hash completo de la secuencia de comandos de antemano. Ambos métodos son difíciles de implementar si la secuencia de comandos cambia con frecuencia y la aloja un tercero de confianza, pero independiente. Además, si alguna secuencia de comandos necesita usar eval, actualmente la CSP requiere que incluyas eval en la lista de entidades permitidas para todas las secuencias de comandos, lo que la hace mucho más débil.

Intentamos abordar esta brecha proporcionando un mecanismo más sólido para la inclusión en la lista de entidades permitidas basada en URLs de secuencias de comandos en script-src y un mecanismo para la inclusión en la lista de entidades permitidas de llamadas a eval. Podrás usar el mecanismo de hash existente en script-src para incluir en la lista de entidades permitidas las URLs de secuencias de comandos específicas y el código JavaScript que se pasa a eval (y otras funciones similares a eval). Si bien la inclusión en la lista de entidades permitidas basada en URLs tal vez no sea tan estricta como una CSP basada en la integridad, este mecanismo debería ser una gran mejora en la lista de entidades permitidas de nombres de host existente.

Creemos que esto proporciona una política de CSP más fácil de implementar que sigue mitigando de forma sólida los XSS, ya que bloquea los scripts inline y de evaluación no permitidos. Estas nuevas funciones se diseñaron y se implementaron cuidadosamente para permitir que los sitios establezcan una política que proporcione mejor seguridad en los navegadores que admiten la nueva funcionalidad, sin causar interrupciones ni regresiones de seguridad en los navegadores que no la admiten, y sin tener que realizar la detección del agente de usuario.

Casos de uso

Permite URLs específicas para usar con script-src

Actualmente, los sitios que desean incluir en la lista de entidades permitidas secuencias de comandos específicas para usar con script-src tienen dos opciones: incluir en la lista de entidades permitidas el contenido de las secuencias de comandos a través de la integridad de subrecursos (SRI) o usar host-source para incluir en la lista de entidades permitidas nombres de host. A menudo, la SRI no es práctica para las secuencias de comandos que cambian con frecuencia (por ejemplo, las secuencias de comandos de análisis). Se ignorará la especificación de host-source cuando también se establezca strict-dynamic, y no es una protección integral, ya que no incluye parámetros de URL. Este cambio permitirá incluir en la lista de entidades permitidas las secuencias de comandos que usen un hash de su URL (completa), lo que admitirá tanto las secuencias de comandos dinámicas como las configuraciones que usen strict-dynamic.

Permite incluir en la lista de entidades permitidas secuencias de comandos específicas para usarlas con funciones de eval o similares a eval

Algunos sitios requieren el uso de funciones eval o similares a eval (pasar código como literales de cadena en setTimeout, setInterval y setImmediate). Para estos sitios, la única opción de CSP disponible es unsafe-eval, que habilita todas las llamadas a eval. Agregaremos un mecanismo para incluir en la lista de entidades permitidas entradas específicas para la evaluación. Este nuevo mecanismo permite incluir en la lista de entidades permitidas de forma precisa las secuencias de comandos específicas necesarias a través del hash del contenido de la secuencia de comandos directamente, en lugar de verse obligado a proporcionar una CSP unsafe-eval demasiado amplia.

Comenzar

Para probar la compatibilidad con el hash de secuencias de comandos y eval, únete a la prueba de origen de hashes de URL y eval en la CSP script-src, que se ejecutará desde Chrome 141 hasta 144.

Agrega hashes a script-src

Para incluir URLs en la lista de entidades permitidas, agrega un valor a la directiva CSP script-src con el formato url-<hash-algorithm>-<script-url-hash>. Esto permitirá que se ejecute cualquier contenido que publique esa URL, independientemente del contenido. El hash solo debe incluir la URL inicial (la URL incluida en la página), no las URLs a las que redirecciona esa URL. Se admiten URLs absolutas y relativas.

Por ejemplo, el siguiente encabezado de CSP incluirá en la lista de entidades permitidas el script que se entrega en https://example.com/example.js:

Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';

donde 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' es el hash sha256 de "https://example.com/example.js".

Las secuencias de comandos evaluadas a través de eval o new Function se pueden incluir en la lista de entidades permitidas si se incluye eval-<hash-algorithm>-<script-contents-hash> en el src de la secuencia de comandos. Por ejemplo, el siguiente encabezado de CSP permitirá que se pase la cadena alert("hello world") a eval():

Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';

donde 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' es el hash sha256 de alert("hello world").

Para ayudar a impulsar la adopción, cuando un sitio habilita la prueba de origen, los hashes de las URLs y de eval se imprimirán en la consola de Herramientas para desarrolladores y se incluirán en los informes de CSP. Esto significa que se puede usar una política estricta, pero report-only, para enumerar todos los hashes necesarios para la lista de entidades permitidas.

Cómo mantener la retrocompatibilidad

Para permitir la implementación de estas políticas antes de que todos los navegadores agreguen compatibilidad, los hashes de URL se pueden enumerar después de las listas de entidades permitidas basadas en el host. Los navegadores que comprendan los nuevos tipos de hash ignorarán las listas de entidades permitidas basadas en el host anteriores, mientras que los navegadores que no comprendan los nuevos tipos de hash seguirán aplicando la lista de entidades permitidas basada en el host, lo que permitirá que los sitios establezcan ambos tipos de listas, usando la política más estricta en los navegadores que la admitan, sin tener que arriesgarse a que se produzcan interrupciones en los navegadores que no la admitan, como se muestra en el siguiente ejemplo.

Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

También presentamos strict-dynamic-url, un equivalente de strict-dynamic que solo se aplica cuando se configuran hashes de URL. Dado que strict-dynamic hace que se ignoren las listas de entidades permitidas basadas en el host, un sitio que desee incluir en la lista de entidades permitidas un hash específico y que se le aplique strict-dynamic puede usar una política como la siguiente:

Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

En este ejemplo, los navegadores que aún no admiten hashes solo aplicarán https:. Del mismo modo, los navegadores compatibles ignorarán unsafe-eval cuando haya hashes de evaluación. Por ejemplo, la siguiente política se evaluará como unsafe-eval. Esto habilita todo el uso de eval() en los navegadores que aún no admiten hashes de eval, mientras que solo permite el eval() de alert("hello world") entre los navegadores que admiten hashes de eval.

  Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"

Enviar comentarios

Nos interesan los comentarios de los desarrolladores sobre estas extensiones para script-src. Publica cualquier comentario como un problema en el explicador en GitHub.