Recusou-se a carregar o script porque viola a seguinte diretiva da Política de Segurança de Conteúdo

99

Quando tentei implantar meu aplicativo em dispositivos com sistema Android acima de 5.0.0 ( Lollipop ), continuei recebendo este tipo de mensagens de erro:

07-03 18: 39: 21.621: D / SystemWebChromeClient (9132): file: ///android_asset/www/index.html: Linha 0: Recusou-se a carregar o script 'http: // xxxxx' porque viola o seguinte Conteúdo Diretiva de política de segurança: "script-src 'self' 'inseguro-eval' 'inseguro-embutido'". 07-03 18: 39: 21.621: I / chromium (9132): [INFO: CONSOLE (0)] "Recusou-se a carregar o script 'http: // xxx' porque viola a seguinte diretiva da Política de Segurança de Conteúdo:" script- src 'self' 'inseguro-eval' 'inseguro-embutido' ".

No entanto, se eu o implantei em um dispositivo móvel com sistema Android 4.4.x ( KitKat ), a política de segurança funciona com as padrão:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

Então pensei, talvez, devesse mudar para algo assim:

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'; style-src 'self' 'unsafe-inline'; media-src *">

Basicamente, ambas as opções não funcionam para mim. Como posso resolver esse problema?

MangooSaSa
fonte
Muito semelhante ao meu problema. Não consigo recuperar um arquivo JSON "porque ele viola a seguinte diretiva da Política de Segurança de Conteúdo:" connect-src 'self' ""
Michael R
1
@MichaelR Se você deseja recuperar algumas informações JSON da API por meio de JS, como tampermonkey addon ou tudo mais, você pode usar este plugin chrome.google.com/webstore/detail/disable-content-security/… e desabilitar a verificação de CSP enquanto deseja obter alguma coisa. Embora não seja seguro, mas em alguns casos pode funcionar. Estou postando esta resposta aqui porque estava procurando meu erro e este tópico aparece primeiro no Google.
Eryk Wróbel

Respostas:

65

Tente substituir sua meta tag pela seguinte:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' http://* 'unsafe-inline'; script-src 'self' http://* 'unsafe-inline' 'unsafe-eval'" />

Ou, além do que você tem, você deve adicionar http://*a ambos style-srce, script-srccomo visto acima, adicionado após 'self'.

Se o seu servidor estiver incluindo o Content-Security-Policycabeçalho, o cabeçalho substituirá o meta.

Ashikodi
fonte
6
Pelo que entendi o CSP que você define aqui desabilita todo tipo de segurança para evitar ataques, permitindo tags de script e também o carregamento de scripts de qualquer domínio e também sobre conexões não seguras. consulte developers.google.com/web/fundamentals/security/csp Ou entendo s.th. errado? Eu acho que na maioria dos casos (exceto no desenvolvimento e depuração) isso não é o que você quer ... certo?
Peter T.
1
Veja também infosec.mozilla.org/guidelines/…
Peter T.
9
Eu rebaixaria esta resposta, porque você sugere o uso de '' unsafe-inline '' unsafe-eval '', o que você não deveria ao usar o CSP!
HerTesla de
39

A auto-resposta dada por MagngooSasa resolveu , mas para qualquer outra pessoa tentando entender a resposta, aqui estão mais alguns detalhes:

