Ciri Pattern Matching Python Membolehkan Suntikan Kod Berbahaya Melalui Abstract Base Classes

Pasukan Komuniti BigGo
Ciri Pattern Matching Python Membolehkan Suntikan Kod Berbahaya Melalui Abstract Base Classes

Ciri pattern matching Python , yang diperkenalkan dalam versi 3.10, mempunyai kelemahan yang tidak dijangka yang membolehkan pembangun merampas penyata match melalui Abstract Base Classes (ABCs) . Penemuan ini telah mencetuskan perdebatan sengit dalam komuniti Python mengenai keputusan reka bentuk di sebalik mekanisme kawalan aliran terbaru bahasa ini.

Garis Masa Kerentanan Pattern Matching Python

  • Python 3.10: Pattern matching diperkenalkan dengan penyata match/case
  • Pattern matching menggunakan pemeriksaan isinstance() yang menghormati kaedah __subclasshook__ ABC
  • ABC boleh menentukan logik tersuai untuk penentuan subclass
  • Python 3.8: Protocols diperkenalkan sebagai alternatif yang lebih selamat untuk structural typing
  • Python 2.6: ABC dengan __subclasshook__ mula tersedia (11 tahun sebelum Protocols)

Pintu Belakang Tersembunyi dalam Pattern Matching

Isu ini berpunca daripada cara pattern matching Python berinteraksi dengan Abstract Base Classes dan kaedah __subclasshook__ mereka. Kaedah ini membolehkan ABCs menentukan logik tersuai untuk menentukan sama ada sesuatu kelas dikira sebagai subkelas, walaupun kelas sasaran tidak mempunyai pengetahuan tentang ABC . Apabila pattern matching memeriksa isinstance(obj, class), ia menghormati hook tersuai ini, mewujudkan peluang untuk tingkah laku yang tidak dijangka.

Seorang pembangun boleh mencipta ABC yang memadankan objek berdasarkan syarat-syarat sewenang-wenangnya - sama ada mereka mempunyai atribut tertentu, nama mereka adalah palindrom, atau bahkan berdasarkan input pengguna. Ini bermakna penyata match yang kelihatan memeriksa jenis tertentu sebenarnya mungkin melaksanakan logik yang sama sekali berbeza di sebalik tabir.

Abstract Base Classes (ABCs): Kelas Python yang menentukan antara muka yang harus dilaksanakan oleh kelas lain, membolehkan pemeriksaan jenis yang fleksibel tanpa pewarisan eksplisit.

Kebimbangan Komuniti Mengenai Reka Bentuk Bahasa

Komuniti Python telah menyatakan kebimbangan yang ketara mengenai tingkah laku ini, terutamanya berkaitan kebolehbacaan dan kebolehselenggaraan kod. Ramai pembangun bimbang bahawa ciri ini mewujudkan tindakan menakutkan pada jarak jauh di mana penyahpepijatan menjadi hampir mustahil apabila ABCs dari bahagian berbeza dalam pangkalan kod berinteraksi secara tidak dijangka.

Kritikan yang lebih luas meluas kepada pelaksanaan pattern matching Python itu sendiri. Tidak seperti bahasa berfungsi yang mengendalikan pattern matching dengan elegan, versi Python telah menarik kritikan kerana tingkah lakunya yang tidak konsisten dengan skop pembolehubah dan reka bentuknya yang berasaskan penyata dan bukannya berasaskan ungkapan. Komuniti telah menyatakan bahawa pemadanan pada pemalar berbanding pembolehubah menghasilkan hasil yang sangat berbeza, melanggar jangkaan asas tentang bagaimana kod Python sepatutnya berkelakuan.

Skop pembolehubah: Bagaimana bahasa pengaturcaraan menentukan di mana pembolehubah boleh diakses dan diubah suai dalam kod.

Isu-Isu yang Dikenal Pasti Komuniti dengan Pattern Matching Python

  • Skop Pembolehubah: Pembolehubah bocor keluar dari blok match, melanggar jangkaan
  • Ketidakkonsistenan Sintaks: case 404 berbanding case not_found berkelakuan berbeza sepenuhnya
  • Statement berbanding Expression: Tidak seperti bahasa lain, pattern matching Python adalah berasaskan statement
  • Fleksibiliti Terhad: Tidak boleh menggunakan pembolehubah secara langsung tanpa penyelesaian alternatif
  • Indentasi Berganda: Memerlukan tahap indentasi tambahan berbanding konstruk lain
  • Tingkah Laku Caching: Keputusan __subclasshook__ di-cache, mengehadkan tingkah laku dinamik

Pendekatan Alternatif dan Penyelesaian Sementara

Walaupun berpotensi untuk disalahgunakan, sesetengah ahli komuniti melihat aplikasi yang sah untuk fungsi ini. Ciri ini pada asasnya membolehkan structural typing - memeriksa sama ada objek melaksanakan antara muka tertentu tanpa pewarisan eksplisit. Ini amat berharga sebelum Python 3.8 memperkenalkan Protocols , yang menyediakan cara yang lebih selamat untuk mencapai hasil yang serupa.

Walau bagaimanapun, konsensus kekal sangat menentang penggunaan teknik ini dalam kod pengeluaran. Komuniti menekankan bahawa walaupun secara teknikal mungkin, pendekatan sedemikian melanggar prinsip kejutan paling sedikit dan menjadikan kod jauh lebih sukar untuk diselenggara dan dinyahpepijat.

Perdebatan Pattern Matching yang Lebih Luas

Penemuan ini telah mencetuskan semula perbincangan mengenai pilihan reka bentuk pattern matching Python . Ramai pembangun merasakan ciri tersebut dilaksanakan dengan buruk berbanding dengan fungsi serupa dalam bahasa lain, memetik isu seperti keperluan indentasi berganda, sokongan ungkapan terhad, dan peraturan sintaks yang tidak konsisten.

Ciri pattern matching, secara keseluruhannya, direka bentuk dengan munasabah, dan orang akan mengharapkannya berkelakuan dengan cara yang munasabah. Manakala subclasshook adalah sihir yang sangat gelap.

Reaksi komuniti menyerlahkan kebimbangan yang semakin meningkat mengenai penambahan bahasa terkini Python . Sesetengah pembangun berpendapat bahawa ciri seperti pattern matching menambah kerumitan tanpa memberikan faedah yang berkadar, terutamanya apabila alternatif yang lebih mudah seperti kamus atau penyata if sering memadai.

Walaupun teknik merampas ABC ini menunjukkan fleksibiliti Python , ia juga berfungsi sebagai kisah amaran mengenai akibat yang tidak diingini daripada menggabungkan ciri bahasa yang berkuasa. Cadangan kuat komuniti Python kekal jelas: elakkan teknik ini dalam kod pengeluaran untuk mengekalkan kebolehbacaan dan mencegah mimpi ngeri penyahpepijatan.

Rujukan: CRIMES WITH PYTHON'S PATTERN MATCHING