क्या मैं ओवर-इंजीनियरिंग कर रहा हूं यदि मैं उपयोगकर्ता के इरादे को गलत मानता हूं?


12

क्या यह ओवर-इंजीनियरिंग है अगर मैं किसी उपयोगकर्ता के जानबूझकर गलत काम (इसे हल्के ढंग से डालने के लिए) के खिलाफ सुरक्षा जोड़ता हूं, अगर उपयोगकर्ता को जो नुकसान हो सकता है वह मेरे कोड से संबंधित नहीं है?

स्पष्ट करने के लिए, मैं इस तरह एक साधारण JSON रेस्टफुल सेवा को उजागर कर रहा हूं:

GET /items - to retrieve list of user's items
PUT /items/id - to modify an item
POST /items - to add a new item

सेवा का मतलब केवल ब्राउज़र को गर्त में इस्तेमाल करना नहीं है, बल्कि केवल तृतीय पक्ष एप्लिकेशन से है, जो उपयोगकर्ता द्वारा नियंत्रित किया जाता है (जैसे फोन ऐप, डेस्कटॉप ऐप आदि)। साथ ही, सेवा स्वयं ही स्टेटलेस (यानी सत्र-कम) होनी चाहिए।

प्रमाणीकरण SSL पर मूल प्रमाणीकरण के साथ किया जाता है।

मैं इस तरह से एक संभव "हानिकारक" व्यवहार के बारे में बात कर रहा हूं:

उपयोगकर्ता एक ब्राउज़र में GET url में प्रवेश करता है (कोई कारण नहीं लेकिन ...)। ब्राउज़र बेसिक प्रमाणीकरण के लिए पूछता है, इसे प्रोसेस करता है, और वर्तमान ब्राउज़िंग सत्र के लिए ऑर्ट को संग्रहीत करता है। ब्राउज़र को बंद किए बिना, उपयोगकर्ता दुर्भावनापूर्ण वेब साइट पर जाता है, जिसमें एक दुर्भावनापूर्ण CSRF / XSRF जावास्क्रिप्ट है जो हमारी सेवा के लिए एक POST बनाता है।

उपरोक्त परिदृश्य अत्यधिक संभावना नहीं है, और मुझे पता है कि व्यावसायिक दृष्टिकोण से मुझे बहुत चिंता नहीं करनी चाहिए। लेकिन स्थिति में सुधार के लिए, क्या आपको लगता है कि अगर JSON POST डेटा में उपयोगकर्ता नाम / पासवर्ड आवश्यक है, तो क्या यह मदद करेगा?

या क्या मुझे बेसिक ऑथोरिटी को पूरी तरह से छोड़ देना चाहिए, GET से छुटकारा पाना चाहिए, और उनमें प्राधिकरण जानकारी के साथ केवल POST / PUT का उपयोग करना चाहिए? जैसा कि जानकारी प्राप्त गर्त GET भी संवेदनशील हो सकता है।

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


3
अपने उत्तर के साथ-साथ, मैं यह कथन भी छोड़ना चाहूंगा, मुझे लगता है कि यह SO या सुरक्षा पर बेहतर उत्तर होगा
जेफ़ लैंगमेयर

