W3C dice que hay un nuevo atributo en HTML5.1 llamada nonce
para style
y script
que 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.
script
ystyle
? Algo como la prohibición de hotlink?Respuestas:
El
nonce
atributo le permite "incluir en la lista blanca" ciertos elementosscript
ystyle
elementos en línea , al tiempo que evita el uso de launsafe-inline
directiva CSP (que permitiría todo en líneascript
/style
), de modo que aún conserva la característica clave de CSP de no permitir en líneascript
/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 "incluirnonce
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: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 parascript-src
ostyle-src
: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
ostyle
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
.fuente
nonce
atributo, 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<script type="text/javascript" nonce>
y<style type="text/css" nonce>