Qual é o objetivo do atributo HTML "nonce" para elementos de script e estilo?

141

W3C diz que há um novo atributo em HTML5.1 chamado noncepara stylee scriptque pode ser usado pelo conteúdo Política de Segurança de um site.

Pesquisei no Google, mas finalmente não entendi o que esse atributo realmente faz e o que muda ao usá-lo?

ata
fonte
2
Parece que é apenas um pouco mais de segurança para o seu site, você o adiciona a um link ou formulário e, quando a página é veiculada, se o nonce não corresponder ao seu, você não veicula a página
Pete
@ Peter Você quer dizer que ninguém poderia carregar o seu scripte style? Algo como proibição de hotlink?
ata
é também para páginas normais e validação de formulário
Pete

Respostas:

196

O nonceatributo permite que você “coloque na lista branca” certos elementos scripte inline style, evitando o uso da unsafe-inlinediretiva 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/ styleem geral.

Portanto, o nonceatributo é 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 nonceatributo, que corresponde às seguintes etapas:

  1. 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.

  2. Pegue o nonce gerado na etapa 1 e, para qualquer inline script/ que stylevocê queira "colocar na lista de permissões", faça com que seu código de back-end insira um nonceatributo no documento antes de ser enviado por fio, com esse nonce como valor:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. 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-srcou 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 scriptou stylevocê 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 nonceatributo 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.

sideshowbarker
fonte
17
Não é para verificar o usuário - é para verificar se o conteúdo embutido de um script ou elemento de estilo específico não foi injetado no documento por algum terceiro (malicioso) de terceiros, mas foi inserido intencionalmente no documento por quem controla o servidor do documento é servido a partir de. (Atualizarei minha resposta para dizer isso.) #
Sideshowbarker
3
Os nonces não precisam ser armazenados - eles são gerados na memória e inseridos no cabeçalho do CSP e no documento HTML enviado por fio nas respostas (não na fonte armazenada no sistema de arquivos / banco de dados do servidor).
sideshowbarker
3
Quanto a qualquer razão para se esforçar ao usar o nonceatributo, se você não precisar absolutamente usá-lo, não precisará. Ele realmente é destinado apenas a casos em que, por algum motivo, você ainda não pode se livrar de algum script embutido ou conteúdo de estilo de um documento específico (mas deve removê-lo mais tarde). Portanto, se por algum motivo você precisar manter o script embutido e o conteúdo do estilo, nesse meio tempo, você poderá pelo menos usar o mecanismo nonce para permitir que os navegadores verifiquem se estão OK. Caso contrário, você deve apenas utilizar plenamente CSP como realmente pretendido, e não permitir que qualquer script ou de estilo elementos inline
sideshowbarker
2
@sideshowbarker, O que faz um nonce vazio? Estou vendo páginas com <script type="text/javascript" nonce>e<style type="text/css" nonce>
Pacerier
7
Nota: Se o seu script for estático, recomendo um hash CSP, em vez de um nonce.
27718 Brian