Ao desenvolver aplicativos Cordova com Visual Studio, tentei importar um arquivo JavaScript remoto [localizado aqui http://Guess.What.com/MyScript.js], mas tenho o erro mencionado no título.

Aqui está a meta tag anterior , no arquivo index.html do projeto:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

Aqui está a metatag corrigida , para permitir a importação de um script remoto:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *;**script-src 'self' http://onlineerp.solution.quebec 'unsafe-inline' 'unsafe-eval';** ">

E não há mais erros!

Simon
fonte
14

Foi resolvido com:

script-src 'self' http://xxxx 'unsafe-inline' 'unsafe-eval';
MangooSaSa
fonte
46
você poderia explicar um pouco mais? Você pode colar a meta completa?
Tony
3
@dyoser Aqui está a referência developer.chrome.com/extensions/contentSecurityPolicy#relaxing
igaurav
1
Isso desabilita efetivamente o CSP para scripts, permitindo que qualquer plug-in / xss malicioso injete scripts embutidos e eval, o que anula todo o propósito de ter o CSP habilitado.
IncredibleHat
7

Usamos isto:

<meta http-equiv="Content-Security-Policy" content="default-src gap://ready file://* *; style-src 'self' http://* https://* 'unsafe-inline'; script-src 'self' http://* https://* 'unsafe-inline' 'unsafe-eval'">
simprão
fonte
7

Para quem procura uma explicação completa, recomendo que você dê uma olhada na Política de Segurança de Conteúdo: https://www.html5rocks.com/en/tutorials/security/content-security-policy/ .

"Código de https://mybank.com só deve ter acesso a https://mybank.com dados‘s, e https://evil.example.com deve certamente nunca ser permitido o acesso. Cada origem é mantido isolado do resto da web "

Os ataques XSS são baseados na incapacidade do navegador de distinguir o código do seu aplicativo do código baixado de outro site. Portanto, você deve colocar na lista de permissões as origens do conteúdo que considera seguro para baixar conteúdo, usando o Content-Security-Policycabeçalho HTTP.

Esta política é descrita usando uma série de diretivas de política, cada uma das quais descreve a política para um determinado tipo de recurso ou área de política. Sua política deve incluir uma diretiva de política default-src, que é um fallback para outros tipos de recursos quando eles não têm políticas próprias.

Portanto, se você modificar sua tag para:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *;**script-src 'self' http://onlineerp.solution.quebec 'unsafe-inline' 'unsafe-eval';** ">

Você está dizendo que você está autorizando a execução de código Javacsript ( script-src) desde as origens 'self', http://onlineerp.solution.quebec, 'unsafe-inline', 'unsafe-eval'.

Eu acho que os dois primeiros são perfeitamente válidos para o seu caso de uso, estou um pouco inseguro sobre os outros. 'unsafe-line'e 'unsafe-eval'representam um problema de segurança, então você não deve usá-los, a menos que tenha uma necessidade muito específica deles:

"Se eval e seus irmãos text-to-JavaScript são completamente essenciais para seu aplicativo, você pode habilitá-los adicionando 'eval inseguro' como uma fonte permitida em uma diretiva script-src. Mas, novamente, não faça isso. Banindo a capacidade de executar strings torna muito mais difícil para um invasor executar código não autorizado em seu site. " (Mike West, Google)

Rocío García Luque
fonte
Por que na minha página localhost posso anexar outro script de host?
mqliutie
Não é incomum reutilizar scripts de terceiros que não estão hospedados em seu servidor, mas nos quais você "confia"
Rocío García Luque
6

String de permissão completa

As respostas anteriores não resolveram meu problema, porque não incluem blob: data: gap:palavras-chave ao mesmo tempo; então aqui está uma string que faz:

<meta http-equiv="Content-Security-Policy" content="default-src * self blob: data: gap:; style-src * self 'unsafe-inline' blob: data: gap:; script-src * 'self' 'unsafe-eval' 'unsafe-inline' blob: data: gap:; object-src * 'self' blob: data: gap:; img-src * self 'unsafe-inline' blob: data: gap:; connect-src self * 'unsafe-inline' blob: data: gap:; frame-src * self blob: data: gap:;">

Aviso: Isso expõe o documento a muitos exploits. Certifique-se de evitar que os usuários executem códigos no console ou estejam em um ambiente fechado como um aplicativo Cordova .

Alexandre Daubricourt
fonte
1
Esta é a resposta correta se você está tentando carregar, por exemplo, JQuery no console desta forma: stackoverflow.com/a/31912495/137948
Will Sheppard
4

Para elaborar um pouco mais sobre isso, adicionando

script-src 'self' http://somedomain 'unsafe-inline' 'unsafe-eval';

para a meta tag assim,

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; script-src 'self' https://somedomain.com/ 'unsafe-inline' 'unsafe-eval';  media-src *">

corrige o erro.

James Nicholson
fonte
2

Adicionar a metatag para ignorar esta política não estava nos ajudando, porque nosso servidor da web estava injetando o Content-Security-Policycabeçalho na resposta.

Em nosso caso, estamos usando o Ngnix como o servidor da web para um aplicativo Tomcat 9 baseado em Java. Do servidor da web, está direcionando o navegador para não permitir inline scripts, portanto, para um teste temporário, desativamos Content-Security-Policycomentando.

Como desligar no ngnix

  • Por padrão, o arquivo ngnix ssl.conf incluirá um cabeçalho na resposta:

    #> grep 'Content-Security' -ir /etc/nginx/global/ssl.conf add_header Content-Security-Policy "default-src 'none'; frame-ancestors 'none'; script-src 'self'; img-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self';";

  • Se você apenas comentar esta linha e reiniciar o ngnix, ele não deverá adicionar o cabeçalho à resposta.

Se você está preocupado com a segurança ou com a produção, não siga isso, use essas etapas apenas para fins de teste e siga em frente.

prem
fonte
-1

A provável razão pela qual você obteve este erro é provavelmente porque você adicionou a pasta / build ao seu arquivo .gitignore ou geralmente não fez o check-in no Git.

Então, quando você envia o Git para o Heroku master, a pasta de construção que você está referenciando não é enviada para o Heroku. E é por isso que mostra esse erro.

Essa é a razão pela qual ele funciona adequadamente localmente, mas não quando você implantou no Heroku.

Sachin
fonte
Eu tenho o mesmo problema. então você está sugerindo remover / construir a pasta do .gitignore?
Hoang Minh