हमारे स्वयं के दर-सीमित एपीआई को डॉगफूड करना


117

अवलोकन:

मेरी कंपनी ने एक दर-सीमित एपीआई विकसित किया है। हमारा लक्ष्य दुगना है:

  • एक: हमारे उत्पाद के चारों ओर एक मजबूत डेवलपर पारिस्थितिकी तंत्र बनाएं।
  • बी: हमारे एप्लिकेशन को चलाने के लिए इसका उपयोग करके हमारे एपीआई की शक्ति का प्रदर्शन करें।

स्पष्टता: सभी पर दर-सीमा क्यों?

हम अपने एपीआई को सीमित करते हैं, क्योंकि हम इसे अपने उत्पाद के अतिरिक्त बेचते हैं। हमारे एपीआई के लिए अनाम एक्सेस प्रति घंटे एपीआई कॉल के लिए बहुत कम सीमा है, जबकि हमारे भुगतान किए गए ग्राहकों को प्रति घंटे 1000 कॉल या उससे अधिक की अनुमति है।

समस्या:

डेवलपर इको-सिस्टम के लिए हमारी दर-सीमित एपीआई बहुत अच्छी है, लेकिन हमें डॉगफूड देने के लिए हम इसे समान दर-सीमित करने की अनुमति नहीं दे सकते। हमारे एपीआई के सामने का छोर सभी जावास्क्रिप्ट है, जिससे एपीआई में सीधे अजाक्स कॉल होते हैं।

तो सवाल यह है:

आप एक एपी को कैसे सुरक्षित करते हैं ताकि रेट-लिमिटिंग को हटाया जा सके जहां इस तरह की दर-सीमा को हटाने की प्रक्रिया को आसानी से खराब नहीं किया जा सकता है?

समझाया समाधान (और उन्होंने काम क्यों नहीं किया)

  1. होस्ट हेडर के विरुद्ध रेफरल सत्यापित करें। - त्रुटिपूर्ण क्योंकि रेफरर आसानी से नाटक किया है।

  2. अनुरोध और साझा रहस्य के आधार पर हस्ताक्षर बनाने के लिए HMAC का उपयोग करें , फिर सर्वर पर अनुरोध को सत्यापित करें। - Flawed क्योंकि गुप्त और एल्गोरिथ्म आसानी से सामने के अंत जावास्क्रिप्ट को देखकर निर्धारित किया जाएगा।

  3. अनुरोध को प्रॉक्सी करें और प्रॉक्सी में अनुरोध पर हस्ताक्षर करें - फिर भी त्रुटिपूर्ण है, क्योंकि प्रॉक्सी स्वयं एपीआई को उजागर करता है।

प्रश्न:

मैं वैकल्पिक समाधान प्रस्तुत करने के लिए स्टैक ओवरफ्लो पर शानदार दिमागों की तलाश कर रहा हूं। आप इस समस्या को कैसे हल करेंगे?


13
आप नहीं कर सकते। यदि आपके द्वारा उपयोग किए जा रहे एपीआई के अपने स्वयं के उपयोग को सीमित करने की दर तक सीमित नहीं करना है, तो आप सार्वजनिक वेब पेजों से आ रहे हैं, तो आप उन सार्वजनिक वेब पेजों से सुरक्षित कुछ भी नहीं कर सकते हैं, क्योंकि जैसा कि आप पहले से ही जानते हैं, वहाँ हैं सार्वजनिक वेब पेजों में कोई रहस्य नहीं। तो, आप अपने वेब पेजों में क्या कर सकते हैं, तो कोई और कर सकता है।
jfriend00

28
क्या आप वाकई अपने डॉगफूड उपयोग में हल करने के लिए एक दर सीमित समस्या है? आपकी साइट और आपके वेब पृष्ठों का उपयोग करने वाले प्रत्येक उपयोगकर्ता को आपके दर सीमित कोड के लिए पूरी तरह से अलग उपयोगकर्ता होना चाहिए। इस प्रकार, बस यह सुनिश्चित करें कि प्रत्येक वेब पेज सामान्य दर से स्वयं द्वारा नियमों को सीमित करता है और आपको ठीक होना चाहिए। प्रति ग्राहक अपनी दर सीमित मानते हुए, एक उपयोगकर्ता को किसी अन्य उपयोगकर्ता से कोई लेना-देना नहीं होगा।
jfriend00

6
आप एक एपीआई प्रबंधन समाधान पर विचार क्यों नहीं करते हैं जो प्रति-उपयोगकर्ता, प्रति-भूमिका / अनुमति या एप्लिकेशन स्कोप पर रेट-लिमिटिंग और थ्रॉटलिंग प्रदान करता है। जैसे wso2 आपी मेंगर
मिडिलवेयरमैन


