Alat pengembang · URL encoder & decoder
Pengkodean URL ganda: bagaimana %2520 terjadi dan cara mendeteksi dan membatalkannya
· Cara kerjanya
pengkodean url javascript alur kerja pengembang melakukan debug
%2520 dalam URL berarti spasi dikodekan dua kali. Postingan ini menjelaskan kesalahan pipeline yang menyebabkannya, cara mengenali tanda tangan, dan berapa banyak proses dekode yang aman.
Pengkodean ganda URL: ketika %2520 berarti spasi melewati dua pembuat enkode
Nama file yang muncul sebagai "my%20file.pdf" dan bukan "my file.pdf" menandakan pengkodean ganda: spasi dikodekan menjadi %20, lalu tanda persen itu sendiri dikodekan menjadi %25, menghasilkan %2520 di URL terakhir. Setiap lapisan sistem seperti kode klien, kerangka web, atau proksi terbalik mungkin dikodekan satu kali. Ketika dua lapisan terpisah dikodekan, satu karakter menjadi hancur.
Permukaan pengkodean ganda paling sering terjadi pada rantai pengalihan dan sistem templating yang kompleks. Pengembang mungkin menghasilkan URL yang dikodekan di dalam kerangka kerja yang mengkodekan semua output secara default. Proksi terbalik atau jaringan pengiriman konten dapat mengkodekan ulang URL yang telah dikodekan dari sistem backend. Parameter yang berisi nilai yang sudah dikodekan akan dikodekan lagi sebelum disarangkan di dalam struktur URL lainnya.
Mengapa %25 adalah petunjuknya — tanda persen itu sendiri dikodekan, sehingga %20 menjadi %2520 dan %C3%A9 menjadi %25C3%25A9
Tanda pengkodean ganda adalah %25 muncul di tempat yang biasanya Anda harapkan melihat tanda persen tunggal di URL atau data. Dalam URL yang dikodekan secara normal, Anda tidak akan pernah melihat %25 kecuali mengirimkan "%25" secara literal. Jika spasi yang dikodekan sebagai %20 dikodekan lagi, maka menjadi %2520.
Karakter beraksen seperti é, yang biasanya dikodekan ke %C3%A9, menjadi %25C3%25A9 ketika dikodekan dua kali oleh dua sistem berbeda secara berurutan. Mempelajari cara mengenali pola %25 di bilah, log, dan pesan kesalahan URL menghemat waktu berjam-jam dalam pekerjaan debugging yang membuat frustrasi di lingkungan produksi tempat data mengalir melalui beberapa layanan.
Di mana pengkodean ganda diperkenalkan — kode klien ditambah kerangka kerja, pengalihan, proxy, dan pembantu templat
Pengkodean ganda merusak keterbacaan dan kemampuan sistem sisi server untuk mengurai URL dengan benar. File bernama "myfile.pdf" menjadi "my%20file.pdf" jika dikodekan dengan benar. Jika string yang disandikan dikodekan ulang—mungkin dengan bentuk—itu menjadi "my%2520file.pdf".
Ketika server menerima ini dan menerjemahkannya satu kali, server akan melihat "my%20file.pdf" sebagai nama file literal daripada mengenalinya sebagai "file.pdf saya". Aplikasi apa pun yang mengharapkan hanya menerima satu sandi dekode akan menerima hasil yang rusak. Lebih buruk lagi, pengembang yang mendekode dua kali untuk memperbaiki masalah pada nilai yang hanya dikodekan satu kali justru akan merusak data sah dengan pass decode tambahan.
Contoh praktis: mendekode URL yang dikodekan ganda satu per satu - apa yang diungkapkan setiap pass dan kapan harus berhenti
Kode JavaScript sisi klien dan default kerangka sisi server adalah sumber paling umum dari pengkodean ganda yang tidak disengaja dalam sistem produksi. Aplikasi JavaScript mungkin menggunakan encodeURIComponent pada suatu nilai, lalu meneruskannya langsung ke kerangka kerja yang mengkodekan semua output string secara default, sehingga mengkodekan tanda persen untuk kedua kalinya. Lapisan proxy terbalik yang dimaksudkan untuk membersihkan URL mungkin mengkodekan ulang parameter yang sudah dikodekan sebelumnya dari aplikasi backend.
Pengalihan URL yang dibuat dengan menggabungkan masukan yang disediakan pengguna dengan fungsi pembantu kerangka kerja dapat menyandikan kedua langkah secara bersamaan. Contoh praktis: pengguna mengirimkan "test&value" melalui formulir HTML, browser mengkodekannya sebagai "test%26value". Kerangka kerja ini melihat teks persen literal dan menyandikannya, menghasilkan "nilai uji%2526". Satu decode memberikan "test%26value", masih salah.
Ketika pengkodean ganda disengaja — URL dibawa ke dalam parameter kueri URL lain
Pengkodean ganda yang disengaja valid dalam satu kasus tertentu: ketika URL harus berpindah ke dalam parameter kueri URL lainnya. Alur OAuth dan tautan kembali ke proses masuk terkadang memerlukan satu URL yang lengkap di dalam yang lain. URL bagian dalam harus dikodekan persen sepenuhnya terlebih dahulu, kemudian seluruh string yang dikodekan harus dikodekan lagi sebagai nilai parameter untuk URL bagian luar.
Pengkodean ganda ini disengaja dan mutlak diperlukan dalam kasus ini. Pengurai parameter luar mendekode satu kali, menghasilkan URL dalam yang masih dikodekan. Sistem bagian dalam kemudian menerjemahkan kode lagi, memulihkan URL asli. Kunci pentingnya adalah memahami maksud dan mendokumentasikannya dengan jelas dalam komentar kode untuk pengelola di masa mendatang.
Kesalahan umum — mendekode hingga tidak ada perubahan, yang merusak nilai yang secara sah berisi %25
Kesalahan klasik dan berbahaya adalah mendekode berulang kali hingga tidak ada perubahan, yang akan merusak nilai yang secara sah mengandung tanda persen pada data sebenarnya. Parameter seperti "diskon%2525" (mewakili "%25" literal yang dikodekan sebagai nilai parameter, lalu dikodekan lagi untuk transportasi) sepenuhnya benar menurut desainnya. Menguraikannya sekali menghasilkan "diskon%25", yang masih benar. Menguraikannya untuk kedua kalinya menghasilkan "diskon%", yang salah dan kehilangan informasi.
Pengembang mungkin berasumsi "%25" adalah kesalahan dan melakukan dekode berulang kali, sehingga kehilangan tanda persen. Sebaliknya, dekode sebanyak yang diminta arsitektur Anda: sekali untuk parameter, dua kali bertingkat. Hitung lapisan untuk mengetahui operasi dekode yang tepat.
Apa yang tidak tercakup dalam hal ini — pengkodean entitas HTML berlapis di atas URL, yang ditangani oleh escaper entitas HTML
Kesalahan umum termasuk mengkodekan seluruh URL dengan encodeURIComponent dan kemudian mengharapkan garis miring dan titik dua berfungsi sebagai pembatas struktural, yang tidak dapat mereka lakukan setelah pengkodean. Kesalahan umum lainnya adalah mencampurkan standar pengkodean yang berbeda: beberapa kode menggunakan pengkodean persen per RFC 3986 dan kode lainnya menggunakan pengkodean bentuk dengan tanda tambah yang mewakili spasi. Nilai seperti "file+saya" menjadi benar-benar ambigu—ini mungkin berarti "file saya" atau mungkin berarti teks literal "file+saya" dengan tanda plus.
Jika pengkodean persen menyentuh "file+saya" terlebih dahulu, itu menjadi "file%2Bsaya". Jika penguraian kode formulir mengikuti, mengharapkan plus-as-spasi, itu tetap salah. Konsistensi antar lapisan sangatlah penting. Setiap sistem harus menggunakan standar pengkodean yang sama, atau setiap lapisan harus didokumentasikan secara eksplisit.
Kesimpulan: encode tepat satu kali per lapisan — bagaimana encoder & decoder URL memungkinkan Anda mendekode satu per satu dan melihat setiap hasil antara
Setelah Anda berhasil mengidentifikasi pengkodean ganda yang terjadi dalam sistem produksi, perbaikannya bergantung sepenuhnya pada tempat terjadinya duplikasi dalam pipeline. Jika kode klien dan kerangka kerja sedang dikodekan, hapus sepenuhnya pengkodean dari salah satunya. Jika suatu parameter melewati beberapa layanan backend, lacak jalur lengkap melalui setiap layanan dan temukan layanan mana yang melakukan pengkodean padahal seharusnya tidak melakukan hal tersebut.
Uji perbaikan secara menyeluruh dengan meneruskan data sampel melalui alur end-to-end yang lengkap dan verifikasi bahwa data benar-benar tidak berubah di tujuan. Dokumentasikan asumsi pengkodean pada setiap batas dengan jelas: "titik akhir ini mengembalikan parameter yang dikodekan dalam persen" atau "middleware ini mengharapkan UTF-8 mentah dan menerapkan pengkodean padanya". Sertakan jumlah lintasan dekode yang diharapkan dalam dokumentasi tersebut untuk pengembang masa depan.