如何获取Tornado请求的客户端IP?

mik*_*ana 31 python tornado

我有一个RequestHandler传入post()的对象.如何找到发出请求的客户端的IP?我浏览了大部分RequestHandler的方法和属性,似乎错过了一些东西.

myk*_*hal 49

RequestHandler.request.remote_ip (来自RequestHandler的实例)

你可以检查响应,如:

...
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write(repr(self.request))
...
Run Code Online (Sandbox Code Playgroud)


3k-*_*3k- 30

mykhal的答案是正确的,但有时你的应用程序将在代理后面,例如,如果你使用nginx和UWSGI,你将总是获得类似127.0.0.1远程IP的东西.在这种情况下,您还需要检查标题,例如:

remote_ip = self.request.headers.get("X-Real-IP") or \
            self.request.headers.get("X-Forwarded-For") or \
            self.request.remote_ip
Run Code Online (Sandbox Code Playgroud)

  • remote_ip = x_real_ip或self.request.remote_ip (4认同)
  • 但是,如果您不在此类代理后面并使用该逻辑,则攻击者可以通过发送“X-Real-IP”标头来伪造客户端 IP 地址。 (3认同)
  • @itzhaki @ 3k但文档(http://www.tornadoweb.org/en/stable/httputil.html#tornado.httputil.HTTPServerRequest.remote_ip)表示“如果设置了HTTPServer.xheaders,则会传递提供的真实IP地址由X-Real-Ip或X-Forwarded-For标头中的负载平衡器”。因此,“ remote_ip”是头文件中“ X-Real-Ip”或“ X-Forwarded-For”的最后返回。 (2认同)