प्रतिनिधि इंटरव्यू विषय

सामान्य साक्षात्कार: HTTP 508 Loop Detected कब सही होता है, और आप WebDAV ट्रैवर्सल साइकल को कैसे रोकते हैं?

सामान्यमध्यम
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक WebDAV सेवा Depth infinity PROPFIND को प्रोसेस करते समय 508 लौटाती है। इसके सेमांटिक्स समझाएं और साइकल डिटेक्शन, रिस्पॉन्स चयन, क्लाइंट संगतता और DoS नियंत्रण डिज़ाइन करें।

प्रॉम्प्ट और दायरा

एक WebDAV सेवा कलेक्शन्स के बीच एकाधिक बाइंडिंग्स की अनुमति देती है। एक क्लाइंट Depth: infinity के साथ एक PROPFIND भेजता है; सर्वर ट्रैवर्सल पथ पर पहले से मौजूद कलेक्शन तक पहुँचता है और 508 लौटाता है। 508 का सटीक अर्थ समझाएं, इसे एक सामान्य पुनः प्रयास (retry) लूप से अलग करें, बताएं कि 208 Already Reported कब उपयुक्त है, संसाधन समाप्ति (resource exhaustion) को रोकें, और क्लाइंट व्यवहार को परिभाषित करें।

यह HTTP स्थिति सेमांटिक्स, ग्राफ़ ट्रैवर्सल, प्रोटोकॉल संगतता और सुरक्षा सीमाओं को जोड़ता है। RFC 5842 एक लूप का सामना करने के बाद एक अनंत-गहराई (infinite-depth) ऑपरेशन को समाप्त करने के लिए 508 को परिभाषित करता है; IANA RFC 5842 के तहत 508 को पंजीकृत करता है।

साक्षात्कारकर्ता क्या परीक्षण कर रहा है

  • क्या आप जानते हैं कि 508 WebDAV बाइंडिंग्स और Depth: infinity के बारे में है, न कि किसी रीडायरेक्ट विफलता के बारे में।
  • क्या आप संसाधनों, URI बाइंडिंग्स, पाथ्स और विज़िट किए गए कलेक्शन्स को एक ग्राफ़ के रूप में मॉडल कर सकते हैं।
  • क्या आप किसी दोहराए गए संसाधन के लिए 208 के साथ जारी रखने और क्लाइंट में 208 समर्थन की कमी होने पर 508 के साथ पूरे ऑपरेशन को विफल करने के बीच अंतर करते हैं।
  • क्या आप केवल "एक विज़िट किया गया सेट जोड़ें" कहने के बजाय नियतात्मक समाप्ति (deterministic termination), बजट, अवलोकनीयता (observability), और फ़ॉलबैक प्रदान करते हैं।

पहले स्पष्ट करने योग्य प्रश्न

  1. किस मेथड और Depth मान का उपयोग किया जाता है? सेमांटिक्स पुनरावर्ती (recursive) ट्रैवर्सल से संबंधित हैं।
  2. क्या सर्वर RFC 5842 बाइंडिंग्स को लागू करता है और DAV क्षमताओं का विज्ञापन करता है? क्या क्लाइंट 208 को समझता है?
  3. क्या किसी नोड को रिसोर्स ID, कैनोनिकल URI, या बाइंडिंग पाथ द्वारा डिडुप्लिकेट किया जाता है? एक संसाधन के कई URIs हो सकते हैं।
  4. क्या रिस्पॉन्स में आंशिक परिणाम होने चाहिए, या ऑपरेशन को परमाणु रूप से (atomically) विफल होना चाहिए?
  5. शत्रुतापूर्ण गहरे ट्रैवर्सल को सीमित करने के लिए कौन से नोड, बॉडी-साइज़, CPU-समय और ऑथराइजेशन बजट हैं?

30-सेकंड का उत्तर ढांचा

पहले अर्थ को सीमित करें: 508 कहता है कि एक सर्वर ने बाइंडिंग साइकल खोजने के बाद एक WebDAV Depth: infinity ऑपरेशन को समाप्त कर दिया; यह एक सामान्य HTTP पुनः प्रयास स्थिति नहीं है। बाइंडिंग्स को एक ग्राफ़ के रूप में मॉडल करें और संसाधन पहचान द्वारा बैक किनारों (back edges) का पता लगाएं। यदि क्लाइंट 208 को समझता है, तो संसाधन को एक बार रिपोर्ट करें और एक मल्टीस्टेटस रिस्पॉन्स जारी रखें; अन्यथा 508 ऑपरेशन को स्पष्ट रूप से विफल कर सकता है। नोड, गहराई, बाइट और समय बजट लागू करें, साइकल को रिकॉर्ड करें, और स्वचालित क्लाइंट पुनः प्रयासों को रोकें।

चरण-दर-चरण उत्तर

1. केवल URL स्ट्रिंग्स ही नहीं, रिसोर्स ग्राफ़ को मॉडल करें

