2012-10-07 20 views

Trả lời

28

Nếu có một proxy trước Flask, sau đó một cái gì đó như thế này sẽ nhận được IP thật trong Flask:

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

Cập nhật: điểm rất tốt được đề cập bởi Eli trong bình luận của ông. Có thể có một số vấn đề bảo mật nếu bạn chỉ cần sử dụng điều này. Đọc Eli's post để biết thêm chi tiết.

+7

Đây là lời khuyên nguy hiểm. Webfaction * gắn thêm địa chỉ thực vào X-Forwarded-Vì vậy, sử dụng mã này - chọn địa chỉ đầu tiên trong danh sách - cho phép người dùng độc hại giả mạo địa chỉ IP của họ tới * bất kỳ chuỗi tùy ý nào *. Xem http://esd.io/blog/flask-apps-heroku-real-ip-spoofing.html để thảo luận lâu hơn và nỗ lực của tôi tại giải pháp. – Eli

+0

Rất tốt điểm Eli. Thêm ghi chú vào câu trả lời với liên kết tới bài đăng của bạn. –

+0

Không chắc lắm về điều đó. http://docs.webfaction.com/software/django/troubleshooting.html#accessing-remote-addr (có vẻ như nó sử dụng [0], nhưng điểm của bạn vẫn chính xác không chỉ cho webfaction tôi nghĩ) – Dexter

3

Vấn đề là có thể có một số loại proxy trước mặt Flask. Trong trường hợp này, địa chỉ IP "thực" thường có thể được tìm thấy trong request.headers['X-Forwarded-For'].

+0

Tốt tip, tôi đã sử dụng đó và có giải pháp. Đăng nó như một câu trả lời. –

1

Viết lại câu trả lời của Ignas:

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

Hãy nhớ đọc Eli's post về cân nhắc giả mạo.

+0

Có đoạn mã đẹp hơn (tôi thân thiện hơn với newbie: D) nhưng nó vẫn có những vấn đề tương tự đã được đề cập bởi những người khác, vì vậy hãy cẩn thận. –

2

Bạn có thể sử dụng request.access_route để truy cập danh sách các ip:

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

Cập nhật:

Bạn có thể chỉ cần viết này:

return request.access_route[-1] 
+2

Bạn không thực sự cần kiểm tra độ dài ở đây - 'some_list [-1] == some_list [0]' trên danh sách độ dài –

+0

Nó không phải là danh sách độ dài duy nhất. nó có thể có nhiều hơn một mục trong đó. – itmard

+1

@itmard Tôi nghĩ rằng điểm tristan của @ là mục cuối cùng luôn có thể truy cập được đối với các danh sách có> = 1 mục. Vì vậy, mã luôn có thể được viết dưới dạng 'request.access_route [-1]' để lấy IP cuối cùng trong danh sách. – tutuDajuju

Các vấn đề liên quan