28
आपके डॉगफूडिंग ने आपके सार्वजनिक एपीआई (जो कि दर सीमा बहुत कम है) के साथ एक महत्वपूर्ण समस्या की खोज की है और इसे ठीक करने के बजाय, आप इसे प्राप्त करने की कोशिश कर रहे हैं। डॉगफूड क्यों अगर आप समस्याओं को अनदेखा करने जा रहे हैं?
user253751

जवाबों:


93

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

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

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


8
इसे सर्वश्रेष्ठ उत्तर के रूप में स्वीकार करना। हमने जिस मार्ग पर जाने का फैसला किया है, वह है JWT टोकन का उपयोग कम समाप्ति के साथ और उन कॉल की दर-सीमा को बढ़ाने के लिए। हम बैकेंड को उच्च दर सीमा के बारे में बताने के लिए टोकन में कुछ अतिरिक्त जानकारी संलग्न करेंगे। चूंकि ये टोकन बैकएंड पर सुरक्षित रूप से हस्ताक्षरित हैं, इसलिए स्पूफिंग के साथ कोई समस्या नहीं होनी चाहिए। कोई अभी भी टोकन का उपयोग कर सकता है, लेकिन यह कुछ दिनों के बाद समाप्त हो जाएगा और किसी भी तरह के बॉट को बनाए रखना कठिन होगा।
जेसन वाल्ड्रिप

33

यदि यह आपको एक समस्या पैदा कर रहा है, तो यह आपके डेवलपर्स के समस्याग्रस्त पारिस्थितिकी तंत्र को एक समस्या का कारण होगा (जैसे जब वे वैकल्पिक यूआई विकसित करने का प्रयास करते हैं)। यदि आप वास्तव में अपने कुत्ते के भोजन को खा रहे हैं, तो अपने आवेदन के लिए एपीआई (और दर सीमित) काम करें। यहाँ कुछ सुझाव हैं:

  • आईपी ​​पते द्वारा दर सीमा न करें। बल्कि, उपयोगकर्ता से जुड़ी किसी चीज़ द्वारा दर सीमा, जैसे उनकी उपयोगकर्ता आईडी। प्रमाणीकरण स्तर पर दर सीमा लागू करें।

  • अपने एपीआई को डिज़ाइन करें ताकि उपयोगकर्ताओं को इसे लगातार कॉल करने की आवश्यकता न हो (उदाहरण के लिए एक सूची कॉल करें जो कई परिणाम देता है, बजाय एक बार कॉल करने वाले प्रत्येक बार एक आइटम लौटाता है)

  • अपने वेब ऐप को उन्हीं बाधाओं के साथ डिज़ाइन करें जिनसे आप अपने डेवलपर इकोसिस्टम की उम्मीद करते हैं, यानी सुनिश्चित करें कि आप इसे उचित थ्रॉलिंग दरों के भीतर डिज़ाइन कर सकते हैं।

  • सुनिश्चित करें कि आपका बैक एंड स्केलेबल (क्षैतिज रूप से अधिमानतः) है, इसलिए आपको स्तरों पर थ्रॉटलिंग लगाने की आवश्यकता नहीं है, इसलिए यह वास्तव में UI की समस्या का कारण बनता है।

  • सुनिश्चित करें कि आपके थ्रॉटलिंग में फट से निपटने की क्षमता है, साथ ही लंबे समय तक दुरुपयोग को सीमित करता है।

  • सुनिश्चित करें कि आपके थ्रॉटलिंग आपके द्वारा हटाने की मांग कर रहे दुरुपयोग के अनुरूप समझदार कार्य करता है। उदाहरण के लिए, कनेक्शन को मना करने के बजाय हल्के अपमान करने वालों को कतारबद्ध करना या विलंबित करने पर विचार करें। अधिकांश वेब फ्रंट एंड केवल एक साथ चार कनेक्शन खोलेंगे। यदि आप पांचवां खोलने के प्रयास में देरी करते हैं, तो आप केवल उस मामले से टकराएंगे जहां वे वेब क्लाइंट (ओटी दो वेब क्लाइंट) के रूप में एक ही समय में एक सीएलआई का उपयोग कर रहे हैं। यदि आप n-th API कॉल को बिना असफलता के अंतराल के बिना देरी करते हैं, तो अंतिम उपयोगकर्ता को ब्रेक के बजाय चीजें धीमी पड़ती दिखाई देंगी। यदि आप इसे केवल एक बार एन एपीआई कॉल के साथ कतार में जोड़ते हैं, तो आप केवल उन लोगों को मारेंगे जो बड़ी संख्या में एपीआई कॉल को समानांतर कर रहे हैं, जो कि शायद वह व्यवहार नहीं है जो आप चाहते हैं - जैसे 100 एक साथ एपीआई कॉल फिर एक घंटे के लिए अंतराल आम तौर पर बहुत दूर है एक घंटे में 100 से अधिक अनुक्रमिक एपीआई कॉल।

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