1
मुझे लगता है कि आपने RFC 2616 ( tools.ietf.org/html/rfc2616#section-9.5 ) द्वारा परिभाषित PUT और POST को बदल दिया है ।
स्वेन्ते

जवाबों:


6

से अधिक इंजीनियरिंग? हर्गिज नहीं। एंटी- XSRF उपाय किसी भी सुरक्षित वेब एप्लिकेशन या सेवा का एक आवश्यक हिस्सा हैं। यह "अत्यधिक संभावना नहीं" हो सकता है कि कोई व्यक्ति आप पर हमला करने के लिए चुनेगा, लेकिन यह आपके सॉफ़्टवेयर को कम असुरक्षित नहीं बनाता है।

सिस्टम पर आमतौर पर XSRF का उपयोग करके हमला किया गया है, और हालांकि परिणाम SQL-इंजेक्शन या XSS की तुलना में कम-स्पष्ट रूप से खराब हैं, वे सभी उपयोगकर्ता-इंटरएक्टिव सुविधाओं से समझौता करने के लिए काफी खराब हैं।

इसका मतलब है कि आपके पास "शुद्ध" रेस्टफुल इंटरफ़ेस नहीं हो सकता है, जहां केवल पैरामीटर कॉल के गुण हैं। आपको अनुरोध में कुछ ऐसा शामिल करना चाहिए जो एक हमलावर का अनुमान न लगा सके। वह उपयोगकर्ता नाम-पासवर्ड जोड़ी हो सकती है, लेकिन यह एकमात्र संभव विकल्प से बहुत दूर है। आप पासवर्ड के एक नमकीन हैश से उत्पन्न टोकन के साथ एक साथ उपयोगकर्ता नाम हो सकते हैं। आपके पास प्रमाणीकरण समय पर सेवा द्वारा जारी टोकन हो सकते हैं (जिसे सत्र में याद किया जा सकता है, या क्रिप्टोग्राफिक रूप से सत्यापित किया जा सकता है)।

क्या मुझे GET से छुटकारा पाना चाहिए

नहीं, GET अनुरोधों का उपयोग उन रीड-रिक्वेस्ट के लिए किया जाता है, जिनका कोई सक्रिय लेखन ऑपरेशन नहीं है (वे "बेकार" हैं)। यह केवल लेखन कार्य है जिसमें XSRF सुरक्षा की आवश्यकता होती है।


यदि GET अनुरोध संवेदनशील जानकारी को प्रकट कर सकता है तो क्या होगा?
सनी

@ सुन्नी: आप संवेदनशील डेटा पर क्या विचार कर रहे हैं?
क्रिस

2
क्रिस, अगर मैं पागल हो जाता हूं, तो हर डेटा संवेदनशील होता है, अगर यह "गलत" उपयोगकर्ता द्वारा प्राप्त होता है :)। इसका सैद्धांतिक।
सनी

pls, मेरे द्वारा जोड़े गए प्रश्न के परिवर्तनों की समीक्षा करें।
सनी

1
यह प्रतिक्रिया के लिए ठीक है (क्या जीईटी या अन्य विधि) डेटा को केवल उपयोगकर्ता को देखना चाहिए। एक XSRF हमला केवल हमलावर को उपयोगकर्ता को एक विशेष अनुरोध करने की अनुमति देता है, यह उन्हें उस अनुरोध पर प्रतिक्रिया को पढ़ने की अनुमति नहीं देता है। जब तक कि तृतीय-पक्ष के पृष्ठों को <script>टैग से, जानबूझकर ("JSONP") या गलती से ( असुरक्षित JSON ) पढ़ने की अनुमति देने के लिए लक्ष्य स्क्रिप्ट का एक विशेष तरीके से निर्माण किया जाता है ।
बॉबीस

32

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

यदि आपने अपने आवेदन में एक सुरक्षा छेद की पहचान की है, तो वह सब कुछ करें जो आपको लगता है कि अंतराल को प्लग करने के लिए आवश्यक है। आपका एपीआई, विशेष रूप से, अस्तित्व में सॉफ्टवेयर का सबसे अविश्वसनीय टुकड़ा होना चाहिए। मुझे क्रेडेंशियल्स की आवश्यकता होगी और पोस्ट अनुरोधों के साथ जाना होगा।


4
व्यामोह के लिए YAY! आपके पास दुश्मन हैं! (और हर अनुरोध के लिए +1 एक हमला है )
ट्रेब

0

यदि कोड स्थापित और रखरखाव किया जाता है, तो किनारे के मामलों को देखा जाना चाहिए और केस-बाय-केस आधार पर निपटा जाना चाहिए।

मेरे हिस्से पर कुछ त्रुटियों के लिए फिक्सिंग:

GET को अभी भी एक उचित RESTful सेवा के हिस्से के रूप में उपयोग किया जाना चाहिए, प्रमाणीकरण को अभी भी किसी भी मामले में होना चाहिए। मैं जो अनुमान लगाने की कोशिश कर रहा था, वह यह था कि सुरक्षा उद्देश्यों के लिए GET POST के समान ही है, लेकिन पोस्ट अपने काम को एक एड्रेस बार में जानकारी के बिना करता है, जो कि बड़ा सुरक्षा अंतर है (और मुझे GET क्यों नापसंद है), लेकिन @Lee द्वारा पोस्ट किया गया,

GET requests are used to retrieve resources, and PUT/POST are used to add/update 
resources so it would be completely against expectations for a RESTful API to use
PUT/POST to get data. 

चूँकि इसका उपयोग थर्ड-पार्टी एप्लिकेशन द्वारा किया जाएगा, इसलिए किसी RESTful सेवा के लिए अच्छी प्रथाओं का पालन करना चाहिए, ताकि अंतिम कार्यान्वयनकर्ता इस भाग में भ्रमित न हों।


3
सुरक्षा के लिहाज से GST POST से अलग कैसे है? दोनों परिवहन (HTTP या HTTPS) पर सादे में भेजे गए हैं, केवल अंतर यह है कि पता बार में GET क्वेरी स्ट्रिंग दिखाई देते हैं।
tdammers

1
@ सुन्नी: POST इस संबंध में GET के रूप में सामने आया है। अगर आप मुझ पर विश्वास नहीं करते हैं तो टेलनेट को आग दें और वेब सर्वर से बात करें।
tdammers

1
@ जेफ़: मैं टेलनेट (या कर्ल, वेट, या एक अच्छे पुराने जमाने का स्निफर) ला रहा हूं, इसका कारण यह है कि यह आपको पूर्ण डेटा स्ट्रीम देखने की अनुमति देता है। हां, HTTPS इस जानकारी को eavesdroppers से छिपाता है, लेकिन SSL कनेक्शन के दोनों छोर पर कोई भी वही देख सकता है जो टेलनेट देखता है।
tdammers

1
@ जेरेमी: POST पता बार में पैरामीटर नहीं दिखाता है, लेकिन चूंकि डेटा वास्तविक HTTP स्ट्रीम में दिखाई देता है, आप सही हैं।
tdammers

7
GET अनुरोधों का उपयोग संसाधनों को पुनः प्राप्त करने के लिए किया जाता है, और PUT / POST का उपयोग संसाधनों को जोड़ने / अपडेट करने के लिए किया जाता है, इसलिए डेटा प्राप्त करने के लिए RESTful API के लिए PUT / POST का उपयोग करना अपेक्षाओं के विरुद्ध होगा।
ली

0

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

लेकिन एक ही समय में, आपको एक सफलता हैक के प्रभाव का आकलन करना चाहिए, और एक प्रयास होने की संभावना है। उदाहरण के लिए:

  • एक ठोस फ़ायरवॉल द्वारा संरक्षित एक आंतरिक सेवा सार्वजनिक इंटरनेट पर एक सेवा की तुलना में हमले के अधीन होने की संभावना कम है।

  • ग्राहक चर्चा मंच लेने वाले किसी व्यक्ति का प्रभाव ग्राहक क्रेडिट कार्ड चुराने के प्रभाव से कम होता है।


मेरा कहना है कि "कुल सुरक्षा" "असीम रूप से महंगी" है ... और व्यावहारिक रूप से अस्वीकार्य है। आदर्श रूप से आपको अपने निर्णय लेने चाहिए कि गहन लागत-लाभ विश्लेषण के आधार पर रेखा कहाँ खींचनी है।


धन्यवाद। सवाल उपयोगकर्ता से "रक्षा" करने के बारे में नहीं था, लेकिन यदि वे गैर-जिम्मेदाराना कार्य करते हैं, तो उपयोगकर्ता की रक्षा करना। लेकिन आपका जवाब कुछ अच्छे बिंदु देता है।
सनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.