नोड्स संसाधन या कलेक्शन्स हैं और किनारे बाइंडिंग्स हैं। एक URI एक एक्सेस पाथ है, आवश्यक रूप से संसाधन की पहचान नहीं; एक संसाधन की कई बाइंडिंग्स हो सकती हैं। डिडुप्लिकेशन, ऑडिट और डायग्नोसिस के लिए रिसोर्स ID, वर्तमान पाथ और पैरेंट पाथ रखें।

2. स्पष्ट DFS या BFS स्थिति का उपयोग करें

सक्रिय रिकर्सन स्टैक और एक रिपोर्ट किए गए सेट को बनाए रखें। किसी नोड में प्रवेश करने से पहले, जांचें कि क्या वह सक्रिय स्टैक पर पहले से मौजूद है; वह एक बैक एज है। किसी अन्य पाथ के माध्यम से उसी संसाधन तक पहुँचने को हमेशा के लिए विस्तारित करने के बजाय प्रोटोकॉल क्षमता के अनुसार पहले से रिपोर्ट किए गए के रूप में माना जा सकता है।

text
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 एक वास्तविक साइकल की पहचान करता है, जबकि reported कई बाइंडिंग्स के माध्यम से डुप्लिकेट आउटपुट को रोकता है। एक सेट दोनों मामलों को सुरक्षित रूप से प्रस्तुत नहीं कर सकता है।

3. क्लाइंट क्षमता से 208 या 508 का चयन करें

यदि क्लाइंट बाइंडिंग एक्सटेंशन और 208 के समर्थन का विज्ञापन करता है, तो सर्वर पहली घटना को सामान्य रूप से लौटा सकता है, बाद की बाइंडिंग्स को मल्टीस्टेटस रिस्पॉन्स में Already Reported के रूप में चिह्नित कर सकता है, और उनके वंशजों (descendants) को छोड़ सकता है। यदि क्लाइंट 208 को नहीं समझता है, तो RFC 5842 एक संगतता पथ प्रदान करता है जिसमें अनंत-गहराई ऑपरेशन 508 के साथ विफल हो जाता है। विफलता को 200 के रूप में न छिपाएं।

4. नियतात्मक बजट और सुरक्षा सीमाएं निर्धारित करें

यहाँ तक कि एक चक्रीय-रहित ग्राफ़ (acyclic graph) भी CPU, मेमोरी या रिस्पॉन्स स्थान को समाप्त कर सकता है। अधिकतम नोड्स, सक्रिय-पाथ की लंबाई, कुल बाइट्स, वॉल-क्लॉक समय और समवर्तीता (concurrency) सेट करें। बजट समाप्त होने पर, कारण रिकॉर्ड करें और पुनः प्रयास करने के बजाय एक स्पष्ट अनुमत विफलता लौटाएं। टेनेंट बाइंडिंग्स में ऑथराइजेशन की जांच करें ताकि छिपे हुए नोड्स मल्टीस्टेटस रिस्पॉन्स के माध्यम से लीक न हों।

5. राइट्स और समवर्ती टोपोलॉजी परिवर्तनों को संभालें

BIND, REBIND, और UNBIND ग्राफ़ को बदलते हैं। एक सुसंगत स्नैपशॉट या वर्शन को ट्रैवर्स करें ताकि टोपोलॉजी परिवर्तन ऑपरेशन के बीच में डिटेक्शन को अमान्य न कर सके। संभावित चक्रीय बाइंडिंग बनाने से पहले, एक पहुंच-योग्यता जांच (reachability check) चलाएं या एक स्पष्ट साइकल-अनुमत पूर्व शर्त की आवश्यकता रखें; चेक और कमिट को एक ट्रांजेक्शन सीमा में रखें।

6. क्लाइंट्स से हानिकारक पुनः प्रयासों को रोकें

508 का अर्थ है कि अनुरोधित ऑपरेशन विफल हो गया; क्लाइंट्स को इसे 503 की तरह नहीं मानना चाहिए और बैकऑफ़ के साथ आंख मूंदकर पुनः प्रयास नहीं करना चाहिए। बॉडी और सहसंबंध ID (correlation ID) पढ़ें, गहराई कम करें, बाइंडिंग की मरम्मत करें, या क्षमताओं की जांच करें। एक प्रॉक्सी जो 508 को एक सामान्य त्रुटि में मैप करती है, उसे मूल स्थिति और डायग्नोस्टिक फ़ील्ड्स को संरक्षित रखना चाहिए।

उच्च गुणवत्ता वाला नमूना उत्तर

मैं बाइंडिंग्स को एक निर्देशित ग्राफ़ के रूप में मॉडल करूँगा और एक्सेस URI से संसाधन पहचान को अलग करूँगा। Depth: infinity के लिए, बैक किनारों का पता लगाने के लिए सक्रिय रिकर्सन स्टैक का उपयोग करें और जब कई बाइंडिंग्स एक ही संसाधन तक पहुँचती हैं तो डुप्लिकेट आउटपुट को दबाने के लिए रिपोर्ट किए गए सेट का उपयोग करें; उन सेट्स के अलग-अलग अर्थ हैं। नोड, गहराई, रिस्पॉन्स-बाइट और समय बजट के साथ एक सुसंगत दृश्य को ट्रैवर्स करें।