11

अपना उत्पाद खरीदें। खुद के एक भुगतान ग्राहक बनें।

"हमारे एपीआई में अनाम एक्सेस प्रति घंटे एपीआई कॉल के लिए बहुत कम सीमा है, जबकि हमारे भुगतान किए गए ग्राहकों को प्रति घंटे 1000 कॉल या उससे अधिक की अनुमति है।"

यह ग्राहक के दृष्टिकोण से प्रणाली का परीक्षण करने में भी मदद करता है।


1
स्पष्ट उत्तर। यहाँ कोई धोखा या फेकिंग नहीं!
wizzwizz4

9

दुर्भाग्य से, इसका कोई सही समाधान नहीं है।

सामान्य दृष्टिकोण आमतौर पर एक स्पूफ प्रदान करने के लिए होता हैग्राहकों के लिए खुद की पहचान करने का तरीका (उदाहरण के लिए एक पहचानकर्ता, संस्करण और एपीआई कुंजी - उदाहरण के लिए), ग्राहकों के लिए खुद के बारे में जानकारी दर्ज करने के लिए जिसका उपयोग एक्सेस को सीमित करने के लिए किया जा सकता है (उदाहरण के लिए ग्राहक किसी दिए गए आईपी एड्रेस रेंज में सर्वर है) इसलिए केवल उस श्रेणी में कॉल करने वालों को अनुमति दें; जैसे क्लाइंट जावास्क्रिप्ट है, लेकिन केवल ब्राउज़र की एक विशिष्ट श्रेणी में दिया जाता है, इसलिए केवल HTTP अनुरोधों तक पहुंच की अनुमति दें जो कुछ उपयोगकर्ता एजेंट स्ट्रिंग्स; आदि) को निर्दिष्ट करते हैं, और फिर मशीन सीखने / पैटर्न का उपयोग करने के लिए; एक अज्ञात उपयोग का पता लगाने के लिए मान्यता जो कि एक स्पूफ क्लाइंट है और फिर इन स्पूफ क्लाइंट्स से ट्रैफ़िक को अस्वीकार करने के लिए (या क्लाइंट्स से पुष्टि करें कि ये यूज़ेज वास्तव में वैध क्लाइंट से नहीं आ रहे हैं, अपने स्पूफ योग्य क्रेडेंशियल्स को बदलें, और फिर पुराने का उपयोग करके आगे ट्रैफ़िक को बाधित करें स्पूफ्ड क्रेडेंशियल्स)।

आप कुंजी की कई परतों का उपयोग करके इसे स्पूफ करना थोड़ा मुश्किल बना सकते हैं। उदाहरण के लिए, आप एक लंबे समय तक जीवित रहने वाले क्रेडेंशियल को देते हैं जो एक सर्वर पर रहता है (और इसका उपयोग केवल आईपी एड्रेस रेंज के सीमित सेट में किया जा सकता है) एक एपीआई कॉल करने के लिए जो क्लाइंट के बारे में जानकारी दर्ज करता है (जैसे उपयोगकर्ता एजेंट) और क्लाइंट-साइड API अनुरोधों के लिए क्लाइंट पर उपयोग के लिए जावास्क्रिप्ट में सिंडिकेटेड एक छोटी-जीवित क्लाइंट-साइड कुंजी देता है। यह भी, अपूर्ण है (एक स्पूफर क्रेडेंशियल प्राप्त करने के लिए एक ही सर्वर कॉल जारी कर सकता है), लेकिन यह अधिक कठिन होगा यदि लौटी हुई एपीआई कुंजी को ओफ़्फ़सेट (और अक्सर बदलते) जावास्क्रिप्ट या HTML में शामिल किया जाता है (जो आपको मुश्किल बना देगा) मज़बूती से प्रतिक्रिया से निकालने के लिए)। यह स्पूफिंग का अधिक आसानी से पता लगाने का एक तरीका प्रदान करता है; क्लाइंट-साइड कुंजी अब एक विशेष क्लाइंट (जैसे) से जुड़ी हुई है


8

यह मानते हुए कि एप्लिकेशन को सार्वजनिक रूप से खुला होना चाहिए, आपके पास अधिक विकल्प नहीं हैं:

अपने एपीआई की शक्ति का प्रदर्शन करने के लिए एक और तरीका चुनें। उदाहरण के लिए, ऐसा ऐप लिखें और उसका स्रोत साझा करें, लेकिन वास्तव में उस कोड को न चलाएं। सुनिश्चित करें कि यह अच्छी तरह से प्रलेखित है, ताकि कोई भी इसे तैनात कर सके और इसे काम करता हुआ (थ्रॉटलिंग के अधीन) देख सके।

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

