¿Cuál es el propósito del atributo HTML "nonce" para los elementos de estilo y script?

141

W3C dice que hay un nuevo atributo en HTML5.1 llamada noncepara styley scriptque puede ser utilizado por el contenido Política de Seguridad de un sitio web.

Busqué en Google, pero finalmente no entendí qué hace realmente este atributo y qué cambia al usarlo.

ata
fuente
2
Parece que es solo un poco más de seguridad para su sitio, lo agrega a un enlace o formulario y cuando se sirve la página, si el nonce no coincide con el suyo, entonces no sirve la página
Pete
@Pete ¿Quieres decir que nadie podría cargar tu scripty style? Algo como la prohibición de hotlink?
ata
también es para páginas normales y validación de formularios
Pete

Respuestas:

196

El nonceatributo le permite "incluir en la lista blanca" ciertos elementos scripty styleelementos en línea , al tiempo que evita el uso de la unsafe-inlinedirectiva CSP (que permitiría todo en línea script/ style), de modo que aún conserva la característica clave de CSP de no permitir en línea script/ styleen general.

Entonces, el nonceatributo es una forma de decirle a los navegadores que el contenido en línea de un script o elemento de estilo en particular no fue inyectado en el documento por un tercero (malicioso), sino que fue colocado intencionalmente en el documento por quien controla el servidor en el que se sirve el documento de.

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it da un buen ejemplo de cómo usar el nonceatributo, que equivale a los siguientes pasos:

  1. Por cada solicitud que su servidor web reciba para un documento en particular, haga que su servidor genere una cadena aleatoria codificada en base64 de al menos 128 bits de datos de un generador de números aleatorios criptográficamente seguro; por ejemplo, EDNnf03nceIOfn39fn3e9h3sdfa. Ese es tu nonce.

  2. Tome el nonce generado en el paso 1, y para cualquier en línea script/ styleque desee "incluir nonceen la lista blanca", haga que su código backend inserte un atributo en el documento antes de enviarlo por cable, con ese nonce como valor:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. Tome el nonce generado en el paso 1, añádalo nonce-y haga que su backend genere un encabezado CSP con ese entre los valores de la lista de origen para script-srco style-src:

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

Por lo tanto, el mecanismo de usar un nonce es una alternativa a que su backend genere un hash del contenido de la línea scripto styleque desea permitir, y luego especifique ese hash en la lista de fuentes apropiada en su encabezado CSP.

Tenga en cuenta que debido a que los navegadores no pueden (no pueden) verificar que el valor nonce enviado cambie entre las solicitudes de página, es posible, aunque totalmente desaconsejable, omitir el 1 anterior y no hacer que su backend haga nada dinámicamente por el nonce, en cuyo caso usted podría simplemente poner un nonceatributo con un valor estático en la fuente HTML de su documento y enviar un encabezado CSP estático con ese mismo valor nonce.

Pero la razón por la que no querría usar un nonce estático de esa manera es que, en primer lugar, sería un fracaso para el uso de nonce, porque, si fuera a usar un nonce estático como ese, en ese punto, bien podrías estar usando unsafe-inline.

sidehowbarker
fuente
17
No es para verificar al usuario, es para verificar que el contenido en línea de un script o elemento de estilo en particular no se inyectó en el documento de mi tercero (malicioso), sino que fue colocado intencionalmente en el documento por quien controla el servidor. se sirve desde (Actualizaré mi respuesta para decir eso.)
sideshowbarker
3
Los nonces no necesitan almacenarse; en su lugar, se generan en la memoria y se insertan en el encabezado CSP y el documento HTML que se envía por cable en las respuestas (no a la fuente almacenada en el sistema de archivos / base de datos del servidor).
sidehowbarker
3
En cuanto a cualquier razón para esforzarse en usar el nonceatributo, si no necesita usarlo absolutamente, entonces no lo haga. Realmente solo está destinado a casos en los que, por alguna razón, no puede (todavía) deshacerse de algún script en línea o contenido de estilo de un documento en particular (pero debería eliminarlo más adelante). Entonces, si por alguna razón no tiene la necesidad de mantener el contenido en línea de la secuencia de comandos y el estilo, mientras tanto, al menos puede usar el mecanismo nonce para permitir que los navegadores verifiquen que estén bien. De lo contrario, sólo debe hacer pleno uso de CSP como realmente se refiere, y no permitir que los elementos de script o de estilo en línea
sideshowbarker
2
@sideshowbarker, ¿qué hace un nonce vacío? Estoy viendo páginas con <script type="text/javascript" nonce>y<style type="text/css" nonce>
Pacerier
77
Nota: Si su script es estático, recomiendo un hash CSP, en lugar de un nonce.
Brian