【问题标题】:Restrict access to a Django view, only from the server itself (localhost)仅从服务器本身(本地主机)限制对 Django 视图的访问
【发布时间】:2012-07-27 11:30:44
【问题描述】:

我想在 Django 中创建一个仅限本地主机的 API,并且我正在尝试找到一种方法来限制仅从服务器本身(本地主机)访问视图?我试过使用:

  • 'HTTP_HOST',
  • 'HTTP_X_FORWARDED_FOR',
  • 'REMOTE_ADDR',
  • 'SERVER_ADDR'

但没有运气。

还有其他方法吗?

【问题讨论】:

  • 你能解释一下你尝试了什么吗?你是如何使用REMOTE_ADDR的?
  • 同意。我们需要知道您尝试了什么。

标签: django django-views


【解决方案1】:

您可以将您的网络服务器(Apache、Nginx 等)配置为仅绑定到本地主机。

如果您想限制对所有视图的访问,这会很有效,但如果您想允许远程用户访问某些视图,那么您必须配置第二个 Django 项目。

【讨论】:

    【解决方案2】:

    这个问题比仅仅检查一个变量要复杂一些。要识别客户端 IP 地址,您需要

    request.META['REMOTE_ADDR'] -- The IP address of the client.
    

    然后将其与request.get_host() 进行比较。但是您可能会考虑到服务器可能在 0.0.0.0:80 启动,所以您可能需要这样做:

    import socket
    socket.gethostbyaddr(request.META['REMOTE_ADDR'])
    

    并将其与假设进行比较

    socket.gethostbyaddr("127.0.0.1")
    

    但是您需要使用这些标头和值来处理许多极端情况。

    更简单的方法可能是在您的应用程序前面设置一个反向代理,例如发送一些 custom_header,例如X_SOURCE=internet。然后您可以设置来自互联网的流量通过代理,而本地流量(在您的本地网络中)直接进入网络服务器。因此,如果您只想从本地网络访问特定视图,只需检查此标头:

    if 'X_SOURCE' in request.META:
        # request is coming from internet, and not local network....
    else:
        # presumably we have a local request...
    

    但同样 - 这是“防火墙方法”,它需要更多设置,并确保无法从外部访问应用程序,这不会通过反向代理..

    【讨论】:

    • 正如我还指出的:您的服务器从客户端接收到的每一点信息都可以被操纵。据我所知,您无法使用 Django 提供的工具完全保护您的应用程序。
    • 当然不是所有的东西都是可信的。如果使用 gevent,我们有 REMOTE_ADDR:env['REMOTE_ADDR'] = str(client_address[0]),其中 client_address 来自 StreamServer,它使用 SocketServer,它具有:(request, client_address) = self.socket.accept()。因此,如果有人设法将 client_address 值破解为 127.0.0.1 - 那么他们应该无法在最后收到响应......无论如何 - 我总是采用防火墙方法
    猜你喜欢
    • 2017-03-29
    • 2014-01-23
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多