2012-10-07 7 views
16

मैंने अभी वेबफैक्शन पर एक फ्लास्क ऐप तैनात किया है और मैंने देखा है कि request.remote_addr हमेशा 127.0.0.1 है। जो निश्चित रूप से अधिक उपयोग नहीं है।फ्लास्क request.remote_addr वेबफैक्शन पर गलत है और वास्तविक उपयोगकर्ता आईपी नहीं दिखा रहा है

मैं फ्लास्क ऑन वेबफैक्शन में उपयोगकर्ता का वास्तविक आईपी पता कैसे प्राप्त कर सकता हूं?

धन्यवाद!

उत्तर

28

अगर वहाँ बोतल के सामने एक प्रॉक्सी है, तो कुछ इस तरह फ्लास्क में असली आईपी मिल जाएगा:

if request.headers.getlist("X-Forwarded-For"): 
    ip = request.headers.getlist("X-Forwarded-For")[0] 
else: 
    ip = request.remote_addr 

अद्यतन: बहुत अच्छा बिंदु उसकी टिप्पणी में एली ने उल्लेख किया। यदि आप बस इसका उपयोग करते हैं तो कुछ सुरक्षा समस्याएं हो सकती हैं। अधिक जानकारी प्राप्त करने के लिए Eli's post पढ़ें।

+7

यह खतरनाक सलाह है। वेबफैक्शन * एक्स-फॉरवर्ड करने के लिए वास्तविक पता * इस कोड का उपयोग करने के लिए - जो सूची में पहला पता चुनता है - एक दुर्भावनापूर्ण उपयोगकर्ता को उनके आईपी पते को किसी भी मनमानी स्ट्रिंग * को खराब कर देता है। लंबी चर्चा और समाधान के लिए मेरे प्रयास के लिए http://esd.io/blog/flask-apps-heroku-real-ip-spoofing.html देखें। – Eli

+0

बहुत अच्छी बात एली। अपनी पोस्ट के लिंक के साथ उत्तर में नोट जोड़ना। –

+0

इसके बारे में इतना निश्चित नहीं है। http://docs.webfaction.com/software/django/troubleshooting.html#accessing-remote-addr (ऐसा लगता है कि यह [0] का उपयोग करता है, लेकिन आपका बिंदु अभी भी वेबफैक्शन के लिए सही नहीं है) – Dexter

3

समस्या यह है कि फ्लास्क के सामने शायद कुछ प्रकार की प्रॉक्सी है। इस मामले में "वास्तविक" आईपी पता अक्सर request.headers['X-Forwarded-For'] में पाया जा सकता है।

+0

अच्छा टिप, मुझे लगता है कि इस्तेमाल किया और समाधान मिल गया। इसे एक उत्तर के रूप में पोस्ट करना। –

1

Ignas का जवाब नए सिरे से लिखना:

headers_list = request.headers.getlist("X-Forwarded-For") 
user_ip = headers_list[0] if headers_list else request.remote_addr 

स्पूफिंग विचार के बारे में Eli's post पढ़ने के लिए याद रखें।

+0

के लिए हाँ कोड अधिक सुंदर है (मेरा अधिक नौसिखिया मित्रवत था: डी) लेकिन यह अभी भी वही समस्याएं हैं जो पहले से ही अन्य लोगों द्वारा उल्लिखित हैं, इसलिए सावधान रहें। –

2

आप आईपी की सूची एक्सेस करने के लिए request.access_route उपयोग कर सकते हैं:

if len(request.access_route) > 1: 
    return request.access_route[-1] 
else: 
    return request.access_route[0] 

अद्यतन:

तुम सिर्फ यह लिख सकते हैं:

return request.access_route[-1] 
+2

आपको वास्तव में लंबाई की जांच की आवश्यकता नहीं है - 'कुछ_सूची [-1] == कुछ_सूची [0]' एकल लंबाई सूचियों पर –

+0

यह एकल लंबाई सूची नहीं है। इसमें एक से अधिक आइटम हो सकते हैं। – itmard

+1

@itmard मुझे लगता है कि @ ट्रिस्टन का मुद्दा यह है कि आखिरी वस्तु हमेशा = = 1 वस्तुओं के साथ सूचियों के लिए सुलभ होती है। तो सूची में अंतिम आईपी प्राप्त करने के लिए कोड हमेशा 'request.access_route [-1]' के रूप में लिखा जा सकता है। – tutuDajuju

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