DRF-如何将网站列入端点请求白名单

时间:2019-12-12 16:52:18

标签: django django-rest-framework

这是我的情况:

  • 运行DRF的托管Django应用程序
  • 外部站点托管在其他位置。可能是多个站点。

我的问题是:如何将来自外部站点的任何Java POST请求列入白名单?例如,我想在表单确认页面上添加Javascript发布请求。我该怎么做,以使我的DRF应用程序仅接受来自此站点的请求?我正在尝试不使用服务器站点代码。只是Java语言,因此很容易应用。

我担心的是,任何查看源代码的人都将能够查看API终结点并能够提交POST请求。

2 个答案:

答案 0 :(得分:0)

您可以通过创建自定义权限类来实现白名单,这是docs中的示例。

from rest_framework import permissions

class BlacklistPermission(permissions.BasePermission):
    """
    Global permission check for blacklisted IPs.
    """

    def has_permission(self, request, view):
        ip_addr = request.META['REMOTE_ADDR']
        blacklisted = Blacklist.objects.filter(ip_addr=ip_addr).exists()
        return not blacklisted

对于白名单实现,您需要从传入请求中获取REMOTE_HOST,并将其与预定义的url列表进行比较,这些URL可以存储在数据库中或类的列表中。它可能看起来像这样:

# Model

class Whitelist(models.Model):
    host = models.CharField()

# Permission
class WhitelistPermission(permissions.BasePermission):
    """
    Global permission check for whitelisted IPs.
    """

    def has_permission(self, request, view):
        domain = request.META['REMOTE_HOST']
        whitelisted = Whitelist.objects.filter(host=domain).exists()
        return whitelisted

或者您可以基于IP的白名单将REMOTE_HOST替换为REMOTE_ADDR

答案 1 :(得分:0)

也许您可以在Web服务器中进行配置。因此,该请求在入口级别本身被阻止。

如果您使用的是nginx,则类似https://support.hypernode.com/knowledgebase/blocking-allowing-ip-addresses-in-nginx/