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
| Parameter | Deskripsi | Rekomendasi |
|---|---|---|
| x_for | Jumlah hop X-Forwarded-For | 1 (jika 1 layer proxy) |
| x_proto | Jumlah hop X-Forwarded-Proto | 1 |
| x_host | Jumlah hop X-Forwarded-Host | 1 |
| x_port | Jumlah hop X-Forwarded-Port | 1 |
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=2karena ada dua layer proxy. - Log Aplikasi: Gunakan
logginguntuk mencetakrequest.headers.get('X-Forwarded-For')guna memastikan data sampai ke aplikasi.