Odmówił załadowania skryptu, ponieważ narusza on następującą dyrektywę Content Security Policy

107

Kiedy próbowałem wdrożyć moją aplikację na urządzeniach z systemem Android powyżej 5.0.0 ( Lollipop ), otrzymywałem następujące komunikaty o błędach:

07-03 18: 39: 21.621: D / SystemWebChromeClient (9132): file: ///android_asset/www/index.html: Line 0: odmówiono załadowania skryptu „http: // xxxxx”, ponieważ narusza on następującą treść Dyrektywa zasad bezpieczeństwa: "script-src 'self' 'unsafe-eval' 'unsafe-inline'". 07-03 18: 39: 21.621: I / chromium (9132): [INFO: CONSOLE (0)] „Odmówiono załadowania skryptu„ http: // xxx ”, ponieważ narusza on następującą dyrektywę polityki bezpieczeństwa treści:„ script- src 'self' 'unsafe-eval' 'unsafe-inline' ".

Jeśli jednak wdrożyłem go na urządzenie mobilne z systemem Android 4.4.x ( KitKat ), polityka bezpieczeństwa działa z domyślnymi:

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

Wtedy pomyślałem, że może powinienem zmienić na coś takiego:

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

Zasadniczo obie opcje nie działają dla mnie. Jak mogę rozwiązać ten problem?

MangooSaSa
źródło
Bardzo podobny do mojego problemu. Nie mogę pobrać pliku JSON ”, ponieważ narusza on następującą dyrektywę zasad bezpieczeństwa treści:„ connect-src 'self' ””
Michael R
1
@MichaelR Jeśli chcesz pobrać niektóre informacje JSON z API przez JS, jak dodatek tampermonkey lub wszystko inne, możesz użyć tej wtyczki chrome.google.com/webstore/detail/disable-content-security/ ... i wyłączyć sprawdzanie CSP, gdy chcesz uzyskać coś. Chociaż nie jest to bezpieczne, ale w niektórych przypadkach może działać. Piszę tutaj tę odpowiedź, ponieważ szukałem swojego błędu i ten temat pojawia się jako pierwszy w Google.
Eryk Wróbel

Odpowiedzi:

68

Spróbuj zamienić swój metatag na poniższy:

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

Lub oprócz tego, co masz, powinieneś dodać http://*do obu style-srciscript-src jak widać powyżej, dodać po „siebie”.

Jeśli twój serwer zawiera Content-Security-Policynagłówek, nagłówek zastąpi meta.

Ashikodi
źródło
6
Jak rozumiem, zdefiniowany tutaj CSP wyłącza wszelkiego rodzaju zabezpieczenia, aby uniknąć ataków, zezwalając na tagi skryptów, a także ładowanie skryptów z dowolnej domeny, a także przez niezabezpieczone połączenia. zobacz developers.google.com/web/fundamentals/security/csp Czy dostanę s.th. źle? Domyślam się, że w większości przypadków (poza programowaniem i debugowaniem) nie tego chcesz ... prawda?
Peter T.
1
Zobacz także infosec.mozilla.org/guidelines/…
Peter T.
11
Odrzuciłbym tę odpowiedź, ponieważ sugerujesz użycie `` unsafe-inline '' unsafe-eval '', którego nie powinieneś używać podczas korzystania z CSP!
HerTesla
39

Samo odpowiedź udzielona przez MagngooSasa załatwiła sprawę , ale dla każdego, kto próbuje zrozumieć odpowiedź, oto kilka dodatkowych szczegółów:

Przy opracowywaniu Cordova aplikacje z Visual Studio, próbowałem zaimportować plik JavaScript zdalnego znajdujący się tutaj http://Guess.What.com/MyScript.js [], ale mam błąd wymieniony w tytule.

Oto meta tag przed , w pliku index.html projektu:

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

Oto poprawiony metatag, aby umożliwić importowanie zdalnego skryptu:

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

I koniec z błędami!

Szymon
źródło
15

Zostało rozwiązane za pomocą:

script-src 'self' http://xxxx 'unsafe-inline' 'unsafe-eval';
MangooSaSa
źródło
46
czy mógłbyś to trochę bardziej wyjaśnić? Czy możesz wkleić pełną meta?
Tony
4
@dyoser Tutaj jest odniesienie developer.chrome.com/extensions/contentSecurityPolicy#relaxing
igaurav
3
To skutecznie wyłącza CSP dla skryptów, pozwalając złośliwym wtyczkom / xss na wstrzykiwanie skryptów inline i eval, co podważa cel posiadania CSP w ogóle.
IncredibleHat
8

Każdy, kto szuka pełnego wyjaśnienia, polecam zapoznać się z Polityką bezpieczeństwa treści: https://www.html5rocks.com/en/tutorials/security/content-security-policy/ .

