Gesaan dan skop
Perkhidmatan WebDAV membenarkan berbilang ikatan (bindings) antara koleksi. Klien menghantar PROPFIND dengan Depth: infinity; pelayan mencapai koleksi yang sudah berada pada laluan traversal dan mengembalikan 508. Terangkan maksud tepat 508, bezakannya daripada gelung percubaan semula (retry loop) generik, terangkan bila 208 Already Reported sesuai, cegah kepupusan sumber (resource exhaustion), dan tentukan tingkah laku klien.
Ini menggabungkan semantik status HTTP, traversal graf, keserasian protokol, dan sempadan keselamatan. RFC 5842 mentakrifkan 508 untuk menamatkan operasi kedalaman tak terhingga selepas gelung ditemui; IANA mendaftarkan 508 di bawah RFC 5842.
Perkara yang diuji oleh penemu duga
- Sama ada anda mengetahui 508 adalah mengenai ikatan WebDAV dan
Depth: infinity, bukan sebarang kegagalan pengalihan (redirect). - Sama ada anda boleh memodelkan sumber, ikatan URI, laluan, dan koleksi yang dilawati sebagai graf.
- Sama ada anda membezakan antara meneruskan dengan 208 bagi sumber yang berulang daripada menggagalkan keseluruhan operasi dengan 508 apabila klien tiada sokongan 208.
- Sama ada anda menyediakan penamatan deterministik, belanjawan, kebolehlihatan (observability), dan sandaran (fallback) dan bukannya hanya menyatakan "tambah set dilawati (visited set)."
Soalan untuk dijelaskan terlebih dahulu
- Kaedah dan nilai Depth apakah yang digunakan? Semantik melibatkan traversal rekursif.
- Adakah pelayan melaksanakan ikatan RFC 5842 dan mengiklankan keupayaan DAV? Adakah klien memahami 208?
- Adakah nod dinyahduplikasi mengikut ID sumber, URI kanonik, atau laluan ikatan? Satu sumber boleh mempunyai berbilang URI.
- Patutkah respons mengandungi hasil separa, atau adakah operasi mesti gagal secara atomik?
- Apakah belanjawan nod, saiz badan (body-size), masa CPU, dan kebenaran yang mengekang traversal mendalam yang berniat jahat?
Rangka kerja jawapan 30 saat
Mula-mula kekang maksudnya: 508 menyatakan bahawa pelayan menamatkan operasi WebDAV Depth: infinity selepas menemui kitaran ikatan; ia bukan status percubaan semula HTTP generik. Modelkan ikatan sebagai graf dan kesan tepi belakang (back edges) mengikut identiti sumber. Jika klien memahami 208, laporkan sumber sekali dan teruskan respons multistatus; jika tidak, 508 boleh menggagalkan operasi dengan jelas. Guna pakai belanjawan nod, kedalaman, bait, dan masa, rekod kitaran, dan hentikan percubaan semula automatik klien.
Jawapan langkah demi langkah
1. Modelkan graf sumber, bukan hanya rentetan URL
Nod ialah sumber atau koleksi dan tepi ialah ikatan. URI ialah laluan akses, bukan semestinya identiti sumber; satu sumber boleh mempunyai beberapa ikatan. Simpan ID sumber, laluan semasa, dan laluan induk untuk penyahduplikasian, audit, dan diagnosis.
2. Gunakan keadaan DFS atau BFS yang jelas
Kekalkan tindanan rekursi aktif dan set yang dilaporkan (reported set). Sebelum memasuki nod, semak sama ada ia sudah berada pada tindanan aktif; itu adalah tepi belakang (back edge). Mencapai sumber yang sama melalui laluan lain boleh dianggap sebagai sudah dilaporkan mengikut keupayaan protokol dan bukannya dikembangkan selama-lamanya.
visit(node, path):
if node in activePath: return CYCLE
if node in reported: return ALREADY_REPORTED
budget.consume(node)
activePath.add(node)
report(node)
for child in children(node): visit(child, path + child)
activePath.remove(node)activePath mengenal pasti kitaran sebenar, manakala reported menghalang output pendua melalui berbilang ikatan. Satu set tidak boleh mewakili kedua-dua kes dengan selamat.
3. Pilih 208 atau 508 daripada keupayaan klien
Jika klien mengiklankan sokongan untuk sambungan ikatan dan 208, pelayan boleh mengembalikan kemunculan pertama secara normal, menandakan ikatan terkemudian sebagai Already Reported dalam respons multistatus, dan mengetepikan keturunan (descendants) mereka. Jika klien tidak memahami 208, RFC 5842 menyediakan laluan keserasian di mana operasi kedalaman tak terhingga gagal dengan 508. Jangan samarkan kegagalan sebagai 200.
4. Tetapkan belanjawan deterministik dan sempadan keselamatan
Malah graf tak berkitar (acyclic graph) boleh menghabiskan ruang CPU, memori, atau respons. Tetapkan nod maksimum, panjang laluan aktif, jumlah bait, masa jam dinding (wall-clock time), dan keserentakan (concurrency). Apabila belanjawan habis, rekod sebabnya dan kembalikan kegagalan dibenarkan yang jelas dan bukannya mencuba semula. Semak kebenaran merentasi ikatan penyewa (tenant) supaya nod tersembunyi tidak bocor melalui respons multistatus.
5. Kendalikan penulisan dan perubahan topologi serentak
BIND, REBIND, dan UNBIND mengubah graf. Lakukan traversal pada snapshot atau versi yang konsisten supaya perubahan topologi tidak membatalkan pengesanan semasa operasi sedang berjalan. Sebelum membuat ikatan yang mungkin berkitar, jalankan semakan kebolehcapaian (reachability check) atau perlukan prasyarat membenarkan kitaran yang jelas; simpan semakan dan komit dalam satu sempadan transaksi.
6. Buat klien menghentikan percubaan semula yang memudaratkan
508 bermaksud operasi yang diminta telah gagal; klien tidak seharusnya menganggapnya seperti 503 dan mencuba semula secara membuta tuli dengan backoff. Baca badan dan ID korelasi, kurangkan kedalaman, baiki ikatan, atau buat pertanyaan tentang keupayaan. Proksi yang memetakan 508 ke dalam ralat biasa mesti mengekalkan status asal dan medan diagnostik.
Contoh jawapan berkualiti tinggi
Saya akan memodelkan ikatan sebagai graf berarah dan membezakan identiti sumber daripada URI akses. Untuk Depth: infinity, gunakan tindanan rekursi aktif untuk mengesan tepi belakang dan set yang dilaporkan untuk menyekat output pendua apabila berbilang ikatan mencapai sumber yang sama; set-set tersebut mempunyai maksud yang berbeza. Rentasi paparan yang konsisten dengan belanjawan nod, kedalaman, bait respons, dan masa.
Apabila klien mengiklankan sokongan RFC 5842 dan 208, kembalikan sumber pertama dalam respons multistatus 207, tandakan pendua terkemudian sebagai Already Reported, dan ketepikan keturunan mereka. Bagi klien yang tidak memahami 208, tamatkan keseluruhan operasi kedalaman tak terhingga dengan 508 seperti yang ditentukan oleh laluan keserasian. 508 bukan ralat percubaan semula generik, jadi klien harus menghentikan percubaan semula automatik dan membaiki graf atau mengurangkan kedalaman. Kuat-kuasakan kebenaran, metrik, dan log korelasi untuk mengelakkan kitaran dan traversal mendalam daripada menjadi vektor DoS.
Mod kegagalan biasa
- Memanggil 508 sebagai kepupusan percubaan semula proksi terbalik atau gelung pengalihan URL generik.
- Menyahduplikasi hanya mengikut rentetan URI dan terlepas pandang berbilang ikatan kepada satu sumber.
- Menggunakan hanya satu global visited set, mengelirukan sumber dikongsi dengan tepi belakang, atau kehilangan perbezaan 208/508.
- Menerima
Depth: infinitytanpa belanjawan nod, bait, masa, dan kebenaran. - Mencuba semula secara automatik pada 508 dan berulang kali menghabiskan sumber pada topologi yang sama.
- Melupakan rundingan keupayaan, respons multistatus 207, atau perlumbaan tulis (write races).
Soalan susulan dan rujukan jawapan
Apakah sempadan antara 508 dan 208?
208 melaporkan sumber yang dilihat sebelum ini apabila klien memahami sambungan ikatan, membolehkan baki operasi diteruskan. 508 menamatkan keseluruhan operasi kedalaman tak terhingga selepas kitaran berlaku, biasanya untuk klien yang tidak boleh menggunakan 208.
Mengapa tidak menggunakan hanya URI sebagai visited key?
Beberapa URI boleh diikat kepada satu sumber, jadi penjejakan berasaskan URI sahaja akan mengulangi traversal. Laluan masih penting untuk diagnosis, jadi kekalkan kedua-dua identiti sumber dan konteks laluan.
Bagaimana anda mengelakkan TOCTOU antara semakan dan penulisan?
Jalankan pengesahan kebolehcapaian dan komit ikatan dalam satu transaksi atau snapshot berversi. Jika keatoman (atomicity) merangkumi nod, gagalkan pada syarat versi dan semak semula.
Patutkah klien mencuba semula selepas 508?
Bukan secara membuta tuli. Topologi semasa menyebabkan operasi gagal; kurangkan kedalaman, baiki kitaran, atau dapatkan maklumat keupayaan. Cuba semula hanya selepas topologi telah diubah secara sengaja.
Bagaimana anda menguji pengesanan kitaran positif palsu?
Gunakan lekapan (fixtures) untuk DAG tak berkitar, sumber dikongsi, kitaran ikatan, dan had kedalaman. Buat penegasan (assert) pada kiraan hasil, kod status, belanjawan traversal, log audit, dan had saiz respons.
Adakah 508 terpakai untuk setiap kitaran panggilan perkhidmatan mikro?
Tidak. Maksud piawainya berasal daripada WebDAV RFC 5842. Gelung perkhidmatan lain memerlukan kontrak ralat mereka sendiri; mengekalkan 5xx tidak menjadikan respons tersebut mempunyai semantik WebDAV 508.