क्या MVC / REST को अन्य उपयोगकर्ताओं से संबंधित संसाधनों के लिए 403 या 404 वापस करना चाहिए?


33

जब संसाधन-आधारित साइट (जैसे MVC एप्लिकेशन या REST सेवा) के साथ काम करते हैं, तो हमारे पास दो मुख्य विकल्प होते हैं जब एक ग्राहक GETएक संसाधन के लिए प्रयास करता है कि उनके पास इसका उपयोग न हो:

  • 403 , जो कहता है कि ग्राहक अनधिकृत है ; या
  • 404 , जो कहता है कि संसाधन मौजूद नहीं है (या स्थित नहीं हो सकता है)।

सामान्य ज्ञान और सामान्य अभ्यास सच्चाई के साथ प्रतिक्रिया करता प्रतीत होता है - अर्थात 403. लेकिन मैं सोच रहा हूं कि क्या यह वास्तव में सही काम है।

सुरक्षित लॉगिन सिस्टम आपको लॉगिन विफलता का कारण कभी नहीं बताता है। यह कहना है, जहां तक ​​ग्राहक का संबंध है, गैर-मौजूद उपयोगकर्ता नाम और गलत पासवर्ड के बीच कोई अंतर नहीं है। इसका उद्देश्य उपयोगकर्ता आईडी - या इससे भी बदतर, ई-मेल पते - खोज योग्य नहीं बनाना है।

एक से गोपनीयता के दृष्टिकोण से, यह एक बहुत सुरक्षित लगता है एक 404. मैं इस घटना की याद दिला रहा हूँ जिसमें किसी कथित तौर पर देख कर एक रियलिटी शो (उत्तरजीवी, मुझे लगता है) के विजेताओं को पता चला वापस जाने के लिए जो संसाधन नहीं था पर मौजूद हैं साइट बनाम जो किया। मैं ४०३ संभावित रूप से संवेदनशील जानकारी दे रहा हूं जैसे कि सीरियल नंबर या खाता संख्या।

क्या 404 को वापस नहीं करने के लिए बाध्यकारी कारण हैं ? क्या 404 नीति का नकारात्मक प्रभाव कहीं और हो सकता है? यदि नहीं, तो प्रथा अधिक सामान्य क्यों नहीं है?


1
सम्मोहक कारण 404 नहीं लौटना: यदि सेवा नीचे है या प्रमाणीकरण में कोई बग / त्रुटि है तो आपको 404 मिलेगा, लेकिन समस्या का निदान करने का प्रयास करने वाले ग्राहक / उपयोगकर्ता / परीक्षक / डेवलपर / सहायता व्यक्ति को कोई पता नहीं हो सकता है त्रुटि संदेश से क्या गलत है।
स्टीवन एवर्स

@ सर्नफ़स: यह एक अच्छा बिंदु है - मैंने इसे एक उत्तर में रखा है। हालाँकि जोश ने पहले ही एक अच्छा प्रतिरूप जोड़ दिया था ...
हारून ने

एक और पहलू यह ध्यान में रखना है: 404s को डाउनस्ट्रीम कैसे माना जाता है? क्या सीडीएन या किसी तरह की कैशिंग है? यदि आप कभी भी उन कैश करने में सक्षम होना चाहते हैं, तो आप शायद नहीं चाहते कि आपके "उपयोगकर्ता के पास अनुमति नहीं है" 404 कैश हो।
pc1oad1etter

जवाबों:


15

इसके साथ एक सामान्य ग़लतफ़हमी (और दुरुपयोग) जुड़ी हुई है 403 Forbidden: सर्वर अनुरोध के बारे में क्या सोचता है, इसके बारे में कुछ भी देना नहीं चाहिए। यह विशेष रूप से कहने के लिए डिज़ाइन किया गया है,

