【发布时间】:2020-02-28 04:24:09
【问题描述】:
在我的 Django 应用程序中,以下设置确保响应标头启用了标准键值对。
但是,“服务器”名称和版本信息默认仍然可见,需要隐藏(暴露的服务器名称和版本是 OWASP 漏洞)。
middleware.py
class MyAppMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response['X-XSS-Protection'] = "1; mode=block"
return response
class RemoveHeaders(object): # this method invocation throws error
def process_response(self, request, response):
response['Server'] = ''
return response
同样在其他帖子中建议,这个 middleware.py 在 settings.py 中的中间件的第一顺序声明:
MIDDLEWARE = [
'MyApp.middleware.RemoveHeaders',
'MyApp.middleware.MyAppMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
RemoveHeaders() 方法抛出错误:TypeError: RemoveHeaders() 不接受任何参数。这是因为我不确定将哪个对象传递给此方法。
更新:导入以下内容对我有用。
from django.utils.deprecation import MiddlewareMixin
# class to import in RemoveHeaders--
class RemoveHeaders(MiddlewareMixin):
# rest of the code
【问题讨论】:
-
是的,我做到了。上面截取的代码已更新。但是,为处理隐藏响应标头而单独创建的“RemoveHeaders”方法会在方法调用时引发错误
-
在
__call__中,我添加了这一行print('Response has Server header', response.has_header('Server')),它打印了False。这意味着Server标头甚至没有在那个时候设置。我不确定它在哪里设置以及为什么第二种方法有效。
标签: python django server middleware django-middleware