Nie do końca rozumiem, jak powinienem uzyskać adres IP użytkownika zdalnego.
Powiedzmy, że mam prostą trasę żądania, taką jak:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
Czy powyższe podejście jest prawidłowe, aby uzyskać rzeczywisty adres IP użytkownika, czy istnieje lepszy sposób? A co z proxy?
node.js
express
ip
ip-address
Erik
źródło
źródło
Odpowiedzi:
Jeśli korzystasz z proxy, takiego jak NGiNX lub co masz, tylko wtedy powinieneś sprawdzić „x-forwarded-for”:
Jeśli proxy nie jest „twoje”, nie ufałbym nagłówkowi „x-forwarded-for”, ponieważ można go sfałszować.
źródło
proxy_set_header X-Forwarded-For $remote_addr;
do konfiguracji nginx na wypadek korzystania z własnego odwrotnego proxy.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();
aby uzyskać adres IP klienta.Podczas gdy odpowiedź z @alessioalex działa, istnieje inny sposób, jak podano w Express za sekcją proxy w Express - przewodnik .
app.set('trust proxy', true)
do ekspresowego kodu inicjalizacji.req.ip
lubreq.ips
w zwykły sposób (tak jakby nie było odwrotnego proxy)Opcjonalne czytanie:
req.ip
lubreq.ips
.req.connection.remoteAddress
nie działa z tym rozwiązaniem.'trust proxy'
dostępnych jest, jeśli potrzebujesz czegoś bardziej wyrafinowanego niż ufanie, że wszystko przeszłox-forwarded-for
nagłówku (na przykład, gdy twój serwer proxy nie usuwa wcześniej istniejącego nagłówka przekierowanego x z niezaufanych źródeł). Więcej informacji można znaleźć w połączonym przewodniku.x-forwarded-for
nagłówka, istnieją dwie możliwości.proxy_set_header X-Forwarded-For $remote_addr;
do konfiguracji.źródło
app.enable('trust proxy')
również działa, aby go użyćreq.ip
. Tyle że dostaję port1.2.3.4:56789
. Aby to rozebrać, robię tovar ip = req.ip.split(':')[0]
W
nginx.conf
pliku:proxy_set_header X-Real-IP $remote_addr;
W
node.js
pliku serwera:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
zwróć uwagę, że wyrażaj małe litery w nagłówkach
źródło
req.headers['x-real-ip']
nawet wnginx.conf
nagłówku ustawionym wielkimi literami.Dokumentacja komponentu serwera http, szczególnie dla węzła, w przypadku połączenia ze zdarzeniem mówi:
Oznacza
request.connection
to , że jest to gniazdo i zgodnie z dokumentacją rzeczywiście istnieje atrybut socket.remoteAddress, który zgodnie z dokumentacją to:W trybie express obiekt żądania jest również instancją obiektu żądania Node http, więc to podejście powinno nadal działać.
Jednak w Express.js żądanie ma już dwa atrybuty: req.ip i req.ips
Warto wspomnieć, że moim zdaniem Express
req.ip
jest lepszym podejściem niżreq.connection.remoteAddress
od tamtej poryreq.ip
zawiera rzeczywisty adres IP klienta (pod warunkiem, że zaufane proxy jest włączone w trybie ekspresowym), podczas gdy drugi może zawierać adres IP proxy (jeśli istnieje jeden).Z tego powodu obecnie akceptowana odpowiedź sugeruje:
req.headers['x-forwarded-for']
Będzie równowartość wyraźnejreq.ip
.źródło
app.set('trust proxy', true)
req.ip
lubreq.ips
w zwykły sposóbźródło
To tylko dodatkowe informacje na temat tej odpowiedzi .
Jeśli używasz
nginx
, dodajeszproxy_set_header X-Real-IP $remote_addr;
do bloku lokalizacji dla witryny./etc/nginx/sites-available/www.example.com
na przykład. Oto przykładowy blok serwera.Po ponownym uruchomieniu
nginx
będziesz mógł uzyskać dostęp do adresu IP na trasachnode
/express
aplikacji za pomocąreq.headers['x-real-ip'] || req.connection.remoteAddress;
źródło
Według Express za serwerami proxy ,
req.ip
wziął pod uwagę odwrotny serwer proxy, jeślitrust proxy
poprawnie skonfigurowałeś . Dlatego jest lepszy niż ten,req.connection.remoteAddress
który jest uzyskiwany z warstwy sieci i nieświadomy proxy.źródło
W tym celu napisałem paczkę. Możesz użyć go jako ekspresowego oprogramowania pośredniego. Mój pakiet został opublikowany tutaj: https://www.npmjs.com/package/express-ip
Możesz zainstalować moduł za pomocą
Stosowanie
źródło
Wiem, że odpowiedziano na to pytanie, ale oto jak dostałem moje do pracy.
źródło
Jeśli wszystko w porządku, korzystając z biblioteki innej firmy. Możesz sprawdzić request-ip .
Możesz go użyć jest przez
Kod źródłowy jest dość długi, więc nie będę tutaj kopiować, możesz sprawdzić na https://github.com/pbojinov/request-ip/blob/master/src/index.js
Gruntownie,
Ujawnij: Nie jestem powiązany z biblioteką.
źródło
To działało dla mnie lepiej niż reszta. Moje strony stoją za CloudFlare i wydaje się, że wymaga
cf-connecting-ip
.Nie testowałem Express za serwerami proxy, ponieważ nic nie mówiło o tym
cf-connecting-ip
nagłówku.źródło
Z obsługą Flare, Nginx i X-Real-IP
źródło
W moim przypadku, podobnie jak w przypadku tego rozwiązania, ostatecznie zastosowałem następujące podejście X-forwarded-for :
x-forwarded-for
nagłówek będzie kontynuował dodawanie trasy adresu IP od źródła aż do końcowego serwera docelowego, więc jeśli chcesz pobrać adres IP klienta pochodzenia, byłby to pierwszy element tablicy.źródło
var ip = req.connection.remoteAddress;
ip = ip.split (':') [3];
źródło
ip = ip.split(':').pop();
w tym przypadku będzie lepiej, jeśli przyjdzie normalne IP, tj. 127.0.0.1. Nadal będzie w stanie dać ci ip.Obiekt nagłówków ma wszystko, czego potrzebujesz, po prostu zrób to:
źródło
Łączenie wszystkich rozwiązań witk @kakopappa plus
morgan
logowanie adresu IP klienta:źródło