<p>MathJax memerlukan "Kebijakan Keamanan Konten" yang tidak aman</p>

Dibuat pada 11 Jun 2012  ·  42Komentar  ·  Sumber: mathjax/MathJax

Implementasi MathJax saat ini menggunakan fitur-fitur berikut yang tidak dianggap aman di dunia modern dan tidak dapat digunakan dengan header Content-Security-Policy (http://www.w3.org/TR/CSP/) default:

  • Evaluasi JavaScript string (Fungsi baru() dengan string atau eval()) (1)
  • Atribut gaya sebaris dimasukkan melalui JavaScript (2)

Masih bisa diperdebatkan jika masalah (2) harus diperbaiki tetapi setidaknya (1) harus diperbaiki karena Kebijakan-Keamanan-Konten tidak memiliki perincian yang cukup untuk memungkinkan MathJax dijalankan sebagai skrip tepercaya dan pada saat yang sama tidak menafsirkan setiap JavaScript lainnya file sebagai yang dipercaya secara khusus. Saat ini, jika seseorang ingin menggunakan MathJax, ia harus mengizinkan eval() di mana-mana. Masalah (1) juga menyebabkan bug #130 (MathJax tidak kompatibel dengan mode ketat ECMAScript 5).

Saat ini satu-satunya cara untuk membuat MathJax berfungsi, bahkan jika seseorang menggunakan kode MathJax yang diinstal secara lokal, adalah dengan menggunakan header HTTP CSP berikut (header "opsi" yang tidak digunakan lagi disertakan untuk Firefox 13.0 dan yang lebih rendah):

X-Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; options eval-script
X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'

Header ini akan memungkinkan beberapa perlindungan yang diberikan CSP dan masih memungkinkan MathJax untuk bekerja, jika MathJax didistribusikan dari asal yang sama dengan konten halaman.

Accepted Fixed Test Not Needed v2.4

Komentar yang paling membantu

@kaushalmodi , lihat komentar saya di atas tentang cara menghindari masalah, atau komentar saya untuk masalah yang Anda tautkan. Anda harus mengubah cara Anda mengonfigurasi MathJax jika Anda menggunakan CSP yang membatasi eksekusi skrip.

Semua 42 komentar

unsafe eval adalah masalah besar bagi saya juga. chrome akan segera memaksa semua ekstensi untuk mengadopsi kebijakan keamanan konten yang melarang penggunaan eval . Kami sedang mencoba meningkatkan Readium untuk mematuhi ini, tetapi kami tidak dapat menggunakannya dan menggunakan MathJax

+1

Terima kasih teman-teman. Kami akan memeriksanya.

Hanya pembaruan awal. Tampaknya mungkin untuk segera memperbaiki beberapa masalah (semoga cukup untuk toko Chrome). Namun, kami tidak yakin bagaimana kinerjanya akan menurun -- yang, seperti yang bisa Anda tebak, bisa jadi buruk. Kami akan terus mengabari Anda ketika @dpvc dapat melihat ini lebih detail dan mungkin membuat beberapa cabang eksperimental.

Jika Anda memiliki komentar, pertanyaan, dan saran tambahan tentang kode tertentu, beri tahu kami.

Saya menghabiskan sedikit waktu untuk melihat ke dalamnya sendiri. Sepertinya kalian harus berhenti dengan optimasi prematur. Mengevaluasi string TIDAK lebih cepat daripada membuat penutupan.

Juga, Anda tidak boleh menjalankan eval() pada setiap halaman yang memuat Mathjax hanya untuk memeriksa apakah Anda dapat menjalankan eval() . Pada dasarnya, ini harus pergi.

Panggilan new Function() bukan untuk kecepatan tetapi untuk memori. new Function() tidak membuat penutupan, sehingga tidak memegang lingkup lokal. Karena ini adalah inti dari model pemrograman berorientasi objek, dan ada banyak objek yang digunakan, ini dapat berdampak pada penggunaan memori. Saya belum melakukan pengujian apa pun di browser terbaru.

Adapun penggunaan eval , MathJax menggunakannya untuk menangani blok konfigurasi in-line, dan itu tidak dapat dengan mudah diganti pada saat ini. Jadi versi MathJax yang "aman" perlu menggunakan file konfigurasi eksternal (yang seharusnya tidak menjadi masalah, dan mungkin lebih sesuai dengan kebijakan keamanan). Panggilan eval yang Anda rujuk bukan untuk menentukan apakah eval dapat dijalankan, tetapi untuk menentukan apakah itu berjalan di namespace global (yang tidak terjadi di semua browser). Saya sadar bahwa ini perlu dihapus untuk versi yang sesuai dengan kebutuhan keamanan Anda.

Itu bukan cara kerja penutupan di javascript. Anda tidak berpegang pada segala sesuatu dalam lingkup lokal; Anda hanya menangkap hal-hal yang digunakan fungsi Anda. Fungsi CONSTRUCTOR Anda tidak menggunakan apa pun dari lingkup lokal, tidak ada biaya untuk membuat penutupan. Ini adalah optimasi prematur untuk masalah yang tidak pernah ada.

Sejauh menyangkut eval poin saya adalah Anda tidak boleh menjalankan kode pada halaman jika tidak perlu, terutama jika kode yang menggunakan eval() tidak aman. Anda hanya menggunakan fungsi EVAL itu jika Mathjax telah disertakan dengan konfigurasi in-line jadi, jangan jalankan tes untuk itu sampai Anda membutuhkannya. Tapi sungguh, mengapa konfigurasi harus berupa kode yang dapat dieksekusi. Ini benar-benar hanya sepotong JSON yang diteruskan ke fungsi. Mengapa tidak meneruskan JSON, menguraikannya, dan meminta MathJAX memanggil fungsinya?

Itu bukan cara kerja penutupan di javascript. Anda tidak berpegang pada segala sesuatu dalam lingkup lokal; Anda hanya menangkap hal-hal yang digunakan fungsi Anda.

Saya tidak berpikir hal-hal sejelas itu. Pertama, ini _tidak_ terjadi pada tahun 2008 ketika bagian kode itu ditulis. Saya baru saja menjalankan tes pagi ini yang muncul untuk mengonfirmasi bahwa versi Safari, Firefox, Opera, dan IE yang sedang dimainkan pada saat itu semuanya bekerja seperti yang saya jelaskan (rantai cakupan lengkap dipertahankan dalam penutupan, terlepas dari variabel yang digunakan ). Situs yang menjadi referensi saya untuk ini tampaknya tidak aktif pagi ini (sudah bangun kemarin), jadi saya tidak dapat memeriksa detailnya, tetapi yang saya ingat adalah bahwa ini adalah bagian dari spesifikasi ECMAScript 262.

Versi Safari, Chrome, Firefox, dan IE saat ini tampaknya berfungsi seperti yang Anda gambarkan, jadi sejak saat itu banyak hal telah berubah. Sepertinya Safari 4, Firefox 3.6, dan IE9 adalah tempat terjadinya perubahan; Saya tidak memiliki Chrome versi lama untuk diuji, jadi tidak tahu riwayat di sana. IE8 memiliki perilaku yang lebih lama, dan Opera 12 masih melakukannya. Saya belum memeriksa perangkat seluler. Beberapa dari browser ini ada dalam daftar dukungan MathJax, jadi ini masih menjadi masalah yang harus kita pertimbangkan untuk MathJax secara umum. Tentu saja, saya yakin sesuatu dapat dilakukan untuk kebutuhan Anda.

Untuk data JSON, blok konfigurasi mungkin lebih dari sekedar panggilan MathJax.Hub.Config() . Misalnya, Anda dapat menginstal event listener, atau menambahkan fungsi ke input jax TeX untuk mengimplementasikan perintah tambahan, dan seterusnya. Ini tidak dapat menjadi bagian dari data JSON karena menyertakan kode yang dapat dieksekusi. Fitur ini tidak selalu digunakan, tetapi pasti _digunakan_ oleh situs web yang sebenarnya. Selain itu, tidak semua browser target memiliki pustaka JSON bawaan, sehingga perlu ada pustaka tambahan untuk melakukan penguraian. (Tentu saja tidak dapat diatasi, tetapi lebih banyak kode untuk diunduh.)

+1 untuk mengubah ini, sehingga (antara lain) Github akan mengizinkan MathJax di wiki mereka lagi.

@ketch apakah Anda memiliki referensi untuk Github membuat pernyataan dalam hal ini? Saya tidak melihat bagaimana masalah ini menyentuh keamanan Github Wiki.

@pkra Saya tidak tahu pasti apakah ini penyebabnya, tapi saya yakin begitu. Saya dituntun oleh komentar di halaman ini:

http://stackoverflow.com/questions/16889421/how-to-insert-javascript-to-enable-mathjax-on-github-wiki-pages

Dan lihat

https://github.com/blog/1477-content-security-policy

Saya percaya dukungan MathJax menghilang pada saat yang sama ketika mereka mengimplementasikan fitur CSP.

Terima kasih, itu menarik. Saya tidak yakin keduanya terkait tetapi siapa tahu -- tim github tidak pernah membahas secara terbuka mengapa mereka menghapus MathJax. Akan sangat disayangkan jika sesuatu yang sebenarnya bukan masalah untuk pengaturan mereka menjadi alasannya.

+1 untuk mematuhi CSP.

+1

Saya membaca utas ini dan merasa sangat informatif dan tidak bias. Saya akan mempertaruhkan klaim saya bahwa mereka [github] akan mencegah sesuatu seperti exec, CSP tentang masalah keamanan dan tidak mengizinkannya.

Selain bingung dengan contoh kode itu dan pengetahuan komputer mitos Anda tentang versi sebelumnya, saya merasa sangat menarik dan mengambil posisi bahwa fitur harus tersedia untuk digunakan secara berkelanjutan, meskipun tidak boleh mengganggu kesenangan. jalur penggunaan MathJAX di dunia yang terkait dengan keamanan.

Omong-omong, saya mengirim email ke dukungan Github tentang mengapa mereka menjatuhkan MathJax. Inilah balasannya:

CSP adalah salah satu alasannya. Alasan lain termasuk masalah kinerja, dan pemeliharaan yang sulit. Kami mungkin mempertimbangkan untuk menambahkannya kembali jika kami menghilangkan alasan yang membuat kami menghapusnya, tapi saya tidak bisa menjanjikan itu.

Terima kasih @ketch , senang mengetahuinya.

@dpvc haruskah kita menambahkan ini ke tonggak sejarah berikutnya?

:+1:

@pkra , saya berencana untuk menambahkannya. Hanya belum sampai sejauh ini secara numerik dalam daftar.

@dpvc benar. Saya sebagian besar bertanya-tanya apakah memperbaiki ini akan memerlukan perubahan signifikan (terutama konfigurasi inline wrt), yaitu, memaksa lompatan versi.

Perubahan yang kami buat untuk mengizinkan konfigurasi melalui variabel MathJax harus memungkinkan untuk memasukkannya tanpa lompatan. Saya cukup yakin saya dapat melakukannya dengan kompatibilitas ke belakang dan tanpa harus membuat versi MathJax.js terpisah yang "aman". Tentu saja, sesuatu bisa muncul selama pengembangan yang akan membuat kunci pas monyet bekerja; belum ada yang ditulis atau diuji.

+1 untuk membuat MathJax aman. Sayang sekali tidak dapat menggunakan perpustakaan yang bagus ini dalam produksi karena masalah keamanan.

Ada kemajuan dalam masalah ini? Saya mencoba menyuntikkan MathJax secara terprogram ke halaman dengan ekstensi Chrome, dan saya memukul jika bukan dinding bata setidaknya dinding yang kokoh. Seperti yang dijelaskan dalam emichael/textthings#4, masalah terbesar saya sekarang adalah dengan MathJax.js:265 . Saya dapat menghilangkan panggilan ke

new Function()

cukup mudah dengan mengubahnya menjadi penutupan seperti yang dijelaskan di atas, tetapi saya tidak tahu bagaimana menyiasatinya menggunakan eval atau skrip sebaris.

EDIT: Saya akhirnya memberi pengguna opsi untuk menambahkan unsafe-eval dan unsafe-inline ke CSP, tetapi perbaikan jangka panjang untuk mendapatkan MathJax ke CSP yang aman akan menyenangkan. :+1:

@emichael , kami berencana untuk memasukkan perubahan dalam rilis berikutnya (direncanakan untuk bulan depan), tetapi saya belum membuatnya. Salah satu alasannya adalah saya belum melihat bagaimana Anda benar-benar menguji ini (cara mengatur lingkungan yang memerlukannya). Jika Anda dapat memberi saya saran tentang ke mana harus mencari atau lingkungan pengujian minimal, itu akan membantu.

Juga, apakah kesalahan tentang eval yang terjadi pada waktu berjalan atau pada waktu kompilasi? Yaitu, apakah itu terjadi jika MathJax.js hanya menyertakan panggilan eval, meskipun tidak pernah digunakan, atau apakah itu terjadi hanya ketika eval benar-benar dicoba? Pembacaan saya tentang spesifikasi menunjukkan bahwa itu seharusnya menjadi kesalahan run-time, yang akan membuat segalanya lebih baik bagi saya, tetapi saya pikir Anda mungkin tahu jawabannya.

Jika Anda memiliki server uji, Anda bisa mengatur Content-Security-Policy di header respons. Pastikan bahwa script-src tidak menyertakan 'unsafe-eval' atau 'unsafe-inline' (GitHub sendiri adalah contoh yang baik). Jika tidak, Anda dapat menggunakan ekstensi Chrome yang sangat minimal untuk menyuntikkan header sendiri.

Ini adalah kesalahan waktu proses.

Terima kasih. Saya akan lihat apa yang dapat saya lakukan.

Perintah eval hanya digunakan untuk memproses blok konfigurasi in-line (dan ada yang awal untuk menguji bagaimana variabel global ditangani dalam kasus itu). Yang awal dapat ditunda hingga konfigurasi inline digunakan, dan jika Anda menghindari penggunaan konfigurasi in-line, maka itu harus diurus. Di v2.3 kami menambahkan cara baru untuk melakukan konfigurasi in-line tanpa eval (sebagai persiapan untuk mengatasi masalah ini), sehingga Anda masih dapat menyertakan konfigurasi MathJax dalam file HTML tanpa memicu panggilan eval.

Oke, saya telah membuat tambalan yang menghapus panggilan new Function() dan eval() . Ini didasarkan pada cabang pengembangan terbaru, tetapi perubahan yang tercantum dalam f220993 juga harus dapat dilakukan pada salinan master MathJax.js , jika Anda perlu melakukannya. Anda memang perlu mengizinkan gaya sebaris (benar-benar tidak ada cara untuk menyiasatinya). Ada juga referensi font ke about:blank sehingga MathJax dapat menguji respons terhadap font yang hilang (tanpa harus membuat akses jaringan), jadi Anda mungkin ingin menambahkan about: ke font-src juga. Setelah saya mengubah keduanya, salinan MathJax ini berjalan tanpa hambatan.

Bagus! Saya dapat melihat mengapa Anda pasti membutuhkan 'unsafe-inline' untuk gaya.

Sejauh izin script-src 'unsafe-inline' berlaku, jika saya memahami Anda dengan benar, skrip hanya akan dibariskan ketika pengguna menyertakan konfigurasi MathJax sebaris untuk memulai. Ini akan baik-baik saja, karena semuanya masih bisa berfungsi tanpa 'unsafe-inline' di script-src . Itu harus disebutkan dalam dokumen.

Pemahaman Anda tentang skrip sebaris benar. Anda tidak perlu script-src 'unsafe-inline' kecuali Anda menggunakan blok konfigurasi in-line, yang tidak perlu Anda gunakan. Anda dapat menggunakan file konfigurasi MathJax lokal (ditambahkan ke config= ) atau Anda dapat menggunakan file skrip normal yang menyetel variabel MathJax ke objek yang biasanya Anda berikan ke MathJax.Hub.Config() dan muat file itu _before_ skrip Anda yang memuat MathJax.js. Misalnya, taruh

var MathJax = {
  tex2jax: {
    inlineMath: [['$','$'],['\\(','\\)']],
    procesEscapes: true
  }
};

ke dalam file bernama mathjax-config.js dan kemudian

<script src="mathjax-config.js"></script>
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>

Saya harap itu memenuhi kebutuhan Anda.

Memang benar. Terima kasih atas perbaikan cepatnya!!

Ada beberapa orang di sini yang akan mengatakan bahwa itu tidak secepat itu (masalahnya telah terbuka selama dua tahun!), tetapi saya telah menandainya untuk rilis berikutnya, dan baru saja menyelesaikannya, jadi komentar Anda muncul di waktu yang tepat.

=> Digabung.

jadi apakah ada yang meminta github untuk mengizinkan mathjax? masih tidak mungkin untuk menulis file dotjs yang memungkinkan saya menulis teks dalam masalah github sehingga dapat dirender dengan mathjax...

(contoh di sini - http://stackoverflow.com/questions/16889421/how-to-insert-javascript-to-enable-mathjax-on-github-wiki-pages - gagal.)

Halo,

Saat ini saya meng-hosting situs jekyll di halaman github dan mengikuti artikel ini , dan telah menambahkan yang berikut ini ke file include saya:

<script type="text/javascript"
  src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>

Yang seharusnya bekerja dengan https atau http. Namun, ketika memuat blog saya di browser dengan https di mana-mana, tampilannya kacau hingga Anda mengklik untuk mengizinkan skrip yang tidak aman. Bagaimana saya bisa memperbaikinya?

@ silky tidak ada AFAWK yang spesifik. Sisi klien tidak mungkin, saya pikir, tetapi MathJax-node dapat memberikan alternatif yang produktif.

@diego898 Pertanyaan umum lebih cocok di http://groups.google.com/forum/#!forum/mathjax -users; selalu sertakan tautan ke halaman langsung, browser dan spesifikasi OS, dll. Terima kasih.

@pkra Saya mengerti saya hanya tidak yakin apakah itu bug yang terkait dengan masalah ini, atau masalah konfigurasi di pihak saya

@diego898 tidak masalah. Apa yang Anda gambarkan sepertinya tidak terkait dengan masalah ini.

Saya masih melihat masalah ini. Lihat https://github.com/mathjax/MathJax/issues/1988.

@kaushalmodi , lihat komentar saya di atas tentang cara menghindari masalah, atau komentar saya untuk masalah yang Anda tautkan. Anda harus mengubah cara Anda mengonfigurasi MathJax jika Anda menggunakan CSP yang membatasi eksekusi skrip.

Apakah (2) dalam masalah asli pernah diselesaikan? Tampaknya mathjax v3 masih menyisipkan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

albertodiazdorado picture albertodiazdorado  ·  6Komentar

parhizkari picture parhizkari  ·  5Komentar

Esporia picture Esporia  ·  4Komentar

kiwi0fruit picture kiwi0fruit  ·  3Komentar

Jerska picture Jerska  ·  6Komentar