El nonce
atributo le permite "incluir en la lista blanca" ciertos elementos script
y style
elementos en línea , al tiempo que evita el uso de la unsafe-inline
directiva 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
/ style
en general.
Entonces, el nonce
atributo 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 nonce
atributo, que equivale a los siguientes pasos:
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.
Tome el nonce generado en el paso 1, y para cualquier en línea script
/ style
que desee "incluir nonce
en 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>
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-src
o 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 script
o style
que 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 nonce
atributo 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
.