我试图检查一个用户来自我的网站的网站,反对允许域名的白名单:
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
答案 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。