Saya mendapat banyak kesalahan di konsol pengembang:
Menolak untuk mengevaluasi string
Menolak untuk menjalankan skrip inline karena melanggar arahan Kebijakan Keamanan Konten berikut
Menolak memuat skrip
Menolak memuat stylesheet
Tentang apa semua ini? Bagaimana cara kerja Kebijakan Keamanan Konten? Bagaimana cara menggunakan Content-Security-Policy
header HTTP?
Secara khusus, bagaimana ...
- ... izinkan beberapa sumber?
- ... menggunakan arahan yang berbeda?
- ... gunakan beberapa arahan?
- ... menangani port?
- ... menangani protokol yang berbeda?
- ... izinkan
file://
protokol? - ... menggunakan gaya inline, skrip, dan tag
<style>
dan<script>
? - ... ijinkan
eval()
?
Dan akhirnya:
- Apa sebenarnya
'self'
artinya?
Jawaban:
The
Content-Security-Policy
meta-tag memungkinkan Anda untuk mengurangi risiko XSS serangan dengan memungkinkan Anda untuk menentukan di mana sumber daya dapat diambil dari, mencegah browser dari loading data dari lokasi lain. Ini mempersulit penyerang untuk menyuntikkan kode berbahaya ke situs Anda.Saya membenturkan kepala ke dinding batu bata untuk mencari tahu mengapa saya mendapatkan kesalahan CSP satu demi satu, dan sepertinya tidak ada petunjuk yang jelas dan jelas tentang bagaimana cara kerjanya. Jadi, inilah upaya saya untuk menjelaskan beberapa poin CSP secara singkat, sebagian besar berkonsentrasi pada hal-hal yang sulit saya pecahkan.
Untuk singkatnya saya tidak akan menulis tag lengkap di setiap sampel. Alih-alih, saya hanya akan menunjukkan
content
properti, jadi contoh yang mengatakancontent="default-src 'self'"
artinya:1. Bagaimana cara mengizinkan beberapa sumber?
Anda dapat dengan mudah mendaftarkan sumber-sumber Anda setelah arahan sebagai daftar yang dipisahkan oleh ruang:
Perhatikan bahwa tidak ada tanda kutip di sekitar parameter selain yang khusus , seperti
'self'
. Juga, tidak ada titik dua (:
) setelah arahan. Hanya arahan, lalu daftar parameter yang dipisahkan ruang.Segala sesuatu di bawah parameter yang ditentukan diizinkan secara implisit. Itu berarti bahwa dalam contoh di atas ini akan menjadi sumber yang valid:
Namun, ini tidak valid:
2. Bagaimana cara menggunakan arahan yang berbeda, apa yang mereka lakukan masing-masing?
Arahan yang paling umum adalah:
default-src
kebijakan default untuk memuat javascript, gambar, CSS, font, permintaan AJAX, dllscript-src
mendefinisikan sumber yang valid untuk file javascriptstyle-src
mendefinisikan sumber yang valid untuk file cssimg-src
mendefinisikan sumber yang valid untuk gambarconnect-src
mendefinisikan target yang valid untuk ke XMLHttpRequest (AJAX), WebSockets atau EventSource. Jika upaya koneksi dilakukan ke host yang tidak diizinkan di sini, browser akan meniru400
kesalahanAda yang lain, tetapi ini adalah yang paling mungkin Anda butuhkan.
3. Bagaimana cara menggunakan banyak arahan?
Anda mendefinisikan semua arahan Anda di dalam satu meta-tag dengan menghentikannya dengan tanda titik koma (
;
):4. Bagaimana cara menangani port?
Semuanya kecuali port default harus diizinkan secara eksplisit dengan menambahkan nomor port atau tanda bintang setelah domain yang diizinkan:
Di atas akan menghasilkan:
Seperti yang saya sebutkan, Anda juga dapat menggunakan tanda bintang untuk secara eksplisit mengizinkan semua port:
5. Bagaimana menangani protokol yang berbeda?
Secara default, hanya protokol standar yang diizinkan. Misalnya untuk mengizinkan WebSockets,
ws://
Anda harus mengizinkannya secara eksplisit:6. Bagaimana cara mengizinkan protokol file
file://
?Jika Anda akan mencoba mendefinisikannya, maka tidak akan berfungsi. Sebagai gantinya, Anda akan mengizinkannya dengan
filesystem
parameter:7. Bagaimana cara menggunakan skrip inline dan definisi gaya?
Kecuali diizinkan secara eksplisit, Anda tidak dapat menggunakan definisi gaya inline, kode di dalam
<script>
tag atau di properti tag sepertionclick
. Anda mengizinkannya seperti ini:Anda juga harus secara eksplisit mengizinkan gambar yang disandikan sebaris, base64:
8. Bagaimana cara mengizinkan
eval()
?Saya yakin banyak orang akan mengatakan bahwa Anda tidak, karena 'eval is evil' dan kemungkinan besar penyebab akhir dunia yang akan datang. Orang-orang itu akan salah. Tentu, Anda pasti dapat membuat lubang besar ke keamanan situs Anda dengan eval, tetapi memiliki kasus penggunaan yang sangat valid. Anda hanya harus pandai menggunakannya. Anda mengizinkannya seperti ini:
9. Apa sebenarnya
'self'
artinya?Anda mungkin
'self'
mengartikan localhost, filesystem lokal, atau apapun pada host yang sama. Itu tidak berarti semua itu. Ini berarti sumber yang memiliki skema (protokol) yang sama, host yang sama, dan port yang sama dengan file kebijakan konten didefinisikan. Melayani situs Anda melalui HTTP? Tidak ada https untuk Anda, kecuali Anda mendefinisikannya secara eksplisit.Saya telah menggunakan
'self'
sebagian besar contoh karena biasanya masuk akal untuk memasukkannya, tetapi itu tidak wajib. Biarkan saja jika Anda tidak membutuhkannya.Tapi tunggu sebentar! Tidak bisakah saya hanya menggunakan
content="default-src *"
dan selesai dengan itu?Tidak. Selain kerentanan keamanan yang jelas, ini juga tidak akan berfungsi seperti yang Anda harapkan. Meskipun beberapa dokumen mengklaim itu memungkinkan, itu tidak benar. Itu tidak memungkinkan inlining atau evals, jadi untuk benar-benar membuat situs Anda lebih rentan, Anda akan menggunakan ini:
... tapi saya percaya Anda tidak akan melakukannya.
Bacaan lebih lanjut:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy
sumber
default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;
content="default-src * 'unsafe-inline' 'unsafe-eval'"
diperlukan untuk membuat beberapa aplikasi Angular bekerja.connect-src
dan jalur: trailing slash adalah wajib jika Anda ingin memasukkan seluruh subpath. Misalnya: filehttp://foo.com/files/bar.txt
akan diblokir jika sumbernyahttp://foo.com/files
, tetapi disajikan ketika ituhttp://foo.com/files/
APACHE2 MOD_HEADERS
Anda juga dapat mengaktifkan Apache2 mod_headers, di Fedora sudah diaktifkan secara default, jika Anda menggunakan Ubuntu / Debian, aktifkan seperti ini:
Di Ubuntu / Debian Anda dapat mengkonfigurasi header di file
/etc/apache2/conf-enabled/security.conf
Catatan: Ini adalah bagian bawah file, hanya 3 entri terakhir adalah pengaturan CSP.
Parameter pertama adalah arahan, yang ke-2 adalah sumber yang akan didaftar putih. Saya telah menambahkan Google analytics dan adserver, yang mungkin Anda miliki. Lebih lanjut saya menemukan bahwa jika Anda memiliki alias, mis., Www.example.com dan example.com dikonfigurasi dalam Apache2 Anda harus menambahkannya ke daftar putih juga.
Kode sebaris dianggap berbahaya, Anda harus menghindarinya. Salin semua javascripts dan css untuk memisahkan file dan menambahkannya ke daftar putih.
Saat Anda melakukannya, Anda bisa melihat pengaturan header lainnya dan menginstal mod_security
Bacaan lebih lanjut:
https://developers.google.com/web/fundamentals/security/csp/
https://www.w3.org/TR/CSP/
sumber
Jangan lupa tentang font-src kerjanya sama seperti yang lain, tetapi jika Anda menggunakan font yang diambil dari asal lain - pastikan Anda menambahkannya ke meta tag
sumber