Se negó a cargar el script porque viola la siguiente directiva de Política de seguridad de contenido

108

Cuando intenté implementar mi aplicación en dispositivos con sistema Android por encima de 5.0.0 ( Lollipop ), seguí recibiendo este tipo de mensajes de error:

07-03 18: 39: 21.621: D / SystemWebChromeClient (9132): file: ///android_asset/www/index.html: Línea 0: Se negó a cargar el script 'http: // xxxxx' porque viola el siguiente contenido Directiva de política de seguridad: "script-src 'self' 'unsafe-eval' 'unsafe-inline'". 07-03 18: 39: 21.621: I / chromium (9132): [INFO: CONSOLE (0)] "Se negó a cargar el script 'http: // xxx' porque viola la siguiente directiva de política de seguridad de contenido:" script- src 'self' 'unsafe-eval' 'unsafe-inline' ".

Sin embargo, si lo implementé en un dispositivo móvil con sistema Android de 4.4.x ( KitKat ), la política de seguridad funciona con las predeterminadas:

<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 *">

Entonces pensé, tal vez, debería cambiar a algo como esto:

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

Básicamente, ambas opciones no funcionan para mí. ¿Cómo puedo solucionar este problema?

MangooSaSa
fuente
Muy similar a mi problema. No puedo recuperar un archivo JSON "porque infringe la siguiente directiva de política de seguridad de contenido:" connect-src 'self' ""
Michael R
1
@MichaelR Si desea recuperar información JSON de la API a través de JS como el complemento tampermonkey o todo lo demás, puede usar este complemento chrome.google.com/webstore/detail/disable-content-security/… y deshabilitar la verificación CSP mientras desea obtener alguna cosa. Aunque no es seguro, en algunos casos podría funcionar. Estoy publicando esta respuesta aquí porque estaba buscando mi error y este tema se muestra primero en Google.
Eryk Wróbel

Respuestas:

69

Intente reemplazar su metaetiqueta con esto a continuación:

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

O además de lo que tiene, debe agregar http://*a ambos style-srcy, script-srccomo se ve arriba, agregar después de 'self'.

Si su servidor incluye el Content-Security-Policyencabezado, el encabezado anulará el meta.

Ashikodi
fuente
6
Según tengo entendido, el CSP que define aquí deshabilita todo tipo de seguridad para evitar ataques, permitiendo etiquetas de scripts y también cargando scripts desde cualquier dominio y también a través de conexiones no seguras. ver developers.google.com/web/fundamentals/security/csp ¿ O obtengo algo? ¿incorrecto? Supongo que en la mayoría de los casos (excepto en el desarrollo y la depuración) esto no es lo que quieres ... ¿verdad?
Peter T.
1
También vea infosec.mozilla.org/guidelines/…
Peter T.
11
Yo rechazaría esta respuesta, porque sugieres usar '' inseguro-en línea '' inseguro-eval '', ¡que no deberías hacer cuando uses CSP!
HerTesla
40

La auto respuesta dada por MagngooSasa funcionó, pero para cualquier otra persona que intente entender la respuesta, aquí hay algunos detalles más:

Al desarrollar aplicaciones de Cordova con Visual Studio, traté de importar un archivo JavaScript remoto [ubicado aquí http://Guess.What.com/MyScript.js], pero tengo el error mencionado en el título.

Esta es la meta etiqueta antes , en el archivo index.html del proyecto:

<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 *">

Aquí está la metaetiqueta corregida , para permitir la importación de un 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';** ">

¡Y no más error!

Simón
fuente
15

Se resolvió con:

script-src 'self' http://xxxx 'unsafe-inline' 'unsafe-eval';
MangooSaSa
fuente
47
¿Podría explicarlo un poco más? ¿Puedes pegar el meta completo?
Tony
4
@dyoser Aquí está la referencia developer.chrome.com/extensions/contentSecurityPolicy#relaxing
igaurav
3
Esto deshabilita efectivamente CSP para scripts al permitir que cualquier complemento / xss malintencionado inyecte scripts en línea y de evaluación, lo que anula el propósito de tener CSP habilitado.
IncredibleHat
8

Para cualquiera que busque una explicación completa, le recomiendo que eche un vistazo a la Política de seguridad de contenido: https://www.html5rocks.com/en/tutorials/security/content-security-policy/ .

"El código de https://mybank.com solo debe tener acceso a los datos de https://mybank.com , y nunca se debe permitir el acceso a https://evil.example.com . Cada origen se mantiene aislado del resto de la web "

Los ataques XSS se basan en la incapacidad del navegador para distinguir el código de su aplicación del código descargado de otro sitio web. Por lo tanto, debe incluir en la lista blanca los orígenes del contenido desde el que considera seguro descargar contenido, utilizando el Content-Security-Policyencabezado HTTP.

Esta política se describe mediante una serie de directivas de política, cada una de las cuales describe la política para un determinado tipo de recurso o área de política. Su política debe incluir una directiva de política default-src, que es una alternativa para otros tipos de recursos cuando no tienen políticas propias.

Entonces, si modifica su etiqueta a:

<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';** ">

Usted está diciendo que usted está autorizando la ejecución de código Javacsript ( script-src) desde los orígenes 'self', http://onlineerp.solution.quebec, 'unsafe-inline', 'unsafe-eval'.

Supongo que los dos primeros son perfectamente válidos para su caso de uso, no estoy seguro de los otros. 'unsafe-line'y 'unsafe-eval'plantean un problema de seguridad, por lo que no debe usarlos a menos que tenga una necesidad muy específica de ellos:

"Si eval y sus hermanos de texto a JavaScript son completamente esenciales para su aplicación, puede habilitarlos agregando 'unsafe-eval' como fuente permitida en una directiva script-src. Pero, nuevamente, no lo haga. la capacidad de ejecutar cadenas hace que sea mucho más difícil para un atacante ejecutar código no autorizado en su sitio ". (Mike West, Google)

Rocío García Luque
fuente
¿Por qué en mi página de host local puedo agregar otro script de host?
mqliutie
No es raro reutilizar scripts de terceros que no están alojados en tu servidor pero en los que "confías"
Rocío García Luque
8

Cadena de permisos completa

Las respuestas anteriores no solucionaron mi problema, porque no incluyen blob: data: gap:palabras clave al mismo tiempo; así que aquí hay una cadena que hace:

<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:;">

Advertencia: esto expone el documento a muchas vulnerabilidades. Asegúrese de evitar que los usuarios ejecuten código en la consola o de estar en un entorno cerrado como una aplicación Cordova .

Alexandre Daubricourt
fuente
1
Esta es la respuesta correcta si está intentando cargar, por ejemplo, JQuery en la consola de esta manera: stackoverflow.com/a/31912495/137948
Will Sheppard
7

Usamos esto:

<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
fuente
4

Para desarrollar un poco más sobre esto, agregue

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

a la metaetiqueta así,

<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 el error.

James Nicholson
fuente
2

Agregar la metaetiqueta para ignorar esta política no nos ayudó, porque nuestro servidor web estaba inyectando el Content-Security-Policyencabezado en la respuesta.

En nuestro caso, estamos usando Ngnix como servidor web para una aplicación Tomcat 9 basada en Java. Desde el servidor web, está dirigiendo el navegador para que no lo permita inline scripts, por lo que para una prueba temporal lo hemos desactivado Content-Security-Policycomentando.

Cómo apagarlo en ngnix

  • De forma predeterminada, el archivo ngnix ssl.conf tendrá esto agregando un encabezado a la respuesta:

    #> 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';";

  • Si solo comenta esta línea y reinicia ngnix, no debería agregar el encabezado a la respuesta.

Si está preocupado por la seguridad o en producción, no siga esto, use estos pasos solo para fines de prueba y continúe.

prem
fuente
-1

La razón probable por la que recibe este error es probable que haya agregado el / build carpeta a su archivo .gitignore o, en general, no la haya registrado en Git.

Entonces, cuando empujas a Heroku maestro de , la carpeta de compilación a la que hace referencia no se envía a Heroku. Y es por eso que muestra este error.

Esa es la razón por la que funciona correctamente a nivel local, pero no cuando lo implementó en Heroku.

Sachin
fuente
Tengo el mismo problema. entonces, ¿está sugiriendo eliminar la carpeta / build de .gitignore?
Hoang Minh