如何防止Gunicorn返回“服务器”http标头?

时间:2013-04-15 08:17:05

标签: http-headers gunicorn

我想屏蔽版本或完全删除标题。

7 个答案:

答案 0 :(得分:21)

要更改conf.py文件中的'Server:'http标头:

 import gunicorn
 gunicorn.SERVER_SOFTWARE = 'Microsoft-IIS/6.0'

并使用gunicorn -c conf.py wsgi:app

行的调用

要完全删除标题,可以通过用过滤掉标题的子类替换其http响应类来修补gunicorn。这可能是无害的,但可能不推荐。将以下内容放在conf.py中:

from gunicorn.http import wsgi

class Response(wsgi.Response):
    def default_headers(self, *args, **kwargs):
        headers = super(Response, self).default_headers(*args, **kwargs)
        return [h for h in headers if not h.startswith('Server:')]

wsgi.Response = Response

用gunicorn 18测试

答案 1 :(得分:2)

对于较新版本 (20.0.4):在您将运行 gunicorn.conf.py 命令的目录中创建一个包含以下内容的 gunicorn 文件:

import gunicorn
gunicorn.SERVER_SOFTWARE = 'My WebServer'

答案 2 :(得分:1)

您可以编辑__init__.py以将SERVER_SOFTWARE设置为您想要的任何内容。但我真的很想用标志禁用它,所以升级时我不需要重新应用补丁。

答案 3 :(得分:0)

我的免费补丁解决方案涉及包装default_headers方法:

import gunicorn.http.wsgi
from six import wraps


def wrap_default_headers(func):
    @wraps(func)
    def default_headers(*args, **kwargs):
        return [header for header in func(*args, **kwargs) if not header.startswith('Server: ')]
    return default_headers


gunicorn.http.wsgi.Response.default_headers = wrap_default_headers(gunicorn.http.wsgi.Response.default_headers)

答案 4 :(得分:0)

将其更改为唯一的内容要比删除它更好。您不想冒险,例如,蜘蛛侠认为您不合规。将其更改为您不使用的软件名称可能会导致类似的问题。使其具有唯一性将避免做出相同的假设。我推荐这样的东西:

import gunicorn
gunicorn.SERVER_SOFTWARE = 'intentionally-undisclosed-gensym384763'

答案 5 :(得分:0)

这并不能直接回答问题,但也可以解决该问题,而且无需猴子修补黑眼圈。

如果您通常在反向代理后面使用gunicorn,则可以在后端下游的响应头中设置,添加,删除或执行替换。在我们的例子中,Server标头。

我想每个Web服务器都应该具有相同的功能。


例如,在Caddy 2(当前为beta)中,它很简单:

https://localhost {
    reverse_proxy unix//tmp/foo.sock {
        header_down Server intentionally-undisclosed-12345678
    }
}

为了完整起见,即使在手动http-> https重定向过程中,我仍然添加一个最低限度(但可以正常工作)的Caddyfile来处理服务器标头的修改(如果您不覆盖Caddy 2,它会自动执行),正确地找出它可能有些棘手。

http://localhost {
    # Fact: the `header` directive has less priority than `redir` (which means
    # it's evaluated later), so the header wouldn't be changed (and Caddy would
    # shown instead of the faked value).
    #
    # To override the directive ordering only for this server, instead of
    # change the "order" option globally, put the configuration inside a
    # route directive.
    # ref.
    #   https://caddyserver.com/docs/caddyfile/options
    #   https://caddyserver.com/docs/caddyfile/directives/route
    #   https://caddyserver.com/docs/caddyfile/directives#directive-order
    route {
        header Server intentionally-undisclosed-12345678
        redir https://{host}{uri}
    }
}

https://localhost {
    reverse_proxy unix//tmp/foo.sock {
        header_down Server intentionally-undisclosed-12345678
    }
}

要检查其是否有效,只需将curl用作curl --insecure -I http://localhostcurl --insecure -I http://localhost(这是不安全的,因为本地主机证书是作为自签名自动生成的)。

设置是如此简单,以至于您也可以考虑在开发中使用它(使用gunicorn --reload),尤其是当它类似于您的暂存/生产环境时。

答案 6 :(得分:0)

这里没有写清楚,所以我要确认最新版本的 Gunicorn (20.1.x) 的最简单方法是在配置文件中添加以下几行:

import gunicorn 
gunicorn.SERVER = 'undisclosed'