2010-08-09 12 views
5

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

धन्यवाद & सादर,

कातर।

उत्तर

3

आपको गलत समझ में आता है कि सेवा का क्या मतलब है। एक उदाहरण इस तरह की दर पर पहुंचने वाले एक वेब-सर्वर पर बड़ी संख्या में HTTP अनुरोध होंगे कि वेब-सर्वर सॉफ़्टवेयर इतना व्यस्त हो जाता है कि यह नए टीसीपी कनेक्शन स्वीकार नहीं कर सकता है। विकिपीडिया का DoS पर एक सभ्य लेख है, इसे पढ़ें।

recv(2) सिर्फ एक एपीआई है। इसका दुरुपयोग, किसी अन्य बग के रूप में, डीओएस समेत मुद्दों का कारण बन सकता है। लेकिन इसका मतलब यह नहीं है कि आपको इससे बचना चाहिए। आपकी समस्या को अन्य सॉकेट ब्लॉक कर रहा है, जबकि पढ़ने पर इंतजार कर, select(2), poll(2), और epoll(4) में के रूप में गैर अवरुद्ध सॉकेट और आई/ओ बहुसंकेतन पर गौर।

+1

हाँ मैं जानना चाहता हूं कि क्या मैं recv() का उपयोग करता हूं, क्या यह डीओएस का कारण बन सकता है? चूंकि सर्वर लंबे समय तक प्रतीक्षा कर सकता है। उदाहरण के लिए यदि मेरा संदेश आकार बहुत बड़ा है। – mousey

+0

ध्यान दें कि सॉकेट पर टाइमआउट सेट कर सकते हैं और आरईवी पर अधिकतम बफर आकार सेट कर सकते हैं, इसलिए दुर्व्यवहार के अवसर सीमित हो सकते हैं। मुझे लगता है कि अगर आपके पास एक ही प्रक्रिया है तो एक अवांछित सहकर्मी आपको सेवा बाधाओं के इनकार के रूप में धीरे-धीरे कई बाइट भेज सकता है ... – MZB

1

हां, recv() अनिश्चित काल तक अवरुद्ध कर सकता है। आपको कुछ प्रकार के समय को लागू करने की आवश्यकता है।

मैं boost asio library का उपयोग करने की सलाह दूंगा। इसमें टाइमर जैसी चीजें शामिल हैं जो सॉकेट कनेक्शन के साथ सहजता से काम करती हैं और घटनाएं प्राप्त करती हैं। बस एक एसिंक्रोनस सॉकेट सेट करें, टाइमर जोड़ें, और समय समाप्त होने पर तोड़ दें।

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

1

यदि आप ब्लॉकिंग सॉकेट का उपयोग कर रहे हैं तो SO_SNDTIMEO और SO_RCVTIMEO setsockopt() विकल्पों के साथ भेजें() और recv() टाइमआउट को समायोजित करने में देखें।

उचित सर्वर बनाने में बहुत कम जटिलताएं हैं, मैं भीख मांगने, उधार लेने या चोरी करने के बारे में सोचूंगा। यहां एक sample multithreaded socket server है।

यदि आपके पास दोनों तरफ (क्लाइंट और सर्वर सॉकेट सॉफ़्टवेयर) पर नियंत्रण है तो मैं एक प्रोटोकॉल तैयार करूंगा जिसमें संदेश की लंबाई 2 या 4 बाइट्स के रूप में पास की जाएगी, इस तरह आप बस संख्या को उस डीकोड के लिए अवरुद्ध करना होगा और बाइट्स की संख्या समाप्त होने तक पढ़ना जारी रखें। क्लाइंट और सर्वर दोनों के लिए ऐसा करें और यह आपके कोड को बहुत आसान बना देगा।

संबंधित मुद्दे