Alat pembangun · URL pengekod & penyahkod
Pengekodan URL berganda: cara %2520 berlaku dan cara untuk mengesan dan membuat asalnya
· Bagaimana ia berfungsi
pengekodan url javascript aliran kerja pembangun penyahpepijatan
%2520 dalam URL bermakna ruang telah dikodkan dua kali. Siaran ini menerangkan kesilapan saluran paip yang menyebabkannya, cara mengenali tandatangan dan bilangan pas nyahkod yang selamat.
Pengekodan URL berganda: apabila %2520 bermakna ruang melalui dua pengekod
Nama fail yang tiba sebagai "my%20file.pdf" bukannya "my file.pdf" memberi isyarat pengekodan berganda: ruang telah dikodkan kepada %20, maka tanda peratus itu sendiri telah dikodkan kepada %25, menghasilkan %2520 dalam perlawanan akhir URL. Setiap lapisan sistem seperti kod pelanggan, rangka kerja web atau proksi terbalik mungkin mengekod sekali. Apabila dua lapisan berasingan mengekod, satu aksara menjadi hancur.
Permukaan pengekodan berganda paling kerap dalam rantai ubah hala kompleks dan sistem templat. Pembangun mungkin menghasilkan URL yang dikodkan dalam rangka kerja yang dengan sendirinya mengekod semua output secara lalai. Proksi terbalik atau rangkaian penghantaran kandungan boleh mengekod semula URL yang telah tiba dikodkan daripada sistem hujung belakang. Parameter yang mengandungi nilai yang telah dikodkan akan dikodkan semula sebelum disarangkan di dalam struktur URL yang lain.
Mengapa %25 adalah makluman — tanda peratus itu sendiri akan dikodkan, jadi %20 menjadi %2520 dan %C3%A9 menjadi %25C3%25A9
Tanda tanda pengekodan berganda ialah %25 muncul di mana anda biasanya menjangkakan untuk melihat satu peratus tanda dalam URL atau data. Dalam URL yang dikodkan secara biasa, anda tidak akan melihat %25 melainkan menghantar literal "%25". Jika ruang yang dikodkan sebagai %20 dikodkan semula, ia menjadi %2520.
Aksara beraksen seperti é, yang mengekod secara normal kepada %C3%A9, menjadi %25C3%25A9 apabila dikodkan dua kali oleh dua sistem yang berbeza dalam urutan. Belajar untuk melihat corak %25 dalam bar URL, log dan mesej ralat menjimatkan berjam-jam kerja penyahpepijatan yang mengecewakan dalam persekitaran pengeluaran di mana data mengalir melalui berbilang perkhidmatan.
Tempat pengekodan berganda diperkenalkan — kod pelanggan serta rangka kerja, ubah hala, proksi dan pembantu templat
Pengekodan dua kali memusnahkan kedua-dua kebolehbacaan dan keupayaan untuk sistem sisi pelayan untuk menghuraikan URL dengan betul. Fail bernama "file.pdf saya" menjadi "my%20file.pdf" apabila dikodkan dengan betul. Jika rentetan yang dikodkan dikodkan semula—mungkin melalui borang—ia menjadi "my%2520file.pdf".
Apabila pelayan menerima ini dan menyahkodnya sekali, ia melihat "my%20file.pdf" sebagai nama fail literal dan bukannya mengiktirafnya sebagai "file.pdf saya". Mana-mana aplikasi yang menjangkakan sahaja menerima pas penyahkod tunggal akan menerima hasil yang rosak. Lebih teruk lagi, pembangun yang menyahkod dua kali untuk menyelesaikan masalah pada nilai yang sahaja dikodkan sekali sebenarnya akan merosakkan data yang sah dengan pas nyahkod tambahan.
Contoh yang berjaya: menyahkod URL yang dikodkan dua kali ganda pada satu masa — perkara yang didedahkan oleh setiap pas dan masa untuk berhenti
Kod JavaScript sisi pelanggan dan lalai rangka kerja sisi pelayan ialah sumber pengekodan berganda yang paling biasa dalam sistem pengeluaran. Aplikasi JavaScript mungkin menggunakan encodeURIComponent pada nilai, kemudian hantar terus ke rangka kerja yang mengekod semua output rentetan secara lalai, dengan itu mengekodkan tanda peratus untuk kali kedua. Lapisan proksi terbalik yang bertujuan untuk membersihkan URL mungkin mengekod semula parameter yang telah dipraenkodkan daripada aplikasi bahagian belakang.
Ubah hala URL dibina dengan menggabungkan input yang dibekalkan pengguna dengan fungsi pembantu rangka kerja boleh mengekod pada kedua-dua langkah secara serentak. Contoh yang berjaya: pengguna menyerahkan "ujian&nilai" melalui borang HTML, pelayar mengekodnya sebagai "test%26value". Rangka kerja melihat teks peratus literal dan mengekodkannya, menghasilkan "test%2526value". Satu nyahkod memberikan "test%26value", masih salah.
Apabila pengekodan berganda disengajakan — URL dibawa ke dalam parameter pertanyaan URL yang lain
Pengekodan dwi dengan sengaja adalah sah dalam satu kes tertentu: apabila URL mesti bergerak dalam parameter pertanyaan URL yang lain. Aliran OAuth dan pautan kembali-ke log masuk kadangkala memerlukan satu URL yang lengkap di dalam satu lagi. URL dalam mesti dikodkan peratus sepenuhnya terlebih dahulu, kemudian keseluruhan rentetan yang dikodkan mesti dikodkan semula sebagai nilai parameter untuk URL luar.
Pengekodan berganda ini sengaja dan amat diperlukan dalam kes ini. Penghurai parameter luar menyahkod sekali, menghasilkan bahagian dalam yang masih dikodkan URL. Sistem dalaman kemudian menyahkod semula, memulihkan URL asal. Kunci kritikal ialah memahami niat dan mendokumentasikannya dengan jelas dalam ulasan kod untuk penyelenggara masa hadapan.
Kesilapan biasa — penyahkodan sehingga tiada apa-apa perubahan, yang merosakkan nilai yang secara sah mengandungi %25
Kesilapan klasik dan berbahaya ialah menyahkod berulang kali sehingga tiada apa-apa perubahan, yang akan merosakkan nilai yang secara sah mengandungi tanda peratus dalam data sebenar. Parameter seperti "diskaun%2525" (mewakili "%25" literal yang dikodkan sebagai nilai parameter, kemudian dikodkan semula untuk pengangkutan) adalah betul sepenuhnya mengikut reka bentuk. Menyahkodnya sekali menghasilkan "diskaun%25", yang masih betul. Menyahkodnya untuk kali kedua menghasilkan "diskaun%", yang salah dan kehilangan maklumat.
Pembangun mungkin menganggap "%25" adalah kesilapan dan menyahkod berulang kali, kehilangan tanda peratus. Sebaliknya, nyahkodkan seberapa kerap yang dikehendaki oleh seni bina anda: sekali untuk parameter, dua kali bersarang. Kira lapisan untuk mengetahui operasi penyahkod yang betul.
Perkara yang tidak dilindungi ini — HTML pengekodan entiti berlapis di atas URL, yang dikendalikan oleh entiti HTML
Kesilapan biasa termasuk pengekodan keseluruhan URL dengan encodeURIComponent dan kemudian mengharapkan garis miring dan titik bertindih berfungsi sebagai pembatas struktur, yang tidak boleh dilakukan selepas pengekodan. Satu lagi ralat yang kerap berlaku ialah mencampurkan piawaian pengekodan yang berbeza: sesetengah kod menggunakan pengekodan peratus setiap RFC 3986 dan kod lain menggunakan pengekodan borang dengan tanda tambah yang mewakili ruang. Nilai seperti "fail+saya" menjadi benar-benar samar-samar—ia mungkin bermaksud "fail saya" atau ia mungkin bermaksud teks literal "fail+saya" dengan tambah.
Jika pengekodan peratus menyentuh "fail+saya" dahulu, ia menjadi "fail%2B saya". Jika penyahkodan borang mengikut, mengharapkan tambah-sebagai-ruang, ia tetap salah. Konsisten merentas lapisan adalah penting. Setiap sistem mesti menggunakan piawai pengekodan yang sama, atau setiap lapisan mesti didokumenkan dengan jelas.
Bawa pulang: mengekod tepat sekali setiap lapisan — cara pengekod & penyahkod URL membolehkan anda menyahkod satu laluan pada satu masa dan melihat setiap hasil perantaraan
Selepas anda berjaya mengenal pasti pengekodan berganda yang berlaku dalam sistem pengeluaran, pembetulan bergantung sepenuhnya pada tempat pertindihan berlaku dalam saluran paip. Jika kedua-dua kod pelanggan dan rangka kerja sedang mengekod, alih keluar pengekodan daripada salah satu daripadanya sepenuhnya. Jika parameter bergerak melalui berbilang perkhidmatan bahagian belakang, jejak laluan lengkap melalui setiap perkhidmatan dan cari perkhidmatan yang mengekod apabila ia tidak sepatutnya berbuat demikian.
Uji pembetulan dengan teliti dengan menghantar data sampel melalui saluran paip hujung ke hujung yang lengkap dan sahkan data tiba sama sekali tidak berubah di destinasi. Dokumentasikan andaian pengekodan pada setiap sempadan dengan jelas: "titik akhir ini mengembalikan parameter yang dikodkan peratus" atau "perisian tengah ini menjangkakan UTF-8 mentah dan menggunakan pengekodan padanya". Sertakan bilangan pas nyahkod yang dijangkakan dalam dokumentasi itu untuk pembangun masa hadapan.