2016-07-30 3 views
0

Я задаюсь вопросом, требуется ли проверять поля, такие как req.ip или req.path на стороне сервера.
Это сводится к вопросу: возможно ли, чтобы клиент установил что-то вроде .set('Remote-Addr', <Malicious JavaScript>) и успешно ли он был распространен на мое промежуточное программное обеспечение Node или Express?Узел и Экспресс проверяют определенные поля запроса?

Спасибо за помощь!

+0

Ну, вы не должны делать 'eval (req.ip)', если это то, о чем вам интересно. Но использование строки в req.ip, поскольку только строка должна быть безопасной Существует множество способов для клиента обманывать свой реальный IP-адрес (например, прокси), поэтому вы никогда не сможете предположить, что 'req.ip' является фактическим IP-адресом клиента и там это не значит, что Express/Node проверяет, что такое реальный клиентский IP-адрес. – jfriend00

+0

Спасибо за комментарий. Яркий Javascript был всего лишь примером. Конкретный вариант использования заключается в том, что мы регистрируем ip в базе данных и хотим убедиться, что вставляются только действительные ip. Итак, из вашего примера я полагаю, что выражение и узел не проверяют поля запроса, правильно? – FunkyPeanut

+0

Невозможно проверить правильность IP-адреса источника, особенно при использовании прокси. В случае с прокси-сервером цепочка IP-адресов должна быть помещена в заголовки http, но это, безусловно, может быть фальсифицировано, так что то, что выражает, является исходным IP, нельзя доверять. Это, скорее всего, точно, но не гарантируется точность. – jfriend00

ответ

0

Невозможно проверить исходный IP-адрес, особенно при использовании прокси. В случае с прокси-сервером цепочка IP-адресов должна быть помещена в заголовки http, но это, безусловно, может быть фальсифицировано, так что то, что выражает, является исходным IP, нельзя доверять. Это, скорее всего, точно, но не гарантируется точность.

req.path полностью локальный и не включает в себя какие-либо заголовки клиентов и не подлежит никакому подмену клиента. Он исходит только от фактического URL-адреса HTTP-запроса, который поступает на ваш сервер. Единственный способ, которым он не был бы таким же, как фактический URL-адрес запроса, - это использовать точку монтирования для маршрутизаторов, и в этом случае часть точки монтирования пути будет удалена экспресс. Или, может быть, если ваше собственное промежуточное ПО попытается с ним связать.

+0

Спасибо большое. Вы, конечно, совершенно правы, и я должен был быть более ясным в своем вопросе. Речь идет не о проверке семантики информации IP (то есть, является ли она правильной), а скорее ее формальным представлением, поскольку мы регистрируем их в базе данных. Например: кто-то подделывает заголовок IP-адреса, чтобы содержать какой-то JavaScript. Мы сохраняем его в базе данных и позже (при условии целостности нашего db) выводим его в браузер, где он выполняется. Ваши заметки о 'req.path' были полезны. Благодарю. И поскольку вы косвенно ответили на мой вопрос в комментариях, я отмечу это как ответ. – FunkyPeanut

+1

@FunkyPeanut - Если вы поместите этот фактический вариант использования (вставляя адрес ip обратно в веб-страницу) в свой вопрос, вы получили бы гораздо более целенаправленный ответ. Пожалуйста, всегда описывайте реальную проблему, а не задавайте общий вопрос. Мы гораздо больше ориентируемся на цель, когда вы описываете актуальную проблему, о которой вы беспокоитесь. – jfriend00

+0

Вы абсолютно правы. Я буду помнить об этом, спасибо. – FunkyPeanut