Como funciona a Política de segurança de conteúdos?
estou a receber um monte de erros na consola de desenvolvimento:
O que se passa? Como funciona a Política de segurança de conteúdos? Como é que eu uso o cabeçalho HTTPrecusou-se a avaliar um texto
recusou-se a executar um programa inline porque viola a seguinte directiva sobre a Política de segurança do Conteúdo
recusou-se a carregar o guião
recusou-se a carregar a 'stylesheet'
Content-Security-Policy
?
Especificamente, como para...
- ...permitir várias fontes?
- ...usar directivas diferentes?
- ...usar várias directivas?
- ...lidar com portas?
- ...lidar com protocolos diferentes?
- ...permitir o protocolo
file://
? - ...usar os estilos, programas e marcas incorporados
<style>
e<script>
? - ...permitir?
e finalmente:
-
O que significa exactamente
'self'
?
2 answers
A meta-marca Content-Security-Policy
permite-lhe reduzir o risco de ataques XSS, permitindo-lhe definir de onde os recursos podem ser carregados, impedindo os navegadores de carregar dados de quaisquer outros locais. Isso torna mais difícil para um atacante injetar código malicioso em seu site.
content="default-src 'self'"
significa isto:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
1. Como permitir múltiplas fontes?
Pode simplesmente listar as suas fontes a seguir a uma directiva como uma lista separada por espaços:
content="default-src 'self' https://example.com/js/"
Note que não há citações. em torno de parâmetros diferentes dos especiais , Como 'self'
. Além disso, não há cólon ([18]} depois da Directiva. Só a Directiva, depois uma lista de parâmetros separados por espaço.
Tudo Abaixo dos parâmetros especificados é implicitamente permitido. Isso significa que no exemplo acima estas seriam fontes válidas:
https://example.com/js/file.js
https://example.com/js/subdir/anotherfile.js
Estes, no entanto, não seriam válidos:
http://example.com/js/file.js
^^^^ wrong protocol
https://example.com/file.js
^^ above the specified path
2. Como usar diferentes diretivas, o que cada uma delas faz?
A as directivas mais comuns são:
-
default-src
a Política por omissão para carregar javascript, imagens, CSS, fontes, pedidos AJAX, etc -
script-src
define fontes válidas para os ficheiros javascript -
style-src
define fontes válidas para os ficheiros CSS -
img-src
define as fontes válidas para as imagens -
connect-src
define objectivos válidos para o XMLHttpRequest (AJAX), WebSockets ou EventSource. Se for feita uma tentativa de ligação a uma máquina que não é permitida aqui, o navegador irá emular um erro400
3. Como usar várias diretivas?
Define todas as suas directivas dentro de uma meta-marca, terminando - as com um ponto e vírgula.(;
):
content="default-src 'self' https://example.com/js/; style-src 'self'"
4. Como lidar com portos?
Tudo menos as portas predefinidas precisa de ser permitido explicitamente adicionando o número do porto ou um asterisco após o permitido domínio:
content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"
O acima resultaria em:
https://ajax.googleapis.com:123
^^^^ Not ok, wrong port
https://ajax.googleapis.com - OK
http://example.com/free/stuff/file.js
^^ Not ok, only the port 123 is allowed
http://example.com:123/free/stuff/file.js - OK
Como mencionei, também pode usar um asterisco para permitir explicitamente todos os portos:
content="default-src example.com:*"
5. Como lidar com diferentes protocolos?
Por omissão, só são permitidos protocolos padrão. Por exemplo, para permitir WebSockets ws://
você terá que permitir explicitamente:
content="default-src 'self'; connect-src ws:; style-src 'self'"
^^^ web sockets are now allowed on all domains and ports
6. Como permitir o protocolo de arquivo file://
?
filesystem
:
content="default-src filesystem"
7. Como usar scripts incorporados e definições de estilo?
A menos que explicitamente permitido, não pode usar definições de estilo em linha, códigos dentro das marcas <script>
ou em Propriedades de marcas como onclick
. Permite - lhes assim:
content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"
Também terá de permitir explicitamente imagens codificadas em linha e base64:
content="img-src data:"
8. Como permitir eval()
?
content="script-src 'unsafe-eval'"
9. O que significa exactamente 'self'
?
Você pode tomar {[17] } para significar localhost, sistema de arquivos local, ou qualquer coisa na mesma máquina. Não significa nada. o. Significa fontes que têm o mesmo esquema (protocolo), o mesmo host, e o mesmo porto que o arquivo em que a Política de conteúdo é definida. A servir o teu site por HTTP? Nada de https para si, a menos que o defina explicitamente.
Eu usei 'self'
na maioria dos exemplos como normalmente faz sentido incluí-lo, mas não é de forma alguma obrigatório. Deixa de fora se não precisares.
Mas espera um minuto!Não posso usar o content="default-src *"
e acabar com isto?
content="default-src * 'unsafe-inline' 'unsafe-eval'"
... mas acredito que não.
Mais leitura:
CABEÇALHOS DO MODACHE2NAME
Você também pode activar o Mod_ headers do Apache2, no Fedora já está activo por omissão, se usar o Ubuntu / Debian active-o assim:
# First enable headers module for Apache2,
# then restart the Apache2 service
a2enmod headers
apache2 -k graceful
No Ubuntu / Debian, poderá configurar os cabeçalhos no ficheiro
/etc/apache2/conf-enabled/security.conf
#
# Setting this header will prevent MSIE from interpreting files as something
# else than declared by the content type in the HTTP headers.
# Requires mod_headers to be enabled.
#
#Header set X-Content-Type-Options: "nosniff"
#
# Setting this header will prevent other sites from embedding pages from this
# site as frames. This defends against clickjacking attacks.
# Requires mod_headers to be enabled.
#
Header always set X-Frame-Options: "sameorigin"
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Permitted-Cross-Domain-Policies "master-only"
Header always set Cache-Control "no-cache, no-store, must-revalidate"
Header always set Pragma "no-cache"
Header always set Expires "-1"
Header always set Content-Security-Policy: "default-src 'none';"
Header always set Content-Security-Policy: "script-src 'self' www.google-analytics.com adserver.example.com www.example.com;"
Header always set Content-Security-Policy: "style-src 'self' www.example.com;"
Nota: Esta é a parte inferior do Ficheiro, apenas as últimas 3 entradas são a configuração do PSC.
O primeiro parâmetro é a directiva, o segundo são as fontes a serem listadas em branco. Eu adicionei o Google analytics e um adserver, o que talvez tenhas feito. Além disso, descobri que se tem pseudónimos, por exemplo, www.example.com e example.com configurado no Apache2, deverá adicioná-los também à lista branca.
O código Inline é considerado nocivo, deve evitá-lo. Copie todos os javascripts e css para separar os arquivos e adicione-os à lista branca.
Já que está nele, pode dar uma vista de olhos nas outras configurações do cabeçalho e instalar o mod_ segurança
Mais leitura:
Https://developers.google.com/web/fundamentals/security/csp/