अपने ऐप को लोड करने के लिए प्रदर्शन अनुकूलन में काम करने और निवेश करने की अनुमति देने के लिए दर सीमा को समायोजित करें।

और हाँ, पहले स्थान पर कोर एपीआई थ्रॉटल-फ्री है, और इसे एक निजी नेटवर्क के अंदर रखें। एक अलग सार्वजनिक रूप से सुलभ परत में थ्रॉटल।


4

क्या आप UI और थ्रॉटल-फ्री API के एक अलग उदाहरण को खड़ा कर सकते हैं, और फिर अपने संगठन से आने वाले आईपी पते तक पहुंच को प्रतिबंधित कर सकते हैं?

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


4

आप एक विशिष्ट सत्र ID जनरेट करने का प्रयास कर सकते हैं, एक निश्चित IP पते / उपयोगकर्ता और जीने के लिए सीमित समय के लिए। जब कोई उपयोगकर्ता आपका एप्लिकेशन डाउनलोड करता है तो जावास्क्रिप्ट कोड जावास्क्रिप्ट सत्र को जावास्क्रिप्ट स्रोत कोड में इंजेक्ट करता है। सत्र आईडी आपके एपीआई के लिए प्रत्येक अनुरोध से जुड़ी होगी और दर-सीमा हटा दी जाती है।

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

एक अन्य विकल्प:

अपने स्वयं के अनुप्रयोग के लिए एक प्रॉक्सी सेट करें और ओफ़्फ़्यूसेशन का उपयोग करें। प्रॉक्सी के लिए अजाक्स वास्तविक एपीआई-कॉल से विभिन्न नामों का उपयोग करता है और प्रॉक्सी उन्हें वापस अनुवाद करता है। इसलिए आपका एप्लिकेशन getDocumentआपके वास्तविक API पर कॉल नहीं करेगा , बल्कि यह getFELSUFDSKJEआपके प्रॉक्सी पर कॉल करेगा । प्रॉक्सी इस कॉल को वापस getDocument में अनुवाद करेगा और इसे वास्तविक दर-सीमित API पर अग्रेषित करेगा।

आपका वास्तविक एपीआई प्रॉक्सी द्वारा दर-सीमा अनुरोध नहीं करेगा।

और इसलिए कि अन्य लोग अपने स्वयं के अनुप्रयोग के लिए अपने प्रॉक्सी का उपयोग न करें जो आप प्रतिदिन की योजना को बदलते हैं। आपके द्वारा JavaScript स्रोत कोड में स्वचालित रूप से उत्पन्न किए गए कॉल-नाम को प्रॉक्सी में कॉन्फ़िगर किया जा सकता है।

इसका उपयोग करने के इच्छुक ग्राहक को अपने प्रॉक्सी का उपयोग करने के लिए अपने बदलते आक्षेप के साथ रखने की भी आवश्यकता होगी। और आप अभी भी रेफरी-हेडर और लॉगिंग के लिए समान का उपयोग कर सकते हैं, ताकि आप अपने प्रॉक्सी का उपयोग करके लोगों को ढूंढ सकें। या ओफिसकेशन स्कीम बदलते समय उन्हें पकड़ लें।


3
  • श्वेतसूची स्रोत आईपी पते
  • एक वीपीएन , श्वेतसूची वीपीएन सदस्यों का उपयोग करें
  • प्रॉक्सी हेडर या ब्राउज़र ऐडऑन जो HTTP हेडर जोड़ता है, ठीक होना चाहिए यदि आप प्रॉक्सी को सुरक्षित कर सकते हैं और MITM हमलों के बारे में चिंतित नहीं हैं तो ट्रैफ़िक को सूँघ सकते हैं
  • रहस्यों को शामिल करने वाला कोई भी समाधान दैनिक आधार पर रहस्यों को घुमाकर लीक के प्रभाव को कम कर सकता है

ये समाधान फ्रंट एंड वेब क्लाइंट पर लागू नहीं होते हैं। अगर एपीआई तक पहुँच बैकएंड पर थी तो बिल्कुल सही।
जेसन वाल्ड्रिप

@ हसन वे सभी एक
सीमा पर

2

कई खातों को सेटअप करें, और उनमें से प्रत्येक को हर अनुरोध पर यादृच्छिक रूप से चुनें, या जो आप हर घंटे का उपयोग करते हैं उसे बदल दें। इस तरह से आप अपने nखाते में लोड को वितरित कर सकते हैं, जो आपको दे सकता हैn कई बार उच्च सीमा है।

यदि आप अन्य उपयोगकर्ताओं को ऐसा करने की कोशिश कर रहे हैं, तो इसे गलती से बंद करने के बारे में सावधान रहें, यदि यह ग्राहकों के लिए अनुमति नहीं है।

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