Bahasa Melayu

Alat pembangun · URL pengekod & penyahkod

URIError: URI cacat — sebab decodeURIComponent melontar dan cara membetulkannya

· Bagaimana ia berfungsi

pengekodan url javascript pengendalian ralat

Tanda peratus diikuti dengan digit heksadesimal tidak sah menyebabkan pengecualian URIError
Ilustrasi vektor ToolAcre asal

decodeURIComponent melontar apabila tanda peratus tidak diikuti oleh dua digit hex, atau apabila bait yang dinyahkod tidak sah UTF-8. Siaran ini menunjukkan input yang mencetuskannya dan cara menyahkod secara defensif.

Tanda peratus yang ranap — mengapa "100% off" memecahkan decodeURIComponent

Borang mengumpulkan kod diskaun "100% diskaun". JavaScript menghantar ini untuk menyahkodURIKomponen dalam penyahkod URL. Fungsi membuang URIError: URI cacat. Tanda peratus tidak diikuti oleh dua digit heksadesimal. Ini melanggar peraturan pengekodan peratus sepenuhnya. decodeURIComponent menjangkakan setiap % akan memulakan triplet seperti %20 atau %C3. % tunggal ialah ralat sintaks yang menghentikan pelaksanaan serta-merta dan membuang ralat.

Menangkap ralat ini dengan selamat menghalang ranap aplikasi sepenuhnya. URL tiba daripada input pengguna, ubah hala, kod QR dan e-mel. Typo kerap berlaku. Laporan ranap sistem dengan URIError memberitahu anda tempat untuk menyiasat dengan cepat. Penyahkodan pertahanan memastikan aplikasi berjalan dan log ralat menjadi berguna untuk penyahpepijatan.

Dua jenis kegagalan — hex escape yang salah bentuk dan jujukan UTF-8 bait tidak sah

decodeURIComponent membuang dalam dua situasi. Pertama: urutan pelarian yang cacat. Satu peratus tidak diikuti oleh dua digit heks (0-9, A-F, a-f). Contoh: %ZZ, %2, %2g. Kedua: triplet sah seperti %E9 penyahkodan kepada UTF-8 bait tidak sah. Yang pertama ialah ralat format. Yang kedua ialah ralat semantik. Kedua-duanya membaling dan menghentikan pelaksanaan serta-merta.

UTF-8 mempunyai peraturan ketat tentang jujukan bait. Bait 0x80–0xFF sahaja muncul dalam jujukan berbilang bait. Satu %E9 tidak boleh sah UTF-8 sahaja. Byte yatim piatu ini mencetuskan ralat. Kesilapan format adalah jelas. Ralat semantik adalah halus tetapi sama nyata. Kedua-dua kes memerlukan pengendalian try/catch dalam kod pengeluaran.

Pengekodan bait tunggal warisan — apabila %E9 sahaja melontar tetapi %C3%A9 bertahan

Kekeliruan berpunca daripada sejarah standard web. Halaman lama menggunakan bahasa Latin-1 dan bukannya UTF-8. Dalam bahasa Latin-1, %E9 diwakili é. Pelayar moden menggunakan UTF-8 secara eksklusif. UTF-8 mengekod adalah sebagai %C3%A9. Penyahkod moden mengharapkan UTF-8 dan menolak %E9 sebagai salah bentuk. Ini adalah tingkah laku yang betul. Ralat menandakan masalah dengan data sumber.

Konsensus moden: UTF-8 di mana-mana sahaja. Piawaian URL menentukan UTF-8. Semua pelayar semasa menggunakan UTF-8. Jika anda menemui %E9 daripada sistem lama, tangkap ralat dan sandaran kepada rentetan mentah. Jangan nyahkod sebagai Latin-1 dalam kod moden. Siasat dari mana data itu berasal.

Tiga input, tiga mesej ralat — bagaimana enjin berbeza pada rentetan putus yang sama

Enjin pelayar menolak input cacat secara konsisten tetapi ralat perkataan secara berbeza. Chrome melaporkan "URI salah bentuk". Firefox melaporkan "urutan URI rosak". Laporan Safari "tidak boleh menukar yang tidak ditentukan kepada objek". Ketiga-tiga enjin menolak input yang sama. Perkataan mesej yang tepat tidak diseragamkan merentas enjin atau versi yang berbeza. Jangan sekali-kali bergantung pada teks ralat untuk membimbing logik kod.