„Kod z https://mybank.com powinien mieć dostęp tylko do danych https://mybank.com , a https://evil.example.com z pewnością nigdy nie powinien mieć dostępu. Każde źródło jest odizolowane od reszta sieci ”

Ataki XSS polegają na tym, że przeglądarka nie jest w stanie odróżnić kodu aplikacji od kodu pobranego z innej witryny. Musisz więc umieścić na białej liście źródła treści, z których możesz bezpiecznie pobierać zawartość, używając Content-Security-Policynagłówka HTTP.

Ta zasada jest opisana przy użyciu serii dyrektyw, z których każda opisuje zasady dla określonego typu zasobów lub obszaru polityki. Twoje zasady powinny zawierać dyrektywę zasad default-src, która jest rezerwą dla innych typów zasobów, gdy nie mają one własnych zasad.

Jeśli więc zmodyfikujesz swój tag, aby:

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

Mówisz, że jesteś zezwalająca na wykonywanie kodu Javacsript ( script-src) od początków 'self', http://onlineerp.solution.quebec, 'unsafe-inline', 'unsafe-eval'.

Wydaje mi się, że pierwsze dwa są perfekcyjnie poprawne w twoim przypadku użycia, nie jestem pewien co do pozostałych. 'unsafe-line'i 'unsafe-eval'stanowią problem z bezpieczeństwem, więc nie powinieneś ich używać, chyba że masz ich bardzo konkretną potrzebę:

„Jeśli eval i jego odpowiedniki przekształcające tekst na JavaScript są całkowicie niezbędne dla Twojej aplikacji, możesz je włączyć, dodając„ unsafe-eval ”jako dozwolone źródło w dyrektywie script-src. Ale znowu, nie rób tego. Banowanie możliwość wykonywania ciągów znaków znacznie utrudnia osobie atakującej wykonanie nieautoryzowanego kodu w Twojej witrynie ”. (Mike West, Google)

Rocío García Luque
źródło
Dlaczego na mojej stronie hosta lokalnego mogę dołączyć inny skrypt hosta?
mqliutie
Nierzadko używa się ponownie skryptów innych firm, które nie są hostowane na Twoim serwerze, ale którym „ufasz”
Rocío García Luque
8

Ciąg pełnego pozwolenia

Poprzednie odpowiedzi nie rozwiązały mojego problemu, ponieważ nie zawierają jednocześnie blob: data: gap:słów kluczowych; więc oto ciąg, który robi:

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

Ostrzeżenie: naraża to dokument na wiele exploitów. Pamiętaj, aby uniemożliwić użytkownikom wykonywanie kodu w konsoli lub przebywanie w zamkniętym środowisku, takim jak aplikacja Cordova .

Alexandre Daubricourt
źródło
1
To jest poprawna odpowiedź, jeśli próbujesz załadować np. JQuery w konsoli w ten sposób: stackoverflow.com/a/31912495/137948
Will Sheppard
7

Użyliśmy tego:

<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
źródło
4

Aby rozwinąć trochę więcej, dodając

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

do metatagu w ten sposób,

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

naprawia błąd.

James Nicholson
źródło
2

Dodanie metatagu w celu zignorowania tej zasady nie pomogło nam, ponieważ nasz serwer sieciowy wstawił Content-Security-Policynagłówek w odpowiedzi.

W naszym przypadku używamy Ngnix jako serwera WWW dla aplikacji Tomcat 9 opartej na Javie. Z serwera WWW nakazuje przeglądarce, aby nie zezwalała inline scripts, więc na czasowe testy wyłączyliśmy Content-Security-Policy, komentując.

Jak to wyłączyć w ngnix

  • Domyślnie plik ngnix ssl.conf będzie zawierał następujące dodanie nagłówka do odpowiedzi:

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

  • Jeśli po prostu skomentujesz tę linię i zrestartujesz ngnix, nie powinno to dodawać nagłówka do odpowiedzi.

Jeśli martwisz się bezpieczeństwem lub produkcją, nie wykonuj tego, używaj tych kroków tylko w celu testowania i przechodzenia dalej.

prem
źródło
-1

Prawdopodobnym powodem wystąpienia tego błędu jest prawdopodobnie dodanie / build folderu do pliku .gitignore lub generalnie nie sprawdzenie go w Git.

Więc kiedy Git push Master Heroku , folder kompilacji, do którego się odnosisz , nie zostanie wypchnięty do Heroku. I dlatego pokazuje ten błąd.

To jest powód, dla którego działa poprawnie lokalnie, ale nie podczas wdrażania w Heroku.

Sachin
źródło
Mam ten sam problem. więc czy sugerujesz usunięcie / zbudowanie folderu z .gitignore?
Hoang Minh