Получить входящий домен реферера от cherrypy.request за обратным прокси-сервером nginx - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь проверить сайт, с которого только что зашел пользователь на мой сайт, по белому списку разрешенных доменов:

import cherrypy
import urlparse
referer = cherrypy.request.headers.get('Referer','/').lower()
domain = urlparse.urlparse(referer).netloc
if domain in ('mysite.org','whitelistedsite.com'):
    ... do stuff ...

Но моя вишня сидит за NGINX (как обратный прокси), поэтому я ничего не получаю назад.

 ('X-Forwarded-Host', 'this.org')
 ('Host', 'this.org')

Как я могу обойти это? Или это невозможно без редактирования NGINX, чего я не могу сделать.

Более общая информация о cherrypy за обратным прокси NGINX находится здесь https://www.digitalocean.com/community/tutorials/how-to-deploy-cherrypy-web-applications-behind-nginx-reverse-proxy

1 Ответ

0 голосов
/ 05 июня 2018

Короткий ответ: Nginx не должен маскировать реферера. Nginx замаскирует заголовок хоста, и вам необходимо использовать прокси-инструмент, чтобы параметры cherrypy.request.remote.ip и cherrypy.request.base были установлены на основе хоста, отправленного исходным агентом. Но Реферер должен быть передан без изменений.

Возможно (хотя кажется маловероятным), что ваш хостинг-провайдер удалит заголовок реферера.

Например, у меня есть служба, которая выводит заголовки запроса с этим обработчиком:

class System: @cherrypy.expose def headers(self): return cherrypy.request.headers

Этот сервер находится за Nginx, и когда я делаю запрос к нему с помощью реферера, я вижу его в выводе:

proj master $ curl https://api.tentob.com/system/headers/ -H 'Referer: jaraco did it' {"Remote-Addr": "::1", "Host": "svc.example.com", "X-Real-Ip": "99.99.99.99", "X-Forwarded-For": "99.99.99.99", "X-Forwarded-Host": "svc.example.com", "X-Forwarded-Proto": "https", "Connection": "close", "User-Agent": "curl/7.54.0", "Accept": "*/*", "Referer": "jaraco did it"}

Итак, ваша реализация, как показано, выглядит так, как будто она должна работать для меня.

Вы должны быть осторожны, хотя. Как вы можете видеть, злоумышленнику было бы несложно предоставить любого старого Реферера, которого он пожелает.

...