Jangan sekali-kali padanan rentetan mesej ralat untuk keputusan program. Sentiasa tangkap URIError mengikut jenis. Fungsi decodeUrl membungkus decodeURIComponent dan menyediakan kod yang konsisten INVALID_PERCENT_ENCODING. Ini menamakan kedudukan masalah yang tepat. Ia berfungsi merentasi masa jalan kerana ia tidak bergantung pada variasi perkataan enjin. Pendekatan ini lebih dipercayai dan boleh diselenggara.

Membaca pengecualian dengan selamat — cuba/catch, pengesahan dan corak sandaran

Corak pertahanan paling mudah: bungkus decodeURIComponent dalam try/catch. Jika ia melontar, gunakan rentetan mentah atau aksara gantian. Ini menghalang input yang cacat daripada ranap. Untuk nilai pertanyaan, tunjukkan borang berkod URL. Untuk teks yang menghadap pengguna, masukkan aksara gantian. Ini menghalang input buruk daripada memecahkan aplikasi dan mengekalkan kestabilan.

Pra-sahkan dengan ungkapan biasa untuk kelajuan dan keselamatan. Semak bahawa input mengandungi sahaja %XX triplet yang sah sebelum menyahkod. Corak /%[0-9A-Fa-f]{2}/g menangkap pelarian yang sah; apa-apa yang tidak sepadan adalah tidak sah. Ralat format gagal dengan cepat pada sampah yang jelas. UTF-8 ralat masih perlu dicuba/catch. Bersama-sama ini menyediakan perlindungan pertahanan menyeluruh terhadap ralat.

Kegagalan senyap menyembunyikan pepijat — mengapa penyahkod buta sama berisiko seperti pengekodan rosak

Risiko halus: penyahkod tidak membuang tetapi secara senyap menghasilkan teks yang salah. Kod lama menggunakan daun unescape yang ditamatkan tidak sah UTF-8 dalam ingatan. Teks kelihatan baik pada skrin sehingga mencapai sistem yang mengesahkan UTF-8 dengan ketat. Kod moden membuang dan bukannya merosakkan secara senyap. Pengecualian adalah lebih jelas dan selamat daripada rasuah data senyap yang merebak ke hiliran.

Andaikan input pengguna salah bentuk. Sentiasa bungkus panggilan. Ralat log dengan input asal untuk nyahpepijat. Jangan sekali-kali menganggap setiap % adalah sah. Taip dan pemangkasan mencipta pelarian yang tidak lengkap. Anggap sebagai ralat data, bukan ralat logik. Kod pertahanan bertahan dengan input buruk dengan anggun dan memastikan sistem boleh dipercayai.

Alat sebenar yang langkau — gelagat rangka kerja sebelah pelayan dan pemulihan ralat

Rangka kerja pelayan mengendalikan pengekodan salah bentuk dengan lebih lembut daripada pelayar. Ruby, Python dan PHP menawarkan konfigurasi untuk mengendalikan escape tidak sah dalam URL. Sesetengah menggantikan aksara gantian secara automatik. Yang lain menggugurkan bait secara senyap. Beberapa pengecualian lontaran seperti JavaScript lakukan. Tingkah laku sebenar berbeza mengikut rangka kerja dan tetapan konfigurasi yang dipilih oleh pembangun.

Artikel ini merangkumi tingkah laku JavaScript pelayar sahaja. Jika nilai tiba daripada API pelayan, pelayan sudah menyahkod atau melangkau ralat sebelum dihantar. Pelayan boleh menjadi lebih pemaaf daripada pelanggan. Apabila menulis kontrak API, nyatakan sama ada nilai adalah mentah atau pra-dekod. URL rentetan pertanyaan harus tiba dikodkan peratus; JSON boleh tiba dengan pra-nyahkod.

Sahkan awal — menggunakan URL pengekod & penyahkod untuk menyemak rentetan yang mencurigakan dahulu

Sebelum menghantar URL yang mencurigakan kepada decodeURIComponent, tampalkan ke dalam URL pengekod & penyahkod. Alat ini menunjukkan pengekodan yang tepat, mengesan pelarian yang cacat dan menerangkan ralat tanpa merosakkan aplikasi anda. Uji dengan %ZZ, %E9 dan 100% untuk melihat kegagalan yang berbeza dan mesej ralat yang tepat. Ini mengambil masa beberapa saat dan membina keyakinan.

Sahkan awal, tangkap ralat dengan baik dan catatkan apa yang rosak. Penyahkod pertahanan serta alat ujian memastikan aplikasi berjalan dan boleh nyahpepijat. URL pengekod & penyahkod menukar "URI cacat" kepada maklumat yang boleh diambil tindakan yang boleh anda gunakan serta-merta. Gunakan corak ini pada penyahkod anda sendiri untuk daya tahan dan kebolehselenggaraan dalam persekitaran pengeluaran.