2009-04-15 14 views
27

यदि अनुरोध है। सर्वरवारीबल्स ["HTTP_X_FORWARDED_FOR"] एकाधिक आईपी देता है, मैं कौन सा लेता हूं और मैं इसे सी # में कैसे करूं? यह मेरी समझ है कि यदि यह खाली या शून्य है, तो क्लाइंट कंप्यूटर प्रॉक्सी से नहीं जा रहा है और मैं सिर्फ अपने आईपी को Request.ServerVariables ["REMOTE_ADDR"] से प्राप्त कर सकता हूं। क्या यह एक सही बयान है?यदि मैं एकाधिक आईपी पते वाले HTTP_X_FORWARDED_FOR से सही आईपी कैसे प्राप्त करूं?

"मैं कौन सा लेता हूं" से, मेरा मतलब है कि मैं सूची में पहला आईपी या अंतिम आईपी लेता हूं और मुझे बस इतना करना है कि इसे सिर्फ एक सरणी में विभाजित करें और मुझे वह चाहिए जो मैं चाहता हूं। मुझे सच में यकीन नहीं है कि HTTP_X_FORWARDED_FOR कैसे काम करता है।

उत्तर

35

this के अनुसार, के प्रारूप X-Forwarded-के लिए HTTP शीर्ष लेख है:

X-Forwarded-For: client1, proxy1, proxy2, ... 

ताकि आप चाहते हैं क्लाइंट का IP पता सूची

3

मैं में पहली से एक होना चाहिए कुछ समय पहले एक बहुत ही समान सवाल पूछा।

Getting the client IP address: REMOTE_ADDR, HTTP_X_FORWARDED_FOR, what else could be useful?

के रूप में सही ढंग से कहा, आपको पहले मूल्य यह ग्राहक के आईपी पते समझकर ले सकते हैं। लेकिन यह कंपनी गेटवे आईपी भी हो सकता है।

और गुमनाम प्रॉक्सी वैसे भी इस शीर्षक में जानकारी का सफाया होगा, तो यह उपयोगी है, लेकिन विश्वसनीय नहीं है।

2

विश्वसनीयता विषय पर एक और ध्यान दें:

किसी को भी इस तरह के फ़ायरफ़ॉक्स प्लगइन "छेड़छाड़ डेटा" या अपने खुद के स्थानीय प्रॉक्सी (जैसे Privoxy) के रूप में एक उपकरण का उपयोग करके HTTP_X_FORWARDED_FOR बना सकते हैं। इसका मतलब है कि पूरी स्ट्रिंग नकली हो सकती है, और REMOTE_ADDR वास्तविक मूल होस्ट है। इसका अर्थ यह भी हो सकता है कि पहला "क्लाइंट 1" पता फिक्र किया गया है, और उसके बाद क्लाइंट प्रॉक्सी से जुड़ा हुआ है, जिसके परिणामस्वरूप प्रॉक्सी 1 क्लाइंट का आईपी पता है और REMOTE_ADDR एक प्रॉक्सी इस्तेमाल किया जा रहा है।

आप आईपी पर आधारित पहुंचने से रोका जाता देख रहे हैं, मैं XFF शीर्षक में हर आईपी पते की जाँच REMOTE_ADDR के साथ ही सुझाव है।

आप एक आईपी के क्षेत्र के आधार पर पहुँच प्रदान करने के लिए देख रहे हैं, तो मैं पहुंच की अनुमति देते ही अगर XFF खाली है और आईपी उचित क्षेत्र से है सुझाव देना चाहेंगे।

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

आईपी आधारित फ़िल्टरिंग आमतौर पर एक्सेस कंट्रोल का एक सुंदर कच्चा, अंतिम-रिसॉर्ट तंत्र है।

+0

तो सुरक्षा समूह नियमों को कॉन्फ़िगर करने के लिए एडब्ल्यूएस और एज़ूर जैसी कंपनियां आईपी पते पर भरोसा क्यों करती हैं? –

0

वास्तविक ग्राहक आईपी शीर्षलेख मान में बाएं सबसे अधिक आईपी पता होना चाहिए। आप एक regex का उपयोग कर एक वातावरण चर में निकाल सकते हैं:

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1 

नोट 1$ के उपयोग (कोष्ठकों में) regex में पहले समूह की सामग्री को धारण करने के लिए XFFCLIENTIP वातावरण चर सेट करने के लिए।

इसका उपयोग करने के उदाहरण के रूप में, आप चर का उपयोग करने वाले लॉग प्रारूप को परिभाषित कर सकते हैं: यह उदाहरण एक है जिसे हम आंतरिक रूप से निकटतम पर उपयोग करते हैं।कॉम, इसलिए यह अतिरिक्त जानकारी लॉग करता है, लेकिन आप जिस बिट को चाहते हैं वह % {XFFCLIENTIP} ई शुरुआत में है। लाइन के अंत में env = XFFCLIENTIP पर ध्यान दें, जिसका अर्थ है कि यह प्रारूप केवल तभी उपयोग किया जाता है जब पर्यावरण चर सेट हो।

CustomLog /var/log/apache2/access.log "%{XFFCLIENTIP}e \"%{session}C\" \"%{nearmapuid}C\" %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" env=XFFCLIENTIP 
संबंधित मुद्दे