从nginx反向代理后面的cherrypy.request获取传入的referer域

时间:2018-05-02 21:01:21

标签: nginx cherrypy nginx-reverse-proxy

我试图检查一个用户来自我的网站的网站,反对允许域名的白名单:

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就不可能,我不能这样做。

有关NGINX反向代理背后的cherrypy的更多一般信息在这里 https://www.digitalocean.com/community/tutorials/how-to-deploy-cherrypy-web-applications-behind-nginx-reverse-proxy

1 个答案:

答案 0 :(得分:1)

简短的回答是,Nginx不应该让我掩饰这个引用者。 Nginx将屏蔽Host头,您需要使用代理工具,以便根据原始代理发送的主机设置cherrypy.request.remote.ip和cherrypy.request.base。但是Referer应该保持不变。

您的托管服务提供商可能会删除引用标头(但似乎不太可能)。

例如,我有一个服务将使用此处理程序回显请求标头:

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

该服务器位于Nginx后面,当我使用referer向它发出请求时,我在输出中看到它:

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"}

因此,您显示的实现看起来应该对我有用。

但是,你应该小心。正如您所看到的,攻击者可以轻松地提供他们想要的任何旧Referer。