req.connection.remoteAddress, req.headers ['x-forwarded-for'], req.ip, req.ips, что все это значит?
Есть ли прямой способ просто получить IP-адрес клиента/пользователя-агента, делающего запрос на мой сайт в Node.js/Express? Я не понимаю все прокси-материалы или все различия между всеми свойствами объекта req. Кроме того, я не понимаю, что такое "доверенный прокси" для Express.
Может кто-нибудь дать мне прямое объяснение тому, что разница между всеми этими свойствами, и ответить, как я могу просто получить IP-адрес клиента?
req.ip
- это простой способ получить IP-адрес клиента в Express. Вы можете увидеть используемую им логику (которая включает захват первого элемента из массива прокси-адресов req.ips
, где этот массив построен из заголовков x-forwarded-for
) здесь.
// Get client IP address from request object ----------------------
getClientAddress = function (req) {
return (req.headers['x-forwarded-for'] || '').split(',')[0]
|| req.connection.remoteAddress;
};
req
object, я имею в виду, что мы будем там предоставлять?
req.headers['x-forwarded-for']
легко манипулируется на ПК, если вы не разместили свой сервер Node.JS за доверенным и правильно настроенным прокси-сервером. Вы должны сначала проверить req.connection.remoteAddress
по списку известных доверенных прокси-серверов, прежде чем уважать req.headers['x-forwarded-for']
.
очень просто
function getClientIP(req){
return req.headers['x-forwarded-for'] || req.connection.remoteAddress;
}
app.enable('trust proxy');
в моем файле server.ts сразу после import { serverApi, createTodoApi } from './backend/api'; app.get('/data.json', serverApi); app.use('/api', createTodoApi());
следующего кода import { serverApi, createTodoApi } from './backend/api'; app.get('/data.json', serverApi); app.use('/api', createTodoApi());
и доступ к переменным req.ip
в моем файле backend / api.ts. Где его возвращение ::ffff:127.0.0.1
, который не является действительным IP-адресом для извлечения местоположения из него. Ждем вашего ответа. Спасибо!
Как отмечали другие, из-за использования потенциального использования прокси, вы действительно должны использовать req.ip и НЕ использовать заголовок X-Forwarded-For, как это рекомендует многие люди. Пока вы правильно настроите прокси-сервер в качестве доверенного прокси, req.ip всегда будет возвращать IP-адрес конечного пользователя.
например. Если у вас был прокси-сервер, подключавшийся из 8.8.8.8, вы бы сделали:
var express = require('express');
var app = express();
app.set('trust proxy', '8.8.8.8');
Так как вы доверяете прокси-серверу, теперь это сделает так, что то, что передается в заголовке X-Forwarded-For, будет храниться в req.ip, но ТОЛЬКО, если оно происходит от одного из доверенных прокси.
Подробнее о доверенном прокси можно найти здесь.
Теперь, как отмечали другие в комментариях; особенно при разработке локально вы можете получить ip в формате ":: ffff: 127.0.0.1".
Чтобы всегда получать адрес IPv4, у меня есть:
getClientAddress = function (req) {
return req.ip.split(":").pop();
};
Получение IP-адреса клиента довольно просто:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
console.log(ip);
req.headers['x-forwarded-for']
легко манипулируется на ПК, если вы не разместили свой сервер Node.JS за доверенным и правильно настроенным прокси-сервером. Вы должны сначала проверить req.connection.remoteAddress
по списку известных доверенных прокси-серверов, прежде чем уважать req.headers['x-forwarded-for']
. Если задействовано несколько прокси, то req.headers['x-forwarded-for']
может содержать список через запятую.