Estou recebendo vários erros no console do desenvolvedor:
Recusou-se a avaliar uma sequência
Recusou-se a executar o script embutido porque viola a seguinte diretiva de política de segurança de conteúdo
Recusou carregar o script
Recusou-se a carregar a folha de estilo
O que é isso tudo? Como a Política de Segurança de Conteúdo funciona? Como uso o Content-Security-Policy
cabeçalho HTTP?
Especificamente, como ...
- ... permite múltiplas fontes?
- ... usar diretivas diferentes?
- ... usar várias diretivas?
- ... lidar com portas?
- ... lidar com protocolos diferentes?
- ... permitir
file://
protocolo? - ... usar estilos, scripts e tags embutidos
<style>
e<script>
? - ... permitir
eval()
?
E finalmente:
- O que exatamente
'self'
significa?
Respostas:
A
Content-Security-Policy
metatag permite reduzir o risco de ataques XSS , permitindo definir de onde os recursos podem ser carregados, impedindo que os navegadores carreguem dados de qualquer outro local. Isso torna mais difícil para um invasor injetar código malicioso no seu site.Bati minha cabeça contra uma parede de tijolos tentando descobrir por que estava recebendo erros de CSP, um após o outro, e não parecia haver nenhuma instrução clara e concisa sobre como isso funciona. Então, aqui está minha tentativa de explicar brevemente alguns pontos do CSP, concentrando-me principalmente nas coisas que achei difíceis de resolver.
Por uma questão de brevidade, não escreverei a tag completa em cada amostra. Em vez disso, mostrarei apenas a
content
propriedade, portanto, uma amostra que dizcontent="default-src 'self'"
significa isso:1. Como permitir várias fontes?
Você pode simplesmente listar suas fontes após uma diretiva como uma lista separada por espaço:
Observe que não há aspas em torno de outros parâmetros além dos especiais , como
'self'
. Além disso, não há dois pontos (:
) após a diretiva. Apenas a diretiva e, em seguida, uma lista de parâmetros separados por espaço.Tudo abaixo dos parâmetros especificados é implicitamente permitido. Isso significa que no exemplo acima, essas fontes seriam válidas:
Estes, no entanto, não seriam válidos:
2. Como usar diretivas diferentes, o que cada uma delas faz?
As diretivas mais comuns são:
default-src
a política padrão para carregar javascript, imagens, CSS, fontes, solicitações AJAX, etc.script-src
define fontes válidas para arquivos javascriptstyle-src
define fontes válidas para arquivos cssimg-src
define fontes válidas para imagensconnect-src
define destinos válidos para XMLHttpRequest (AJAX), WebSockets ou EventSource. Se for feita uma tentativa de conexão com um host que não é permitido aqui, o navegador emulará um400
erroExistem outros, mas esses são os de que você provavelmente precisará.
3. Como usar várias diretivas?
Você define todas as suas diretivas dentro de uma metatag encerrando-as com ponto-e-vírgula (
;
):4. Como lidar com portas?
Tudo, exceto as portas padrão, precisa ser permitido explicitamente, adicionando o número da porta ou um asterisco após o domínio permitido:
O acima resultaria em:
Como mencionei, você também pode usar um asterisco para permitir explicitamente todas as portas:
5. Como lidar com diferentes protocolos?
Por padrão, apenas protocolos padrão são permitidos. Por exemplo, para permitir WebSockets,
ws://
você terá que permitir explicitamente:6. Como permitir o protocolo de arquivo
file://
?Se você tentar defini-lo como tal, não funcionará. Em vez disso, você o permitirá com o
filesystem
parâmetro:7. Como usar scripts embutidos e definições de estilo?
A menos que seja explicitamente permitido, você não pode usar definições de estilo embutido, codificar dentro de
<script>
tags ou em propriedades de tags comoonclick
. Você os permite assim:Você também precisará permitir explicitamente imagens codificadas em linha de base64:
8. Como permitir
eval()
?Tenho certeza de que muitas pessoas diriam que não, pois 'eval é mau' e a causa mais provável para o fim iminente do mundo. Essas pessoas estariam erradas. Certamente, você pode definitivamente fazer grandes furos na segurança do seu site com avaliação, mas possui casos de uso perfeitamente válidos. Você só precisa ser esperto ao usá-lo. Você permite assim:
9. O que exatamente
'self'
significa?Você pode
'self'
significar host local, sistema de arquivos local ou qualquer coisa no mesmo host. Isso não significa nada disso. Significa fontes que possuem o mesmo esquema (protocolo), mesmo host e mesma porta que o arquivo em que a política de conteúdo está definida. Servindo seu site por HTTP? Não há https para você, a menos que você o defina explicitamente.Eu usei
'self'
na maioria dos exemplos, pois geralmente faz sentido incluí-lo, mas não é de forma alguma obrigatório. Deixe de fora se não precisar.Mas espere um minuto! Não posso simplesmente usar
content="default-src *"
e acabar com isso?Não. Além das óbvias vulnerabilidades de segurança, isso também não funcionará como você esperaria. Embora alguns documentos afirmem que isso permite algo, isso não é verdade. Ele não permite inline ou avaliações; portanto, para realmente tornar seu site ainda mais vulnerável, você usaria o seguinte:
... mas eu confio que você não vai.
Leitura adicional:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy
fonte
default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;
content="default-src * 'unsafe-inline' 'unsafe-eval'"
é necessário fazer com que alguns aplicativos Angular funcionem.connect-src
e caminhos: as barras finais são obrigatórias se você deseja incluir um subcaminho inteiro. Por exemplo: o arquivohttp://foo.com/files/bar.txt
será bloqueado se a fonte éhttp://foo.com/files
, mas servido quando éhttp://foo.com/files/
APACHE2 MOD_HEADERS
Você também pode ativar o Apache2 mod_headers, no Fedora já está ativado por padrão, se você usar o Ubuntu / Debian, habilite-o assim:
No Ubuntu / Debian, você pode configurar os cabeçalhos no arquivo
/etc/apache2/conf-enabled/security.conf
Nota: Esta é a parte inferior do arquivo, apenas as três últimas entradas são configurações de CSP.
O primeiro parâmetro é a diretiva, o segundo são as fontes a serem listadas em branco. Adicionei o Google Analytics e um servidor de anúncios, que você pode ter. Além disso, descobri que, se você tiver aliases, por exemplo, www.example.com e example.com configurados no Apache2, deverá adicioná-los também à lista branca.
O código embutido é considerado prejudicial, você deve evitá-lo. Copie todos os javascripts e css para separar arquivos e adicione-os à lista branca.
Enquanto você está nisso, você pode dar uma olhada nas outras configurações de cabeçalho e instalar mod_security
Leitura adicional:
https://developers.google.com/web/fundamentals/security/csp/
https://www.w3.org/TR/CSP/
fonte
Não se esqueça do font-src, ele funciona da mesma forma que qualquer outro, mas se você usar fontes carregadas de outras origens - adicione-as à metatag
fonte