“Nenhuma metatag de política de segurança de conteúdo encontrada.” erro no meu aplicativo do phonegap

94

Após atualizar o Cordova 5.0 em meu sistema, crio novos aplicativos. Quando testei meu aplicativo em um dispositivo naquela hora, recebo um erro no log do console:

No Content-Security-Policy meta tag found.
Please add one when using the Cordova-plugin-whitelist plugin.: 23.

Eu adiciono meta na seção principal

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

Mas, novamente, recebi o mesmo erro, no aplicativo que uso o plugin do navegador in-app e 7 de outros links de sites.

Manikandan C
fonte
3
Você instalou corretamente o plug- in cordova-plugin-whitelist- github.com/apache/cordova-plugin-whitelist ? Depois disso, você terá que adicionar <allow-navigation href="http://*/*" />ao seu config.xml
Keval
1
Obrigado Keval, depois de adicionar <allow-navigation href = "http: // * / *" /> agora meu aplicativo funciona bem. Obrigado novamente.
3
Quando um erro pode ser criado quando um caractere está faltando no código, por que o SO não permite edições com menos de seis caracteres? Este é muito fácil de consertar, estava apenas tentando salvar outra pessoa alguns segundos no futuro. Há uma aspa dupla faltando no final do atributo de conteúdo da metatag.
Jason D.

Respostas:

86

Depois de adicionar o cordova-plugin-whitelist , você deve dizer ao seu aplicativo para permitir o acesso a todos os links de páginas da web ou links específicos, se quiser mantê-los específicos.

Você pode simplesmente adicionar isso ao seu config.xml , que pode ser encontrado no diretório raiz do seu aplicativo:

Recomendado na documentação:

<allow-navigation href="http://example.com/*" />

ou:

<allow-navigation href="http://*/*" />

Da documentação do plugin:

Lista de permissão de navegação

Controla para quais URLs o próprio WebView pode ser navegado. Aplica-se apenas a navegações de nível superior.

Curiosidades: no Android, também se aplica a iframes para esquemas não http (s).

Por padrão, são permitidas navegações apenas para URLs file: //. Para permitir outros URLs, você deve adicionar tags ao seu config.xml:

<!-- Allow links to example.com -->
<allow-navigation href="http://example.com/*" />

<!-- Wildcards are allowed for the protocol, as a prefix
     to the host, or as a suffix to the path -->
<allow-navigation href="*://*.example.com/*" />

<!-- A wildcard can be used to whitelist the entire network,
     over HTTP and HTTPS.
     *NOT RECOMMENDED* -->
<allow-navigation href="*" />

<!-- The above is equivalent to these three declarations -->
<allow-navigation href="http://*/*" />
<allow-navigation href="https://*/*" />
<allow-navigation href="data:*" />
Keval
fonte
@AmeePrajapati try stackoverflow.com/questions/37044969/…
Kush Patel
38

Você deve adicionar uma metatag CSP na seção head do seu aplicativo index.html

De acordo com https://github.com/apache/cordova-plugin-whitelist#content-security-policy

Política de Segurança de Conteúdo

Controla quais solicitações de rede (imagens, XHRs, etc) podem ser feitas (via webview diretamente).

No Android e iOS, a lista de permissões de solicitações de rede (veja acima) não é capaz de filtrar todos os tipos de solicitações (por exemplo, <video>& WebSockets não são bloqueados). Portanto, além da lista de permissões, você deve usar uma tag de Política de Segurança de Conteúdo <meta> em todas as suas páginas.

No Android, o suporte para CSP dentro do webview do sistema começa com KitKat (mas está disponível em todas as versões usando Crosswalk WebView).

Aqui estão alguns exemplos de declarações CSP para suas .htmlpáginas:

<!-- Good default declaration:
    * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
    * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
    * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
        * Enable inline JS: add 'unsafe-inline' to default-src
        * Enable eval(): add 'unsafe-eval' to default-src
-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">

<!-- Allow requests to foo.com -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com">

<!-- Enable all requests, inline styles, and eval() -->
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

<!-- Allow XHRs via https only -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https:">

<!-- Allow iframe to https://cordova.apache.org/ -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
tomtastico
fonte
Quando adiciono o CSP Decleration, o seguinte trecho de código para google map falha assim. Qualquer ideia ? var pos = new google.maps.LatLng (position.coords.latitude, position.coords.longitude); // linha 173 11-09 21: 17: 30.724: D / SystemWebChromeClient (25692): file: ///android_asset/www/index.html: Linha 173: Referência não
capturadaError
1
Eu precisava fechar as metatags com /> para serem reconhecidas
metamagikum
23

Existem erros na sua metatag.

Sua:

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

Corrigido:

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

Observe os dois pontos após "script-src" e as aspas duplas finais da metatag.

Kae Verens
fonte
3
quando eu incluo o <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"/>live reload com a estrutura iônica para de funcionar, então tome cuidado com os outros por aí
CommonSenseCode
@codePlusPlus para ativar o Ionic livereload novamente, adicione http://localhost:35729à diretiva script-scr e ws://localhost:35729à diretiva connect-src.
kolli
@kolli, você pode mostrar como seriam as novas diretivas? não está claro como adicioná-los às diretivas.
jessewolfe
Vejo que a informação está na postagem original. Mas, para esclarecer: Observe que, ao "adicionar", isso significa que você pode substituir script-src 'self' 'unsafe-inline' 'unsafe-eval'por script-src 'self' http://localhost:35279 'unsafe-inline' 'unsafe-eval'e adicionar uma nova diretiva com um ponto-e-vírgula de separação no final do atributo de conteúdo:; script-src ws://localhost:35279
jessewolfe
Correção acima ... para a segunda parte, deveria ser ; connect-src 'self' ws://localhost:35279. Observe que eu estava recebendo um erro (não foi possível acessar o arquivo: // <caminho para index.html> devido à violação do CSP) até adicionar 'self'.
jessewolfe
2

Para mim foi suficiente reinstalar o plugin da lista de permissões :

cordova plugin remove cordova-plugin-whitelist

e depois

cordova plugin add cordova-plugin-whitelist

Parece que a atualização de versões anteriores do Cordova não foi bem-sucedida.

Máxima
fonte
1

Para mim, o problema era que eu estava usando versões obsoletas das plataformas cordova android e ios . Portanto, atualizar para [email protected] e [email protected] resolveu o problema.

Você pode atualizar para estas versões específicas:

cordova platforms rm android
cordova platforms add [email protected]
cordova platforms rm ios
cordova platforms add [email protected]
Pierre-Alexis de Solminihac
fonte
você quis dizer android 5.1.1 ?
mix3d
Segui os conselhos de @Maxim e Pierre-Alexis de Solminihac, e finalmente fiz meu App funcionar bem. Obrigado!
Zalakain
0

Existe um outro problema sobre a conexão. Algumas versões do Android podem se conectar, mas outras não. Portanto, há uma outra solução

em AndroidManifest.xml:

<application ... android:usesCleartextTraffic="true">
        ...
    </application>

Basta adicionar 'android: usesCleartextTraffic = "true"'

e problema resolvido finalmente.

Enes Yurtlu
fonte