मुझे वह मिलता है जो आप अनुरोध कर रहे हैं, लेकिन मैं अनुरोध को संभालने नहीं जा रहा हूं, चाहे आप कोई भी प्रयास करें। इसलिए कोशिश करना छोड़ दें।

किसी भी यूए या क्लाइंट को यह व्याख्या करनी चाहिए कि इसका मतलब यह है कि अनुरोध कभी काम नहीं करेगा , और उचित रूप से जवाब देगा।

इसमें उपयोगकर्ताओं की ओर से अनुरोधों को संभालने वाले ग्राहकों के लिए निहितार्थ हैं: यदि कोई उपयोगकर्ता लॉग इन नहीं करता है, या गलत खाता है, तो अनुरोध को संभालने वाले ग्राहक को जवाब देना चाहिए, "मुझे खेद है, लेकिन मैं कुछ भी नहीं कर सकता" पहली बार के बाद यह 403भविष्य के अनुरोधों को संभालना बंद कर देता है। जाहिर है, यदि आप चाहते हैं कि एक उपयोगकर्ता विफलता के बाद भी अपनी व्यक्तिगत जानकारी तक पहुंच का अनुरोध कर सके, तो यह एक उपयोगकर्ता-शत्रुतापूर्ण व्यवहार है।

403इसके विपरीत है 401 Authorization Required, जो यह बताता है कि जब तक आप सही क्रेडेंशियल पास नहीं करेंगे, सर्वर अनुरोध को संभाल लेगा। ऐसा आमतौर पर लोग सुनते समय सोचते हैं 403

यह भी इसके विपरीत है 404 Page Not Found, जैसा कि दूसरों ने बताया, न केवल "मुझे वह पृष्ठ नहीं मिल रहा है" कहने के लिए डिज़ाइन किया गया है, बल्कि ग्राहक को यह सुझाव देने के लिए कि सर्वर भविष्य के अनुरोधों के लिए सफलता या विफलता का कोई दावा नहीं करता है।

साथ 401और 404, सर्वर क्लाइंट या UA वे कैसे आगे बढ़ना चाहिए के बारे में करने के लिए कुछ नहीं कहा: वे एक अलग प्रतिक्रिया हो रही है की उम्मीद में की कोशिश कर रख सकते हैं।

तो 404एक पृष्ठ को संभालने का उपयुक्त तरीका है जिसे आप हर किसी को नहीं दिखाना चाहते हैं, लेकिन कुछ भी स्थितियों में आप इसे क्यों नहीं दिखाएंगे इसके बारे में कुछ भी नहीं देना चाहते हैं।

बेशक, यह ग्राहक को अनुरोध करता है कि पेटीएम RFC फ़्लिपेंसी के लिए अनुरोध करता है। दुर्भावनापूर्ण पर्याप्त ग्राहक आकस्मिक रूप से छोड़कर स्थिति कोड के बारे में परवाह नहीं करता है। एक को यह पता होगा कि यह एक छिपे हुए उपयोगकर्ता पृष्ठ (या एक संभावित छिपे हुए उपयोगकर्ता पृष्ठ) की तुलना दूसरे, ज्ञात उपयोगकर्ता पृष्ठों से करता है।

