W3C diz que há um novo atributo em HTML5.1 chamado nonce
para style
e script
que 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?
script
estyle
? Algo como proibição de hotlink?Respostas:
O
nonce
atributo permite que você “coloque na lista branca” certos elementosscript
e inlinestyle
, evitando o uso daunsafe-inline
diretiva CSP (o que permitiria todos os inlinescript
/style
), para que você ainda mantenha o recurso principal do CSP de não permitir inlinescript
/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
/ questyle
você queira "colocar na lista de permissões", faça com que seu código de back-end insira umnonce
atributo no documento antes de ser enviado por fio, com esse nonce como valor: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 parascript-src
oustyle-src
:Portanto, o mecanismo de uso de um nonce é uma alternativa para que seu back-end gere um hash do conteúdo do inline
script
oustyle
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
.fonte
nonce
atributo, 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<script type="text/javascript" nonce>
e<style type="text/css" nonce>