Cara Mengambil IP Asli Klien di Flask dengan X-Forwarded-For

Mengapa Flask Membutuhkan X-Forwarded-For

Saat aplikasi Flask berjalan di balik proxy (seperti Nginx, Apache, atau Cloudflare), objek request.remote_addr secara default hanya akan menangkap IP dari proxy tersebut, bukan IP asli pengunjung. Header X-Forwarded-For adalah standar HTTP yang digunakan untuk meneruskan alamat IP asli klien melalui rantai proxy.

Untuk menangani ini secara aman di Flask, Anda wajib menggunakan ProxyFix dari pustaka werkzeug.middleware.proxy_fix. Tanpa middleware ini, aplikasi Anda rentan terhadap pemalsuan IP karena header X-Forwarded-For dapat dimanipulasi oleh pengguna jahat.

Implementasi ProxyFix

Berikut adalah cara mengonfigurasi aplikasi Flask agar secara otomatis membaca header proxy dengan benar:

from flask import Flask, request
from werkzeug.middleware.proxy_fix import ProxyFix

app = Flask(__name__)

# num_proxies adalah jumlah hop proxy sebelum aplikasi Anda
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1)

@app.route('/')
def index():
    # Sekarang request.remote_addr akan berisi IP asli klien
    return f"IP Asli Anda: {request.remote_addr}"

Tabel Konfigurasi ProxyFix

ParameterDeskripsiRekomendasi
x_forJumlah hop X-Forwarded-For1 (jika 1 layer proxy)
x_protoJumlah hop X-Forwarded-Proto1
x_hostJumlah hop X-Forwarded-Host1
x_portJumlah hop X-Forwarded-Port1

Peringatan Keamanan

Jangan pernah mempercayai header X-Forwarded-For secara mentah tanpa middleware. Jika Anda tidak menggunakan ProxyFix, seorang penyerang dapat mengirim header X-Forwarded-For: 1.2.3.4 secara manual untuk menipu aplikasi Anda agar mengira mereka berasal dari IP tersebut. ProxyFix memastikan bahwa hanya header yang berasal dari proxy terpercaya yang diproses.

Langkah Troubleshooting

  • Pastikan Proxy Mengirim Header: Cek konfigurasi Nginx Anda. Pastikan terdapat baris proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;.
  • Cek Jumlah Hop: Jika Anda menggunakan Cloudflare di depan Nginx, Anda mungkin perlu mengatur x_for=2 karena ada dua layer proxy.
  • Log Aplikasi: Gunakan logging untuk mencetak request.headers.get('X-Forwarded-For') guna memastikan data sampai ke aplikasi.