Saya tidak sepenuhnya mengerti bagaimana saya harus mendapatkan alamat IP pengguna jarak jauh.
Katakanlah saya memiliki rute permintaan sederhana seperti:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
Apakah pendekatan di atas benar untuk mendapatkan alamat IP pengguna yang sebenarnya atau apakah ada cara yang lebih baik? Dan bagaimana dengan proxy?
node.js
express
ip
ip-address
Erik
sumber
sumber
Jawaban:
Jika Anda menjalankan di belakang proxy seperti NGiNX atau apa pun yang Anda miliki, hanya dengan demikian Anda harus memeriksa 'x-forwarded-for':
Jika proksi tersebut bukan 'milikmu', saya tidak akan mempercayai tajuk 'x-forwarded-for', karena dapat dipalsukan.
sumber
proxy_set_header X-Forwarded-For $remote_addr;
ke dalam konfigurasi nginx Anda jika Anda menggunakan proxy terbalik Anda sendiri.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();
mendapatkan IP klien.Sementara jawaban dari karya @alessioalex, ada cara lain sebagaimana tercantum dalam Ekspres belakang proxy bagian dari Express - panduan .
app.set('trust proxy', true)
ke kode inisialisasi ekspres Anda.req.ip
ataureq.ips
dengan cara biasa (seolah-olah tidak ada proxy terbalik)Bacaan opsional:
req.ip
ataureq.ips
.req.connection.remoteAddress
tidak bekerja dengan solusi ini.'trust proxy'
tersedia jika Anda membutuhkan sesuatu yang lebih canggih daripada memercayai semua yang dilewati dix-forwarded-for
header (misalnya, ketika proxy Anda tidak menghapus header x-forwarded-for-existing yang sudah ada dari sumber yang tidak terpercaya). Lihat panduan tertaut untuk detail lebih lanjut.x-forwarded-for
tajuk, ada dua kemungkinan.proxy_set_header X-Forwarded-For $remote_addr;
konfigurasi Anda.sumber
app.enable('trust proxy')
berfungsi juga untuk digunakanreq.ip
. Kecuali saya mendapatkan port dengan itu1.2.3.4:56789
. Untuk menghapus itu, saya lakukanvar ip = req.ip.split(':')[0]
Dalam
nginx.conf
file:proxy_set_header X-Real-IP $remote_addr;
Dalam
node.js
file server:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
perhatikan bahwa tajuk huruf kecil express
sumber
req.headers['x-real-ip']
bahkan di bawahnginx.conf
header diatur dengan huruf kapital.Khusus untuk node, dokumentasi untuk komponen server http, di bawah koneksi acara mengatakan:
Jadi, itu artinya
request.connection
soket dan menurut dokumentasi memang ada atribut socket.remoteAddress yang menurut dokumentasi adalah:Di bawah express, objek permintaan juga merupakan instance dari objek permintaan Node http, jadi pendekatan ini harus tetap berfungsi.
Namun, di bawah Express.js permintaan sudah memiliki dua atribut: req.ip dan req.ips
Mungkin perlu disebutkan bahwa, menurut pemahaman saya, Ekspres
req.ip
adalah pendekatan yang lebih baik daripadareq.connection.remoteAddress
, karenareq.ip
berisi ip klien yang sebenarnya (asalkan proksi tepercaya diaktifkan secara ekspres), sedangkan yang lain mungkin berisi alamat IP proksi (jika ada satu).Itulah alasan mengapa jawaban yang diterima saat ini menyarankan:
Ini
req.headers['x-forwarded-for']
akan menjadi setara dengan expressreq.ip
.sumber
app.set('trust proxy', true)
req.ip
ataureq.ips
dengan cara biasasumber
Ini hanya informasi tambahan untuk jawaban ini .
Jika Anda menggunakan
nginx
, Anda akan menambahproxy_set_header X-Real-IP $remote_addr;
blok lokasi untuk situs tersebut./etc/nginx/sites-available/www.example.com
sebagai contoh. Berikut adalah contoh blok server.Setelah memulai ulang
nginx
, Anda akan dapat mengakses ip di rutenode
/express
aplikasi Anda denganreq.headers['x-real-ip'] || req.connection.remoteAddress;
sumber
Menurut Express di belakang proksi ,
req.ip
telah mempertimbangkan proksi terbalik akun jika Anda telah mengonfigurasitrust proxy
dengan benar. Oleh karena itu lebih baik daripadareq.connection.remoteAddress
yang diperoleh dari lapisan jaringan dan tidak mengetahui proxy.sumber
Saya menulis paket untuk tujuan itu. Anda dapat menggunakannya sebagai middleware ekspres. Paket saya diterbitkan di sini: https://www.npmjs.com/package/express-ip
Anda dapat menginstal modul menggunakan
Pemakaian
sumber
Saya tahu pertanyaan ini telah dijawab, tetapi beginilah cara saya mengerjakannya.
sumber
Jika Anda baik-baik saja menggunakan perpustakaan pihak ke-3. Anda dapat memeriksa permintaan-ip .
Anda dapat menggunakannya dengan
Kode sumbernya cukup panjang, jadi saya tidak akan menyalin di sini, Anda dapat memeriksa di https://github.com/pbojinov/request-ip/blob/master/src/index.js
Pada dasarnya,
Diungkapkan: Saya tidak terkait dengan perpustakaan.
sumber
Ini bekerja untuk saya lebih baik daripada yang lain. Situs saya ada di belakang CloudFlare dan sepertinya diperlukan
cf-connecting-ip
.Tidak menguji Express di belakang proxy karena tidak mengatakan apa-apa tentang
cf-connecting-ip
header ini .sumber
Dengan dukungan can-suar, nginx dan x-real-ip
sumber
Dalam kasus saya, mirip dengan solusi ini , saya akhirnya menggunakan pendekatan x-forwarded-for berikut :
x-forwarded-for
header akan terus menambahkan rute IP dari asal sampai ke server tujuan akhir, jadi jika Anda perlu mengambil IP klien asal, ini akan menjadi item pertama dari array.sumber
var ip = req.connection.remoteAddress;
ip = ip.split (':') [3];
sumber
ip = ip.split(':').pop();
akan menjadi adonan dalam hal ini jika ip normal yaitu 127.0.0.1 akan datang Ini masih akan dapat memberi Anda ip.Objek header memiliki semua yang Anda butuhkan, lakukan saja ini:
sumber
Menyatukan semua solusi witk @kakopappa plus
morgan
logging dari alamat ip klien:sumber