Jinja: Autoescaping dinonaktifkan secara default adalah default yang berbahaya

Dibuat pada 6 Jan 2016  ·  4Komentar  ·  Sumber: pallets/jinja

Saya menemukan hari ini melalui XSS yang dilaporkan secara eksternal bahwa Jinja tidak mengaktifkan autoescaping secara default. Ini adalah default yang berbahaya, dibuat bahkan lebih berbahaya oleh fakta bahwa banyak orang diperkenalkan ke Jinja melalui pengetahuan mereka sebelumnya tentang template Django, yang memiliki autoescaping yang diaktifkan secara default sejak 2007.

Melihat melalui internet, sepertinya fakta ini tidak terlalu diketahui. Bahkan, saya bahkan menemukan buku (Pemrograman Berorientasi Objek Python 3, bab 12, cc @buchuki) yang merekomendasikan penggunaan jinja2 untuk situs web dan tidak mengaktifkan fitur autoescaping. Sampel acak proyek Github juga menunjukkan bahwa kebanyakan orang tidak menambahkan autoescape=True atau ekstensi autoescape ke proyek mereka.

Meskipun saya mengerti mungkin akan merepotkan untuk bermigrasi ke default yang lebih aman pada saat itu, dokumentasi setidaknya harus memperjelas bahwa pelolosan otomatis dinonaktifkan secara default. Mungkin menambahkan autoescape=True ke semua contoh yang membuat objek jinja2.Environment dan/atau menambahkan bagian di awal dokumentasi.

docs

Komentar yang paling membantu

Kedengarannya seperti kandidat yang baik untuk permintaan tarik :)

Semua 4 komentar

Jinja tidak hanya untuk HTML tetapi juga mesin template untuk keperluan umum. Saya pikir kebanyakan orang menggunakan Jinja di Flask, yang memungkinkan autoescape secara default untuk template HTML. Jika Anda mengintegrasikan mesin templat dalam kerangka kerja Anda sendiri, Anda seharusnya membaca dokumentasi tentang cara menggunakannya dengan aman.

Yang mengatakan, saya pikir menjadi sangat jelas dalam dokumen bahwa Anda mungkin harus menggunakan autoescape saat membuat HTML adalah saran yang bagus.

Saya akan menganggap sebagian besar kerangka kerja utama melakukan ini dengan benar (lebih banyak mata, lebih sedikit bug, dll.) Tetapi ada juga banyak proyek kecil yang mengintegrasikan Jinja secara manual yang membuat kesalahan ini.

Dan sejujurnya, dokumentasi Jinja sangat buruk tentang hal itu. Inilah yang pertama kali Anda lihat saat membuka dokumentasi Jinja:

Jinja2 adalah bahasa templating modern dan ramah-perancang untuk Python, dimodelkan setelah templat Django. Ini cepat, banyak digunakan, dan aman dengan lingkungan eksekusi template sandboxed opsional:

"dimodelkan setelah templat Django" dan "aman" dapat mengarah pada pemikiran bahwa ia memiliki fitur keamanan templat Django seperti pelolosan otomatis.

Kemudian, contohnya, yaitu HTML. Dan setelah itu, dalam daftar fitur:

sistem melarikan diri HTML otomatis yang kuat untuk pencegahan XSS

Yang tidak menyebutkan itu opsional dan tidak diaktifkan secara default.

Halaman dokumen "Penggunaan API Dasar" tidak menunjukkan pelolosan otomatis yang diaktifkan tetapi juga tidak menampilkan HTML, jadi saya rasa tidak apa-apa. Tetapi kemudian ketika Anda pergi ke halaman "Dasar" API :

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
template = env.get_template('mytemplate.html')
print template.render(the='variables', go='here')

Contoh pertama rentan terhadap XSS sepele. Orang-orang benar untuk menjadi bingung.

Kedengarannya seperti kandidat yang baik untuk permintaan tarik :)

Kami tidak dapat mematikan ini sekarang tanpa melanggar kode semua orang. Namun saya senang untuk memperbarui dokumen yang sesuai. Saya akan menutup ini sebagai wontfix tetapi jangan ragu untuk membuka PR untuk pembaruan dokumentasi.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jp-costa picture jp-costa  ·  5Komentar

DriverX picture DriverX  ·  4Komentar

Yannik picture Yannik  ·  4Komentar

harobed picture harobed  ·  6Komentar

glasserc picture glasserc  ·  4Komentar