Cara mendeteksi Kebijakan Keamanan Konten (CSP)

Saya perhatikan bahwa GitHub dan Facebook kini menerapkan kebijakan ini, yang membatasi skrip pihak ketiga untuk dijalankan dalam pengalaman/situs mereka.

Apakah ada cara untuk mendeteksi apakah suatu dokumen berjalan pada CSP menggunakan JavaScript? Saya sedang menulis bookmarklet, dan ingin memberikan pesan kepada pengguna jika mereka berada di situs yang tidak mendukung penyematan tag skrip.


person onassar    schedule 02.10.2013    source sumber
comment
Anda dapat mencoba memasukkan <script>var test=true;</script> baru ke dalam dokumen dan kemudian memeriksa apakah variabelnya sudah disetel. Jika CSP diterapkan (dan skrip Anda tidak diizinkan) blok kode ini tidak akan dijalankan sama sekali.   -  person kravietz    schedule 29.10.2013
comment
Menarik, akan mencobanya   -  person onassar    schedule 29.10.2013
comment
Apa itu bekerja? Hanya penasaran :)   -  person kravietz    schedule 05.11.2013
comment
Tidak :( Tidak ada masalah dalam menjalankan JS di Fb atau yang memiliki kebijakan konten. Cukup di dalamnya memuat skrip pihak ketiga yang tidak masuk daftar putih. Saya mungkin memeriksa peristiwa script onerror, dan melihat apakah itu dapat membawa saya ke mana pun.   -  person onassar    schedule 05.11.2013
comment
Saya mencoba metode onerror seperti yang disarankan @onassar dan sepertinya berhasil, setidaknya di Chrome 40   -  person Jon z    schedule 02.10.2014
comment
jawab di sini stackoverflow.com/a/40053880/1784193   -  person milpool    schedule 16.01.2020


Jawaban (6)


Bagaimana dengan ini. Untuk koneksi yang lambat, batas waktu mungkin harus dinaikkan. Onload adalah apa yang saya gunakan untuk mendeteksinya dan sepertinya berhasil. Jika dimuat maka CSP jelas tidak diaktifkan atau tidak dikonfigurasi dengan benar.

var CSP = 0;
frame = document.createElement('script');
frame.setAttribute('id', 'theiframe');
frame.setAttribute('src', location.protocol+'//example.com/');
frame.setAttribute('onload', 'CSP=1;');
document.body.appendChild(frame);
setTimeout(function(){if (0 == CSP){alert("CSP IS ENABLED");}}, 250);
person Community    schedule 09.01.2014
comment
Menarik. Apa pun yang bisa berfungsi terlepas dari kecepatan internet? - person onassar; 09.01.2014
comment
Tidak yang saya tahu. Saya bermain-main dengan berbagai jenis mekanisme untuk mendeteksi CSP dan tidak ada satupun yang bekerja dengan baik. Sejauh ini, ini adalah yang terbaik yang saya temukan. Dalam praktiknya, saya menetapkan batas waktu cukup tinggi dan mencetak pesan kesalahan yang cukup umum, jika pengguna sering menerima pesan tersebut, hal itu mungkin disebabkan oleh pengaturan keamanan halaman. - person ; 10.01.2014
comment
kena kau. akan aneh untuk menetapkan yang tinggi, karena saya harus mencegah aplikasi/skrip saya berjalan hingga batas waktu terpenuhi. terimakasih Meskipun. - person onassar; 11.01.2014
comment
kena kau. tapi aku tidak ingin mengandalkannya. bookmarklet kami digunakan secara global :/ - person onassar; 13.01.2014
comment
Ya. Milik saya juga dijalankan di Bookmarklet yang digunakan secara global. Saya setuju. Solusi saya tidak bagus tapi saya bermain-main dengan banyak hal dan ini adalah satu-satunya yang berhasil. Saya tidak tahu apa fungsi bookmarklet Anda, tetapi bookmarklet kami cukup berat, jadi ini berfungsi dengan baik. Jika Anda menemukan sesuatu yang lebih baik, beri tahu saya! Bersulang - person ; 13.01.2014
comment
Bisakah Anda menghubungkan milik Anda? Banyak pengguna kami berasal dari negara-negara berkembang dengan bandwidth internet yang lebih rendah - person onassar; 13.01.2014
comment
Ups. Maksud saya tautkan ekstensi Toko Web Chrome Anda - person onassar; 14.01.2014
comment
Saya mendapatkan Refused to execute script because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled. Juga setelah saya menyetel frame.setAttribute('type', 'application/javascript'); - person Kiechlus; 11.01.2018

Anda dapat mencoba menangkap kesalahan pelanggaran CSP menggunakan peristiwa "securitypolicyviolation"

Dari: https://developer.mozilla.org/en-US/docs/Web/API/SecurityPolicyViolationEvent

contoh:

document.addEventListener("securitypolicyviolation", (e) => {
  console.log(e.blockedURI);    
  console.log(e.violatedDirective);    
  console.log(e.originalPolicy);
});
person belykh    schedule 19.05.2020
comment
Ini adalah satu-satunya metode dalam daftar yang menurut saya berhasil. - person FrostyDog; 12.12.2020

Dari https://github.com/angular/angular.js/blob/master/src/Angular.js#L1091, fungsi noUnsafeEval

function noUnsafeEval() {
  try {
    /* jshint -W031, -W054 */
    new Function('');
    /* jshint +W031, +W054 */
    return false;
  } catch (e) {
    return true;
  }
}
person brauliobo    schedule 10.12.2014

Cara mudah untuk mendeteksi dukungan untuk CSP adalah dengan memeriksa apakah metode eval() JavaScript dapat dijalankan tanpa menimbulkan kesalahan, seperti:

try {
    eval("return false;");
} catch (e) {
    return true;
}

Namun, ini hanya berfungsi jika CSP benar-benar diaktifkan (tentu saja), dengan Kebijakan-Keamanan-Konten disetel di header respons yang memuat halaman, dan tanpa 'unsafe-eval' di script-src.

Saya datang ke sini mencari cara untuk mendeteksi dukungan CSP di browser tanpa benar-benar mengaktifkan CSP. Namun tampaknya hal ini tidak mungkin dilakukan.

Sebagai tambahan, IE tidak mendukung CSP, hanya arahan sandbox di IE 10+, yang jika dilihat dari standar CSP, tidak menjadikannya browser web yang sesuai.

person LostOblivion    schedule 04.06.2014

Dari https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8cb347c5b5:

fetch(document.location.href)
.then(resp => {
  const csp = resp.headers.get('Content-Security-Policy');
  // does this exist? Is is any good?
});

Namun ini akan gagal dengan connect-src='none' dan dilaporkan.

person Kiechlus    schedule 11.01.2018
comment
Anda juga dapat mengatur inline CSP tidak hanya di header? - person Rok Burgar; 22.02.2019

Saat ini, tidak ada cara untuk melakukannya di browser pengiriman.

Namun, hal seperti berikut ini seharusnya berfungsi, sesuai spesifikasi, dan berfungsi di Chrome dengan fitur platform web eksperimental yang diaktifkan di chrome://flags/:

function detectCSPInUse() {
  return "securityPolicy" in document ? document.securityPolicy.isActive : false;
}

Antarmuka SecurityPolicy (apa yang Anda dapatkan dari document.securityPolicy jika diterapkan) memiliki beberapa atribut yang memberikan rincian lebih lanjut mengenai apa yang saat ini diperbolehkan.

person gsnedders    schedule 26.10.2013
comment
Saya menjalankan kode itu di Facebook melalui konsol. Mendapat false meskipun mereka menjalankannya (yang mencegah penyisipan tag script) - person onassar; 27.10.2013
comment
Fitur ini sepertinya belum cukup siap. Misalnya, di semua versi Chrome saat ini, fitur ini tersembunyi di balik tanda Aktifkan fitur Platform Web eksperimental. Pengguna Anda harus membuka chrome://flags/, menyalakannya, dan memulai ulang browser mereka. Namun, Anda dapat menerapkannya sekarang -- kode di atas dirancang untuk berfungsi jika API tersedia. - person AndrewF; 28.10.2013
comment
Fitur ini tampaknya telah hilang dari Chrome, bahkan dengan chrome://flags/#enable-experimental-web-platform-features diaktifkan. - person Jeffrey Yasskin; 22.04.2014
comment
@JeffreyYasskin Tampaknya antarmuka SecurityPolicy tidak ada lagi dalam spesifikasi. - person gsnedders; 24.04.2014