Menolak untuk memuat skrip karena melanggar petunjuk Kebijakan Keamanan Konten berikut

107

Ketika saya mencoba menerapkan aplikasi saya ke perangkat dengan sistem Android di atas 5.0.0 ( Lollipop ), saya terus mendapatkan pesan kesalahan semacam ini:

07-03 18: 39: 21.621: D / SystemWebChromeClient (9132): file: ///android_asset/www/index.html: Line 0: Menolak memuat skrip 'http: // xxxxx' karena melanggar Konten berikut Petunjuk Kebijakan Keamanan: "script-src 'self' 'unsafe-eval' 'unsafe-inline'". 07-03 18: 39: 21.621: I / chromium (9132): [INFO: CONSOLE (0)] "Menolak untuk memuat skrip 'http: // xxx' karena melanggar petunjuk Kebijakan Keamanan Konten berikut:" script- src 'self' 'unsafe-eval' 'unsafe-inline' ".

Namun, jika saya menerapkannya ke perangkat seluler dengan sistem Android 4.4.x ( KitKat ), kebijakan keamanan berfungsi dengan yang default:

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

Kemudian saya berpikir, mungkin, saya harus berubah menjadi seperti ini:

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

Pada dasarnya, kedua opsi tersebut tidak berfungsi untuk saya. Bagaimana saya bisa mengatasi masalah ini?

MangooSaSa
sumber
Sangat mirip dengan masalah saya. Saya tidak dapat mengambil file JSON, "karena file tersebut melanggar petunjuk Kebijakan Keamanan Konten berikut:" connect-src 'self' ""
Michael R
1
@MichaelR Jika Anda ingin mengambil beberapa informasi JSON dari API melalui JS seperti addon tampermonkey atau yang lainnya Anda dapat menggunakan plugin ini chrome.google.com/webstore/detail/disable-content-security/… dan menonaktifkan pemeriksaan CSP saat Anda ingin mendapatkan sesuatu. Ini sama sekali tidak aman tetapi dalam beberapa kasus mungkin berhasil. Saya memposting jawaban ini di sini karena saya sedang mencari kesalahan saya dan topik ini muncul pertama kali di Google.
Eryk Wróbel

Jawaban:

68

Coba ganti tag meta Anda dengan ini di bawah ini:

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

Atau sebagai tambahan atas apa yang Anda miliki, Anda harus menambahkan http://*keduanya style-srcdan script-srcseperti yang terlihat di atas ditambahkan setelah 'diri'.

Jika server Anda menyertakan Content-Security-Policytajuk, tajuk tersebut akan menggantikan meta.

Ashikodi
sumber
6
Seperti yang saya pahami, CSP yang Anda tentukan di sini menonaktifkan semua jenis keamanan untuk menghindari serangan, mengizinkan tag skrip dan juga memuat skrip dari domain mana pun dan juga melalui koneksi yang tidak aman. lihat developers.google.com/web/fundamentals/security/csp Atau apakah saya mendapatkan s.th. salah? Saya akan menebak bahwa dalam banyak kasus (kecuali dari pengembangan dan debugging) ini bukan yang Anda inginkan ... bukan?
Peter T.
1
Juga lihat infosec.mozilla.org/guidelines/…
Peter T.
11
Saya akan meremehkan jawaban ini, karena Anda menyarankan untuk menggunakan '' unsafe-inline '' unsafe-eval '', yang seharusnya tidak Anda gunakan saat menggunakan CSP!
HerTesla
39

The jawaban diri yang diberikan oleh MagngooSasa melakukan trik, tapi untuk orang lain mencoba memahami jawabannya, berikut adalah beberapa sedikit lebih detail:

Saat mengembangkan aplikasi Cordova dengan Visual Studio, saya mencoba mengimpor file JavaScript jarak jauh [terletak di sini http://Guess.What.com/MyScript.js], tetapi saya memiliki kesalahan yang disebutkan di judul.

Berikut ini meta tag sebelumnya , di file index.html proyek:

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

Berikut adalah tag meta yang dikoreksi , untuk mengizinkan impor skrip jarak jauh:

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

Dan tidak ada lagi kesalahan!

Simon
sumber
15

Itu diselesaikan dengan:

script-src 'self' http://xxxx 'unsafe-inline' 'unsafe-eval';
MangooSaSa
sumber
47
bisakah Anda menjelaskannya sedikit lagi? Bisakah Anda menempelkan meta lengkap?
Tony
4
@dyoser Berikut adalah referensi developer.chrome.com/extensions/contentSecurityPolicy#relaxing
igaurav
3
Ini secara efektif menonaktifkan CSP untuk skrip dengan mengizinkan plugin / xss berbahaya untuk memasukkan skrip inline dan eval, yang mengalahkan seluruh tujuan mengaktifkan CSP sama sekali.
IncredibleHat
8

Bagi siapa pun yang mencari penjelasan lengkap, saya sarankan Anda untuk melihat Kebijakan Keamanan Konten: https://www.html5rocks.com/en/tutorials/security/content-security-policy/ .

"Kode dari https://mybank.com hanya harus memiliki akses ke https://mybank.com data yang‘s, dan https://evil.example.com harus pasti tidak pernah diizinkan akses. Setiap asal terus terisolasi dari sisa web "

Serangan XSS didasarkan pada ketidakmampuan browser untuk membedakan kode aplikasi Anda dari kode yang diunduh dari situs web lain. Jadi, Anda harus memasukkan ke dalam daftar putih asal konten yang Anda anggap aman untuk mendownload konten, menggunakan Content-Security-Policyheader HTTP.

Kebijakan ini dijelaskan menggunakan serangkaian arahan kebijakan, yang masing-masing menjelaskan kebijakan untuk jenis sumber daya atau area kebijakan tertentu. Kebijakan Anda harus menyertakan arahan kebijakan default-src, yang merupakan cadangan untuk jenis sumber daya lain jika tidak memiliki kebijakan sendiri.

Jadi, jika Anda memodifikasi tag Anda menjadi:

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

Anda mengatakan bahwa Anda otorisasi eksekusi kode Javacsript ( script-src) dari asal-usul 'self', http://onlineerp.solution.quebec, 'unsafe-inline', 'unsafe-eval'.

Saya kira dua yang pertama benar-benar valid untuk kasus penggunaan Anda, saya agak tidak yakin tentang yang lainnya. 'unsafe-line'dan 'unsafe-eval'menimbulkan masalah keamanan, jadi Anda tidak boleh menggunakannya kecuali Anda memiliki kebutuhan yang sangat spesifik:

"Jika eval dan rekan teks-ke-JavaScript-nya benar-benar penting untuk aplikasi Anda, Anda dapat mengaktifkan mereka dengan menambahkan 'unsafe-eval' sebagai sumber yang diizinkan dalam perintah script-src. Tapi, sekali lagi, mohon jangan. Melarang kemampuan untuk mengeksekusi string mempersulit penyerang untuk mengeksekusi kode yang tidak sah di situs Anda. " (Mike West, Google)

Rocío García Luque
sumber
Mengapa di halaman localhost saya, saya dapat menambahkan skrip host lain?
mqliutie
Tidak jarang menggunakan kembali skrip pihak ketiga yang tidak dihosting di server Anda, tetapi di mana Anda "percaya"
Rocío García Luque
8

String izin penuh

Jawaban sebelumnya tidak menyelesaikan masalah saya, karena tidak menyertakan blob: data: gap:kata kunci pada saat yang sama; jadi berikut adalah string yang melakukan:

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

Peringatan: Ini mengekspos dokumen ke banyak eksploitasi. Pastikan untuk mencegah pengguna menjalankan kode di konsol atau berada di lingkungan tertutup seperti aplikasi Cordova .

Alexandre Daubricourt
sumber
1
Ini adalah jawaban yang benar jika Anda mencoba memuat misalnya JQuery di konsol seperti ini: stackoverflow.com/a/31912495/137948
Will Sheppard
7

Kami menggunakan ini:

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

Untuk menguraikan lebih lanjut tentang ini, menambahkan

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

ke tag meta seperti ini,

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

memperbaiki kesalahan tersebut.

James Nicholson
sumber
2

Menambahkan tag meta untuk mengabaikan kebijakan ini tidak membantu kami, karena server web kami memasukkan Content-Security-Policytajuk dalam tanggapan tersebut.

Dalam kasus kami, kami menggunakan Ngnix sebagai server web untuk aplikasi berbasis Java Tomcat 9. Dari web server, itu mengarahkan browser untuk tidak mengizinkan inline scripts, jadi untuk pengujian sementara kami telah mematikan Content-Security-Policydengan berkomentar.

Cara mematikannya di ngnix

  • Secara default, file ngnix ssl.conf akan menambahkan header ke respon ini:

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

  • Jika Anda hanya mengomentari baris ini dan memulai ulang ngnix, seharusnya tidak menambahkan header ke respons.

Jika Anda mengkhawatirkan keamanan atau produksi, jangan ikuti langkah ini, gunakan langkah-langkah ini hanya untuk tujuan pengujian dan melanjutkan.

prem
sumber
-1

Kemungkinan alasan mengapa Anda mendapatkan kesalahan ini kemungkinan karena Anda telah menambahkan folder / build ke file .gitignore Anda atau secara umum belum memeriksanya ke Git.

Jadi ketika Anda Git mendorong master Heroku , folder build yang Anda referensikan tidak didorong ke Heroku. Dan itulah mengapa ini menunjukkan kesalahan ini.

Itulah alasannya berfungsi dengan baik secara lokal, tetapi tidak saat Anda menerapkannya ke Heroku.

Sachin
sumber
Saya memiliki masalah yang sama. jadi apakah Anda menyarankan untuk menghapus / membangun folder dari .gitignore?
Hoang Minh