O nonce
atributo permite que você “coloque na lista branca” certos elementos script
e inline style
, evitando o uso da unsafe-inline
diretiva CSP (o que permitiria todos os inline script
/ style
), para que você ainda mantenha o recurso principal do CSP de não permitir inline script
/ style
em geral.
Portanto, o nonce
atributo é uma maneira de informar aos navegadores que o conteúdo embutido de um script ou elemento de estilo específico não foram injetados no documento por terceiros (maliciosos), mas foram inseridos no documento intencionalmente por quem controla o servidor em que o documento é veiculado de.
https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it fornece um bom exemplo de como usar o nonce
atributo, que corresponde às seguintes etapas:
Para cada solicitação que o servidor da Web recebe para um documento específico, seu back-end gera uma sequência aleatória codificada em 64 de base de pelo menos 128 bits de dados de um gerador de números aleatórios criptograficamente seguro; por exemplo EDNnf03nceIOfn39fn3e9h3sdfa
,. Essa é a sua falta.
Pegue o nonce gerado na etapa 1 e, para qualquer inline script
/ que style
você queira "colocar na lista de permissões", faça com que seu código de back-end insira um nonce
atributo no documento antes de ser enviado por fio, com esse nonce como valor:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
Pegue o nonce gerado na etapa 1, adicione nonce-
-o previamente e faça seu back-end gerar um cabeçalho CSP com os valores da lista de fontes para script-src
ou style-src
:
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
Portanto, o mecanismo de uso de um nonce é uma alternativa para que seu back-end gere um hash do conteúdo do inline script
ou style
você deseja permitir e especifique esse hash na lista de fontes apropriada no cabeçalho do CSP.
Observe que, como os navegadores não (não podem) verificar se o valor de nonce enviado é alterado entre as solicitações de página, é possível, embora totalmente desaconselhável, pular 1 acima e não fazer com que seu back-end faça algo dinamicamente para o nonce. Nesse caso, você poderia simplesmente colocar um nonce
atributo com um valor estático na fonte HTML do seu documento e enviar um cabeçalho estático do CSP com o mesmo valor nonce.
Mas o motivo pelo qual você não gostaria de usar um nonce estático dessa maneira é derrotar todo o propósito de usá-lo para começar - porque, se você usasse um nonce estático como esse, Nesse ponto, você também pode estar usando unsafe-inline
.