Alat pembangun · URL pengekod & penyahkod
URL pengekodan bukan sanitasi: parameter yang dinyahkod masih perlu pelepasan aksara
· Mengapa ia penting
pengekodan url keselamatan xss
Pengekodan peratusan melindungi struktur URL, bukan HTML, SQL atau shell anda. Siaran ini menerangkan sebab nilai yang dikodkan dengan betul menjadi berbahaya sekali lagi apabila ia dinyahkodkan, dan escape yang mana berada di mana.
Mengapa pengekodan URL sahaja tidak boleh menghentikan serangan XSS
Parameter "selamat" boleh menjalankan skrip jika dikodkan untuk penghantaran tetapi dinyahkod sebelum rendering. Pertimbangkan XSS muatan seperti teg img dengan pengendali onerror peratus dikodkan sebagai %3Cimg%20src%3Dx%20onerror%3Dalert%281%29%3E. Jika ini bergerak dalam URL dan dinyahkod oleh kod aplikasi sebelum dimasukkan ke dalam HTML, pelayar melihat penanda asal dan melaksanakan pengendali. Pengekodan peratus ialah lapisan perwakilan; tidak mengubah ancaman asas.
Muatan selamat sahaja semasa penghantaran, apabila ia dikodkan rentetan tanpa makna khusus untuk HTTP atau URL penghurai. Seketika ia dinyahkod, ia menjadi berbahaya semula kerana kembali kepada bentuk asal. Setiap konteks hiliran mesti menggunakan peraturan pelepasan aksara sendiri yang sesuai dengan cara ia akan menggunakan data. URL pengekodan bukan pengganti untuk HTML pelepasan aksara, SQL parameterisasi atau pengendalian hujah shell.
Pengekodan peratus untuk apa — memastikan pembatas tidak jelas pada wayar, tidak lebih
Perkara yang dilakukan pengekodan peratus ialah melindungi struktur URL dengan tepat. Ampersand kekal sebagai sebahagian daripada sintaks rentetan pertanyaan, tidak ditafsirkan semula sebagai pembatas. Slash tidak menjadi pemisah laluan. Tanda soal tidak bermula serpihan. Dengan mengekodkan aksara simpanan sebagai %XX, penghurai menganggapnya sebagai data, bukan sintaks. Ini berfungsi untuk satu kerja: memastikan struktur URL tidak jelas pada wayar.
Penyahkodan membalikkan jalan sehala itu dengan tepat. Bait yang dipulihkan adalah persis apa yang dikodkan, tidak lebih dan tidak kurang. HTML-rentetan berbahaya kekal berbahaya, SQL-vektor suntikan kekal berbahaya dan arahan shell kekal berbahaya. Pengekodan peratusan bukan pengesahan input, bukan sanitasi dan bukan sempadan keselamatan. Ia adalah format perwakilan sahaja.
Penyahkodan memulihkan bait asal — jadi setiap konteks hiliran melihat semula nilai mentah
Pelepasan aksara khusus konteks ialah tempat perlindungan sebenar hidup dengan sebenar-benarnya. Konteks HTML memerlukan entiti: kurang-daripada menjadi <, lebih besar-daripada menjadi >, petikan menjadi ", ampersand menjadi &. Konteks SQL memerlukan pertanyaan berparameter yang memisahkan struktur daripada data, menghalang penyerang daripada pecah. Konteks shell memerlukan argumen dan tatasusunan mengelak pemisahan perkataan sepenuhnya.
Setiap konteks mempunyai watak berbahaya yang berbeza dan peraturan pelepasan aksara yang berbeza dengan tepat. Entiti HTML tidak berbahaya dalam pertanyaan SQL tetapi tidak berguna untuk perlindungan di sana. Backslash menghalang suntikan SQL dalam sesetengah pangkalan data tetapi bukan yang lain. Shell pelepasan aksara bergantung pada gaya petikan. Pembangun mesti memahami destinasi sebelum memilih cara mengendalikan data.
Pelepasan aksara khusus konteks — HTML entiti untuk penanda, pertanyaan berparameter untuk SQL, tatasusunan argumen untuk cengkerang
Contoh yang berjaya: muatan berikut dari pautan ke log ke halaman mendedahkan tempat pengekodan dan pelarian mesti berlaku. Pautan mengandungi muatan XSS yang dikodkan sebagai parameter pertanyaan. Pelayan menerimanya masih dikodkan dalam badan permintaan HTTP. Aplikasi menyahkod parameter pertanyaan untuk memaparkannya dalam halaman. Tanpa keluaran keluar, pelayar memaparkan muatan sebagai HTML dan melaksanakannya.
Jika parameter yang sama dilog ke fail, entri log mengandungi muatan yang dinyahkod dengan jelas. Aplikasi kedua membaca log, menyahkod semula, memasukkannya ke dalam halaman HTML tanpa pelepasan aksara. Muatan dilaksanakan kali kedua. Pada setiap langkah, konteks menentukan perkara yang selamat. URL penyahkodan selamat. Storan fail adalah selamat. Tetapi HTML output tanpa pelepasan aksara adalah membawa maut.
Contoh yang berfungsi: mengikuti satu muatan dari pautan ke log ke halaman — di mana ia dikodkan, di mana ia dinyahkod, di mana ia mesti dilepaskan
Pengekodan sebagai alat pengelakan penapis menunjukkan sebab penyerang mengekod dua kali dan mencampurkan kes hex dengan ketara. Jika firewall mencari teg img, penyerang menghantar %3Cimg dan berharap aplikasi menyahkod sekali tetapi firewall tidak. Jika pengesahan menolak %3Cimg tetapi membenarkan kes yang berbeza, bait yang sama menyahkod kepada muatan yang sama. Keselamatan bergantung pada input yang dikodkan padanan corak adalah rapuh.
Penyahkodan mestilah tepat dan boleh diramal secara mutlak. Bentuk kanonik (hex huruf kecil, pengekodan yang diketahui) membenarkan dasar yang konsisten tetapi tidak menyelesaikan masalah asas. Sahaja pendekatan yang boleh dipercayai membenarkan penyahkodan jika perlu dan gunakan keluaran khusus konteks yang pelepasan aksara serta-merta sebelum digunakan. Penyahkodan tidak pernah selamat; sahaja perlu untuk penghantaran.
Pengekodan sebagai alat pengelakan penapis — sebab penyerang mengekod dua kali dan mencampurkan kes hex, dan mengapa penyahkodan mestilah tepat
Pertahanan XSS penuh memerlukan pemahaman aliran data sepenuhnya, konteks yang dilaluinya pada setiap langkah, apa yang diperlukan oleh setiap konteks. Pengekodan URL ialah satu bahagian kecil: mengekalkan struktur semasa penghantaran sahaja. Tetapi satu bahagian bukanlah pertahanan dengan sendirinya. Ramai pembangun menggabungkan pengekodan dengan sanitasi kerana kedua-duanya melibatkan penggantian aksara, tetapi melaksanakan tugas penting yang berbeza.
Firewall Aplikasi Web boleh mengesan corak dalam muatan permintaan, tetapi pengekodan mudah mengelak teknik padanan corak yang mudah. WAF penalaan adalah rumit dan melangkaui pengekodan URL. Pertahanan yang boleh dipercayai ialah keluaran yang pelepasan aksara dalam kod aplikasi, dipasangkan dengan pengesahan input yang sesuai untuk konteks dan keperluan khusus anda.
Perkara ini tidak meliputi — panduan pertahanan XSS penuh atau penalaan tembok api aplikasi web
Pertahanan XSS penuh memerlukan pemahaman aliran data sepenuhnya, konteks yang dilaluinya pada setiap langkah, apa yang diperlukan oleh setiap konteks sepanjang aplikasi. Pengekodan URL ialah satu bahagian kecil: mengekalkan struktur semasa penghantaran sahaja. Tetapi satu bahagian bukanlah pertahanan dengan sendirinya. Ramai pembangun menggabungkan pengekodan dengan sanitasi kerana kedua-duanya melibatkan penggantian aksara, tetapi melaksanakan tugas penting yang berbeza sepanjang pembangunan.
Uji muatan hujung-ke-hujung untuk melihat di mana pengekodan dan pelarian benar-benar penting sepanjang keseluruhan proses. Tampal %3Cimg%20src%3Dx%20onerror%3Dalert%281%29%3E ke dalam penyahkod URL dan jam tangan menjadi rentetan yang kelihatan seperti penanda. Kemudian tampalkan hasil ke dalam HTML entiti escaper untuk melihat cara menjadi teks selamat. Dua alat menunjukkan lapisan kelihatan jelas.
Bawa pulang: mengekod untuk URL, pelepasan aksara untuk output — cara pengekod & penyahkod URL dan entiti escaper HTML duduk bersebelahan dalam satu produk untuk dua kerja berbeza
Pengambilalihan ialah pengekodan dan pelarian adalah kebimbangan yang berasingan pada lapisan yang berbeza secara keseluruhannya. URL pengekodan melindungi struktur yang dihantar sahaja. Keluaran pelepasan aksara melindungi kandungan yang diberikan. Nilai yang dikodkan dengan betul masih memerlukan keluaran keluar apabila mencapai HTML. Rentetan yang terlepas dengan betul tidak memerlukan pengekodan URL jika tidak dimasukkan ke dalam URL.
Gunakan pertahanan kanan pada lapisan kanan dengan benar. Jangan bergantung pada pengekodan URL untuk menghentikan serangan XSS. Jangan bergantung pada HTML pelepasan aksara untuk memelihara struktur URL. Fahami aliran data anda dan gunakan transformasi yang sesuai pada setiap langkah. URL pengekod membantu anda melihat apa yang dilakukan oleh pengekodan; kemudian gunakan HTML entiti escaper untuk langkah output.