【发布时间】:2020-04-21 13:07:59
【问题描述】:
在开始我的问题之前,我已经提到了 stackoverflow 帖子 - Delete header in django rest framework response。
请在下面找到中间件代码和settings.py(参考django middleware docs):
middleware.py:
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
response = self.get_response(request)
response.__setitem__('Server', '')
return response
settings.py
MIDDLEWARE = [
....,
....,
'middleware_demo.middleware.SimpleMiddleware',
]
使用上面的代码,我得到了服务器响应,服务器标头设置为空字符串,如下所示。正如预期的那样,并且没有透露服务器标头详细信息:
HTTP/1.1 200 OK
Date: Tue, 21 Apr 2020 12:55:25 GMT
Content-Type: text/html
Server:
X-Frame-Options: DENY
Content-Length: 16351
X-Content-Type-Options: nosniff
我的目标是完全删除标头,并在 middleware.py 中尝试了两种相同的方法:
方法一 - official docs
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
response = self.get_response(request)
response.__delitem__('Server')
return response
方法 2 - 参考 stackoverflow 博客 - Delete header in django rest framework response
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
response = self.get_response(request)
del response['Server']
return response
但响应仍然设置了服务器标头并显示了版本详细信息,如下所示:
HTTP/1.1 200 OK
Date: Tue, 21 Apr 2020 13:00:26 GMT
Server: WSGIServer/0.2 CPython/3.6.5
Content-Type: text/html
X-Frame-Options: DENY
Content-Length: 16351
X-Content-Type-Options: nosniff
我的问题是为什么服务器标头值会被修改并在修改时显示为空字符串,但是当标头值本身被删除时,我会在响应标头中看到它。 我在这里想念什么?
另外,我尝试将中间件激活线移动到第一个位置和最后一个位置,以防万一某些东西被覆盖。还是同样的问题。
【问题讨论】:
-
你在使用 Django
runserver吗?在这种情况下,我认为默认标头是由wsgiref 设置的,因此您必须查看它以查看是否可以阻止设置标头。在生产环境中,无论如何您都不会使用runserver,所以我不会担心摆脱 Django 中的 Server 标头。例如,如果您使用 Nginx/gunicorn 部署 Django,您将在 Nginx 配置中配置 Server 标头。
标签: python django security http-headers