Django X-转发-正确

django-xff的Python项目详细描述


多个反向代理使用X-OrthDeD-Head来传递 客户端和应用程序之间的整个主机链的IP地址 服务器。标题如下:

X-Forwarded-For: 54.12.13.14, 192.168.2.0, 192.168.3.1

这意味着:

X-Forwarded-For: client, proxy1[, proxy2[...]]

不过,这只是一个标题。大多数默认配置只是附加 到头球。恶意客户端传递头很简单 在初始请求中:

X-Forwarded-For: phony, client

django-xff做什么

这个库提供了一个像样的、可配置的中间件来重写 将request.META['HTTP_REMOTE_ADDR']设置为正确的客户端IP。

这是通过设置一个反向代理的深度来实现的。 X-Forwarded-For头将从任何 无关条目。

默认情况下,如果代理的预期深度为3,则^ {TT4}$ 所有这些示例都将使用地址:

X-Forwarded-For: phony, client, proxy1, proxy2
X-Forwarded-For: client, proxy1, proxy2
X-Forwarded-For: client, proxy

注意:

  • Less proxies than expected is allowed by default, for varying lengths of proxy chains, the longest is the only one that can be trusted.
  • No header set is allowed by default and the library does nothing.

什么django-xff不做

这个库不检查任何代理的IP地址 消息的路径。

>此库无法检测受损代理或任何传入。 在正确的头中有正确号码地址的请求。

待办事项

  • Separate middleware that checks CIDR for the trusted proxies
  • Separate middleware that checks exact IP addresses for proxies

配置

在django settings.py模块中添加以下内容以启用 预期的两个反向代理的中间件。中间商是 加工后的外观顺序。这个中间件应该在某个地方 接近顶部以避免给潜在的恶意用户机会 使用格式错误的请求验证密码:

MIDDLEWARE_CLASSES = [
   <a few middlewares here>
   'xff.middleware.XForwardedForMiddleware',
   <more middlewares here>
]

XFF_TRUSTED_PROXY_DEPTH = 2

默认情况下,不会拒绝任何尝试。有几个设置要发送 对失败请求的400(错误请求)响应。严格模式将 停止所有失败的请求:

XFF_STRICT = True

要仅防止明显的恶意请求,请使用以下命令 相反:

XFF_NO_SPOOFING = True

防止不通过足够代理的请求,请使用 以下内容:

XFF_ALWAYS_PROXY = True

前一个设置意味着在没有 X-Forwarded-For头存在。以下设置遵循 XFF_ALWAYS_PROXYXFF_STRICT默认,但可以设置 独立:

XFF_HEADER_REQUIRED = False

即使在XFF_LOOSE_UNSAFE模式下,也需要头:

XFF_LOOSE_UNSAFE = True

对于不安全的设置,在开发过程中,您可以相信 第一个条目总是正确的,并且仍然得到假定的客户端IP 正确的位置,使用:

XFF_LOOSE_UNSAFE = True

如果您想保持X-Forwarded-For头不变,即使 还有其他条目,请使用:

XFF_CLEAN = False

白名单

在某些情况下,需要来自备用请求路径的请求。 amazon elastic loadbalancer healthcheck或其他管理 任务需要可用,即使它们不符合条件。

这个库接受uri作为正则表达式 检查。这些将免除任何验证,包括 XFF_STRICTXFF_HEADER_REQUIRED

定义白名单:

XFF_EXEMPT_URLS = [
    r'^healthcheck/$',
    r'^admin/',
]

这将允许从任何地方调用/healthcheck//admin/*。 允许每个人用更少的资源访问管理站点是个愚蠢的想法 比现场其他部分的要求。因为这个原因 当请求到达时,可以用404(未找到)响应 穿过主入口:

XFF_EXEMPT_STEALTH = True

这将假定低于XFF_TRUSTED_PROXY_DEPTH的任何内容都是 可信的。这种方法很幼稚,但很有效。

日志记录

将记录丢弃的请求。这意味着会有很多 当库配置错误或恶意程序正在执行时记录 地点。建议保留日志以便在 攻击。但是,可以通过设置将它们从开发中筛选出来:

LOGGING = {
    'loggers': {
         'xff.middleware': {
              'handlers': ['null'],
              'propagate': False,
         },
     },
}

设置

建议启用假定数量为 代理和调查日志。如果标题不存在或 中间件未配置,将有没有日志条目。如果日志 说明深度不正确,应减小。如果全部 请求被认为是欺骗,深度应该是 增加:

MIDDLEWARE_CLASSES = [
    'xff.middleware.XForwardedForMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
]

XFF_TRUSTED_PROXY_DEPTH = 2

当日志显示正确时,可以按增量增加控制:

XFF_NO_SPOOFING = True

然后:

XFF_STRICT = True

使用其他标志集定义异常是可行的。以下 可用于AWS弹性负载平衡器后面以防止进入 没有正确的头集但允许healthcheck返回 正确地。隐身还将用404屏蔽同一个uri 错误:

XFF_TRUSTED_PROXY_DEPTH = 1
XFF_EXEMPT_URLS = [r'^health/]
XFF_REQUIRE_HEADER = True
XFF_EXEMPT_STEALTH = True
在有反向代理链的情况下,健康检查URI是 适用于除最后一层以外的所有层。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何刷新gradle任务的目标   java JavaFX折线图在高值时显示为空   如何在java中使用http put请求向云组织发送本地文件?   java如何将Spring Security BadCredentialsException映射到HTTP 401代码   java JasperReports:UTF8中的一些符号在导出为PDF后丢失   java使用正则表达式替换不在括号中的逗号   使用Jackson库编辑JsonArray   在Java中解析逗号分隔的文本   java寻求正确的代码   action Java如何在actionperform中调用paint   java Hibernate分离条件和   java Spring:如何针对多个数据源测试同一个类?   java onAccessibilityEvent操作\u单击不工作   找不到java Android WebView程序包R/程序包Android。支持v7。应用程序   java在自定义ArrayList中仅添加一次项   Java多部分RSA解密   java当使用生成器模式时,我们如何添加额外的构造函数