जब कोई क्लाइंट RFC 5842 और 208 समर्थन का विज्ञापन करता है, तो 207 मल्टीस्टेटस रिस्पॉन्स में पहला संसाधन लौटाएं, बाद के डुप्लिकेट्स को Already Reported के रूप में चिह्नित करें, और उनके वंशजों को छोड़ दें। ऐसे क्लाइंट के लिए जो 208 को नहीं समझता है, संगतता पथ द्वारा निर्दिष्ट अनुसार पूरे अनंत-गहराई ऑपरेशन को 508 के साथ समाप्त करें। 508 एक सामान्य पुनः प्रयास त्रुटि नहीं है, इसलिए क्लाइंट्स को स्वचालित पुनः प्रयासों को रोकना चाहिए और ग्राफ़ की मरम्मत करनी चाहिए या गहराई कम करनी चाहिए। साइकल और गहरे ट्रैवर्सल को DoS वैक्टर बनने से रोकने के लिए ऑथराइजेशन, मेट्रिक्स और सहसंबंध लॉग लागू करें।

सामान्य विफलता मोड

  • 508 को रिवर्स-प्रॉक्सी पुनः प्रयास समाप्ति या सामान्य URL रीडायरेक्ट लूप कहना।
  • केवल URI स्ट्रिंग द्वारा डिडुप्लिकेट करना और एक संसाधन के लिए कई बाइंडिंग्स को छोड़ देना।
  • केवल एक वैश्विक विज़िट किए गए सेट का उपयोग करना, साझा संसाधनों को बैक किनारों के साथ भ्रमित करना, या 208/508 के अंतर को खो देना।
  • बिना नोड, बाइट, समय और ऑथराइजेशन बजट के Depth: infinity को स्वीकार करना।
  • 508 पर स्वचालित रूप से पुनः प्रयास करना और उसी टोपोलॉजी पर बार-बार संसाधनों को खर्च करना।
  • क्षमता वार्ता (capability negotiation), 207 मल्टीस्टेटस रिस्पॉन्स, या राइट रेस को भूल जाना।

अनुवर्ती प्रश्न और संदर्भ उत्तर

508 और 208 के बीच की सीमा क्या है?

208 पहले देखे गए संसाधन की रिपोर्ट तब करता है जब क्लाइंट बाइंडिंग एक्सटेंशन को समझता है, जिससे शेष ऑपरेशन जारी रह सकता है। 508 एक साइकल के बाद पूरे अनंत-गहराई ऑपरेशन को समाप्त करता है, आमतौर पर ऐसे क्लाइंट के लिए जो 208 का उपयोग नहीं कर सकता है।

विज़िट की गई कुंजी के रूप में केवल एक URI का उपयोग क्यों नहीं किया जाता है?

कई URIs एक संसाधन से बाइंड हो सकते हैं, इसलिए केवल-URI ट्रैकिंग ट्रैवर्सल को दोहराती है। पाथ अभी भी डायग्नोसिस के लिए मायने रखता है, इसलिए संसाधन पहचान और पाथ संदर्भ दोनों रखें।

आप चेक और राइट के बीच TOCTOU से कैसे बचते हैं?

पहुंच-योग्यता सत्यापन और बाइंडिंग कमिट को एक ट्रांजेक्शन या वर्शन वाले स्नैपशॉट में चलाएं। यदि परमाणुकता (atomicity) नोड्स में फैली हुई है, तो वर्शन की स्थिति पर विफल करें और पुनः जांच करें।

क्या क्लाइंट को 508 के बाद पुनः प्रयास करना चाहिए?

आंख मूंदकर नहीं। वर्तमान टोपोलॉजी ने ऑपरेशन को विफल कर दिया; गहराई कम करें, साइकल की मरम्मत करें, या क्षमता की जानकारी प्राप्त करें। टोपोलॉजी को जानबूझकर बदलने के बाद ही पुनः प्रयास करें।

आप फ़ाल्स-पॉज़िटिव साइकल डिटेक्शन का परीक्षण कैसे करते हैं?

चक्रीय-रहित DAG, एक साझा संसाधन, एक बाइंडिंग साइकल, और एक गहराई सीमा के लिए फिक्स्चर का उपयोग करें। परिणाम संख्या, स्थिति कोड, ट्रैवर्सल बजट, ऑडिट लॉग और रिस्पॉन्स-आकार की सीमाओं की पुष्टि (assert) करें।

क्या 508 प्रत्येक माइक्रोसर्विस कॉल साइकल पर लागू होता है?

नहीं। इसका मानकीकृत अर्थ WebDAV RFC 5842 से आता है। अन्य सेवा लूपों को अपने स्वयं के त्रुटि अनुबंध की आवश्यकता होती है; 5xx बनाए रखने से रिस्पॉन्स WebDAV 508 सेमांटिक्स नहीं बन जाता है।

सार्वजनिक स्रोत

संबंधित प्रश्न