यानी मान लीजिए कि आपका हैंडलर है users/*। तो मुझे पता है users/foo, users/barऔर users/baazकाम, सर्वर लौटने 401, 403या 404के लिए users/quuxइसका मतलब यह नहीं कि मैं इसे करने की कोशिश करने के लिए नहीं जा रहा हूँ, खासकर अगर मुझे विश्वास है वहाँ कारण है है एक quuxउपयोगकर्ता। एक मानक उदाहरण परिदृश्य फेसबुक है: मेरी प्रोफ़ाइल निजी है, लेकिन सार्वजनिक प्रोफ़ाइल पर मेरी टिप्पणी नहीं है। एक दुर्भावनापूर्ण ग्राहक जानता है कि यदि आप 404मेरे प्रोफाइल पेज पर लौटते हैं तो भी मैं मौजूद हूं।

इसलिए स्थिति कोड दुर्भावनापूर्ण उपयोग के मामलों के लिए नहीं हैं, वे नियमों द्वारा खेलने वाले ग्राहकों के लिए हैं। और उन ग्राहकों के लिए, 401या एक 404अनुरोध सबसे उपयुक्त है।


4
401 बनाम 403 के बारे में अच्छे अंक। मैं 404 पर आपके कथनों की अंतिमता से सहमत नहीं हूँ, हालाँकि। यकीन है, फेसबुक के उदाहरण में, आप पहले से ही जानते हैं कि quuxमौजूद है। लेकिन हमेशा बाहरी सबूत नहीं होने जा रहे हैं, खासकर गैर-सामाजिक साइटों पर जहां क्लाइंट डेटा वास्तव में निजी है । एक नासमझ या शत्रुतापूर्ण उपयोगकर्ता अंततः यह झूठ बोलने में सक्षम हो सकता है कि आप झूठ बोल रहे हैं, लेकिन जरूरी नहीं कि आप किन संसाधनों के बारे में झूठ बोल रहे हों । मुझे लगता है कि यहां का मुख्य बिंदु वास्तव में है, 404 संसाधनों को परेशान न करें जब तक कि खोज के अन्य तरीके उपलब्ध न हों।
एरोन ने

@Aaronaught बात यह है, आपको वास्तव में होना चाहिए , वास्तव में निश्चित रूप से कोई यह पता नहीं लगा सकता है कि सर्वर किस बारे में धोखा दे रहा है, या यह कि खोज की कोई विधि नहीं है जिसके खिलाफ आपने कठोर नहीं किया है। एक स्मार्ट पर्याप्त व्यक्ति यह पता लगाएगा, और उस बिंदु पर, स्थिति कोड अर्थहीन है।

1
मैं अभी भी स्पष्ट नहीं हूं कि एक स्मार्ट पर्याप्त व्यक्ति यह कैसे पता लगा सकता है कि उपयोगकर्ता प्रोफाइल के बीच डेटा का साझाकरण नहीं है। मैं समझता हूं कि कोई व्यक्ति निर्धारित करेगा कि "ओह, 404 वास्तव में इसका मतलब है कि यह अस्तित्व में हो सकता है, लेकिन मैं इसे एक्सेस नहीं कर सकता" - लेकिन यह मानते हुए कि सर्वर संसाधनों के लिए वही त्रुटि देता है जो वास्तव में मौजूद नहीं है, कोई कैसे होगा गैर-मौजूद संसाधन और विशेषाधिकार प्राप्त के बीच अंतर बताएं?
एरोन ने

@ केवल एक चीज़ जिसे किसी व्यक्ति को जानना होगा, वह है प्रोफ़ाइल का URL मौजूद होना चाहिए। आप केवल प्रोफ़ाइल आईडी का उपयोग कर सकते हैं और उन्हें छद्म फैशन में बढ़ा सकते हैं (इसलिए 3333 की प्रोफ़ाइल आईडी वाला व्यक्ति 3332 की प्रोफ़ाइल आईडी वाला व्यक्ति नहीं है), लेकिन एक निर्धारित व्यक्ति को यह अनुमान लगाने में सक्षम होना चाहिए कि यह कुछ दिया गया है वैध आईडी का नमूना आकार। असफल होना, और यहां तक ​​कि एक पूरी तरह से कठोर प्रणाली दी गई है जो इस बारे में कोई जानकारी लीक नहीं करती है कि यह प्रोफाइल पेज के लिए URL कैसे उत्पन्न करता है, हमेशा सामाजिक इंजीनियरिंग होता है।

8

RFC2616 के अनुसार

10.4.4 403 निषिद्ध

सर्वर अनुरोध को समझ गया, लेकिन इसे पूरा करने से इनकार कर रहा है। प्राधिकरण मदद नहीं करेगा और अनुरोध को दोहराया नहीं जाना चाहिए। यदि अनुरोध विधि HEAD नहीं थी और सर्वर यह सार्वजनिक करना चाहता है कि अनुरोध क्यों पूरा नहीं हुआ है, तो यह इकाई में इनकार के कारण का वर्णन करेगा। यदि सर्वर क्लाइंट को यह जानकारी उपलब्ध नहीं कराना चाहता है, तो इसके बजाय स्थिति कोड 404 (नहीं मिला) का उपयोग किया जा सकता है।

यह भी ध्यान दें कि एक निषिद्ध संसाधनों तक पहुँचने पर, प्राधिकरण मदद नहीं करेगा


मैं RFC से वाकिफ हूँ, हालाँकि यह वास्तविकता से बहुत कम समानता रखता है। लगभग कोई भी सर्वर उस पहले वाक्य से परे एक 403 का कारण नहीं बताता है ("सर्वर ने अनुरोध को समझा, लेकिन इसे पूरा करने से इनकार कर रहा है।") और अधिकांश एमवीसी फ्रेमवर्क में भी कुछ ऐसा है जो HttpUnauthorizedResultविशेषाधिकार प्राप्त संसाधनों के लिए उपयोग किए जाने का इरादा है। । मुझे यह भी (जाहिर है) एहसास है कि 404 के बजाय इसका इस्तेमाल किया जा सकता है; मेरा प्रश्न यह है कि इसका उपयोग किया जाना चाहिए या नहीं , और यह निर्णय लेते समय क्या विचार किया जाना चाहिए।
एरॉन

@ चेतावनी: RFC आपको केवल 404 का उपयोग करने की अनुमति नहीं देता है, यह अनुशंसा करता है कि 404 को फेंक दिया जाए जब आप कुछ भी स्वीकार नहीं करना चाहते हैं।
रेयान

3
यह ठीक है, लेकिन मुझे कुछ कब स्वीकार नहीं करना चाहिए? या बल्कि, मुझे कब करना चाहिए ? यह वास्तव में प्रश्न का सार है।
एरोन ने

5

अगर आप? जी हां

आपने इसे खुद कहा, जितना संभव हो उतना कम धोखा। अगर मैं एक सिस्टम पर हमला कर रहा था और देखा कि सर्वर 403 कोड के साथ प्रतिक्रिया करता है तो मैं उन पर ध्यान केंद्रित करूंगा, बजाय आगे बढ़ने के। एक दरवाजा घोषित करने के लिए बेहतर है कि यह मौजूद नहीं है कि इसे वर्जित घोषित किया जाए।

404 अनुरोधों का उपयोग करने का नकारात्मक पक्ष यह है कि बाहर से यह करता है, तो पृष्ठ मौजूद नहीं है के रूप में दिखाई देगा, और यह जब उन पृष्ठों को कर रहे हैं की तुलना में संघर्ष हो सकता है चाहिए अस्तित्व के लिए लेकिन इसके बजाय लापता हैं। यदि आप वेब क्रॉलर के बारे में चिंतित नहीं हैं (प्रामाणिक सिस्टम को वैसे भी पूरी तरह से अस्वीकार कर दिया जाना चाहिए) तो आपको इसके लिए बिल्कुल जाना चाहिए। हर API को मैंने अनधिकृत पहुंच के समान तरीके से हैंडल किया है, और इसी तरह StackOverflow । उस पृष्ठ को नहीं देख सकते हैं? मैं विश्वास दिलाता हूं कि आप इसे करता है अस्तित्व, भले ही यह नहीं दावा करता है।

आप चाहिए जब संसाधन है अनुरोधों को स्वीकार करते हैं जाना जाता मौजूद हैं और पहुँच से मना कर रहा है। एक असफल लॉगिन में 404 संदेश नहीं होना चाहिए। आप नहीं करना चाहिए जब संसाधन ही के अस्तित्व रक्षा की जानी चाहिए अनुरोध स्वीकार करते हैं। दायरे में प्रवेश जनता में मौजूद है, लेकिन इसके भीतर सुरक्षा समूह या भूमिकाएं नहीं हैं।


सम्मोहक कारण 404 नहीं लौटना: यदि सेवा नीचे है या प्रमाणीकरण में कोई बग / त्रुटि है तो आपको 404 मिलेगा, लेकिन समस्या का निदान करने का प्रयास करने वाले ग्राहक / उपयोगकर्ता / परीक्षक / डेवलपर / सहायता व्यक्ति को कोई पता नहीं हो सकता है त्रुटि संदेश से क्या गलत है

डेवलपर्स के पास लॉग तक पहुंच होनी चाहिए, जो संरक्षित संसाधन तक पहुंचने के प्रयास का संकेत देगा। ग्राहक / उपयोगकर्ता / परीक्षक प्रतिक्रिया उत्पन्न करेंगे जो अंततः एक डेवलपर को मार देगा।

अस्पष्टता से सुरक्षा ... वास्तव में?

यह अस्पष्टता से सुरक्षा नहीं है। आप उचित सुरक्षा उपायों के अलावा अस्पष्टता का उपयोग कर रहे हैं ।

दूसरी ओर "404" प्राप्त होने वाले वैध अनुरोध केवल जटिलता और अस्पष्टता जोड़ रहे हैं जहां यह आवश्यक नहीं है

वे मान्य अनुरोध नहीं हैं, वे अनधिकृत अनुरोध हैं। आप किसी भी हमलावर हमलावरों में पर्याप्त लाभ प्राप्त करने के लिए एक छोटा सा हिस्सा (403 के बजाय 404 लौटाएं) बदल रहे हैं।


अस्पष्टता से सुरक्षा ... वास्तव में? यदि कोई दुर्भावनापूर्ण इरादे के साथ आपकी सेवा (को) को टटोलने की कोशिश कर रहा है, तो वे पहले से ही जानते हैं कि यह वहां है। दूसरी ओर "404" प्राप्त होने वाले वैध अनुरोध केवल जटिलता और अस्पष्टता जोड़ रहे हैं जहां यह आवश्यक नहीं है।
स्टीवन एवर्स

4
@ सर्नोपस: यहां सुरक्षा और गोपनीयता के बीच एक सूक्ष्म अंतर है । गोपनीयता, लगभग, परिभाषा के अनुसार, "अस्पष्टता से" है। संसाधन आधारित प्रणाली के संदर्भ में यह विशेष रूप से महत्वपूर्ण है, क्योंकि किसी संसाधन का अस्तित्व या गैर-अस्तित्व संभावित रूप से महत्वपूर्ण जानकारी है। सुरक्षा तर्क भी हो सकते हैं, हालाँकि मैं उन लोगों से कम चिंतित हूँ। मैं इस अतिरिक्त जटिलता के बारे में अधिक सुनना चाहता हूं ; क्या आप अपनी प्रारंभिक टिप्पणी से परे विस्तार में जा सकते हैं? (? शायद एक अधिक व्यापक जवाब में आप 404'ed 403s ने काट लिया गया है?)
Aaronaught

2
@ सर्नोपस: मैं भी जोड़ना चाहूंगा, एक विचार के रूप में, कि गहराई में रक्षा अस्पष्टता से सुरक्षा के समान नहीं है । उत्तरार्द्ध का तात्पर्य है कि सुरक्षा के अन्य साधन नहीं हैं । लेकिन पहले से सुरक्षित सिस्टम में अस्पष्टता जोड़ना अक्सर एक अच्छी बात हो सकती है - जब तक कि यह सड़क के नीचे अन्य समस्याओं का कारण नहीं बनता है। इस मामले में, यह एक दिया गया है कि सिस्टम पहले से ही सुरक्षित है, क्योंकि 404 को प्राधिकरण कोड द्वारा उत्सर्जित किया जा रहा है।
एरॉन

@ चेतावनी: मैं एक और अधिक गहन उत्तर पोस्ट करूंगा, लेकिन इस मुद्दे पर: यदि कोई संसाधन निजी है तो उसे सार्वजनिक रूप से उजागर करने के पीछे क्या तर्क है?
स्टीवन एवर्स

@ सर्न्यूफ़स: एक संसाधन ग्राहक के लिए निजी है - या शायद एक समूह के लिए - पूरी दुनिया के लिए नहीं।
एरोन ने

0

यह वास्तव में 403 स्थिति कोड द्वारा दूर दी गई जानकारी पर निर्भर करता है। यदि आपके पास एक एपीआई एंडपॉइंट है GET /myresource/{id}जो संसाधन मौजूद नहीं होने पर 404 के साथ जवाब देता है, तो एंडपॉइंट द्वारा स्टेटस कोड जब संसाधन मौजूद है, लेकिन वर्तमान उपयोगकर्ता के लिए अधिकृत नहीं है, तो idपैरामीटर की भविष्यवाणी पर निर्भर होना चाहिए , और राशि इसकी जानकारी स्वयं के पास है।

  • यदि idईमेल पते या बैंक खाता संख्या की तरह एक निजी क्षेत्र है, तो इसे हमेशा 404 के पीछे छिपाया जाना चाहिए। ईमेल पते के मामले में यह स्पैमिंग बॉट्स को आपकी वेबसाइट पर पंजीकृत वैध ईमेल पतों की सूची तैयार करने से रोक सकता है।
  • यदि idकोई सार्वजनिक उपयोगकर्ता नाम है, तो परेशान न हों, इस जानकारी तक पहुंचने के अन्य साधन हैं (जैसे, बस अपनी वेबसाइट के फ़ोरम पृष्ठ ब्राउज़ करके)।
  • यदि idएक अपारदर्शी है, लेकिन पूर्वानुमेय पहचानकर्ता (जैसे एक ऑटो-इंक्रीमेंटिंग पूर्णांक), तो आप हमलावर को कोई भी जानकारी नहीं देते हैं जो वह अन्य तरीकों से प्राप्त नहीं कर सकता है। इसलिए मेरी राय में 403 स्टेटस कोड वापस करना सुरक्षित है।
  • यदि idएक अपारदर्शी, अप्रत्याशित पहचानकर्ता (एक यादृच्छिक GUID की तरह) है, तो सवाल अधिक सूक्ष्म है। मुझे व्यक्तिगत रूप से लगता है कि 403 स्टेटस कोड वापस करने में कोई समस्या नहीं है। इस ID का उपयोग करके आपके API में एक और त्रुटिपूर्ण समापन बिंदु होने पर ही इस जानकारी का दोहन किया जा सकता है, लेकिन वास्तविक दोष आपके अन्य समापन बिंदु है।

आप यह मान सकते हैं कि किसी भी मामले में क्षमा करने से सुरक्षित रहना बेहतर है और जो भी संदर्भ है उसकी जानकारी छिपाएं, लेकिन आप वास्तव में किसी भी प्रकार की सुरक्षा प्रदान करने के लिए इस प्रकार के व्यवहार पर भरोसा नहीं कर सकते । दूसरी ओर, यह गोपनीयता प्रदान कर सकता है (या गोपनीयता, जैसा कि अन्य ने कहा है)।

एक सुरक्षा तंत्र को हमलावर के लिए सिर्फ एक गति नहीं होना चाहिए, अन्यथा यह सिर्फ बेकार है। इस स्थिति में, यह आपको अन्य विशेषताओं को सही तरीके से उपयोग करने से भी रोक सकता है (क्रॉलर, वेब एप्लिकेशन फ़ायरवॉल उपयोगकर्ताओं को ब्लॉक करने के लिए 403 स्थिति कोड की असामान्य मात्रा की तलाश में ...)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.