Проверка заголовков HTTP_HOST для сервера Apache с использованием расширений - PullRequest
0 голосов
/ 22 мая 2019

У меня есть приложение Django, размещенное на AWS.Я использую Elastic Beanstalk и использую файл .ebextensions/django.config для ввода всех своих пользовательских настроек на стороне сервера.

У меня настроено ALLOWED_HOSTS, чтобы, если кто-нибудь попытается подключиться к моему сайту из недопустимого заголовка узла, он получитзаблокирован ... Django.

Я получаю все виды писем с сообщениями об ошибках Django, на которых написано Invalid HTTP_HOST header: 123.456.789.- по сути, боты / сканеры пытаются подключиться и / или загрузить вредоносный контент.

Я бы хотел заблокировать эти плохие запросы на стороне сервера, так как кажется, что этот дополнительный уровень блокировки более безопасен, и я нене нравится получать все электронные письма.

В Django docs они пишут, что «[они рекомендуют] настроить ваш веб-сервер, чтобы он проверял заголовки входящих HTTP-хостов».Я хотел бы сделать это в моем .ebextensions/django.config файле.

Вот мой текущий .ebextensions/django.config файл:

container_commands:
  01_migrate:
    command: "python manage.py migrate --noinput"
  02_collectstatic:
    command: "python manage.py collectstatic --noinput"

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: myapp/wsgi.py
  aws:elasticbeanstalk:container:python:staticfiles:
    /static/: static/

files:
  "/etc/httpd/conf.d/ssl_rewrite.conf":
      mode: "000644"
      owner: root
      group: root
      content: |
          WSGIApplicationGroup %{GLOBAL}
          RewriteEngine On
          <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
          RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
          </If>
          Header always set Referrer-Policy no-referrer
          Header always set Strict-Transport-Security "max-age=14400; includeSubdomains;"

Я полагаю, что это все настройки Apache.Я нашел этот SO-ответ на эту тему, в котором написано "Чтобы отклонять запросы без набора HOST, вы можете использовать:"

SetEnvIfNoCase Host .+ VALID_HOST
Order Deny,Allow
Deny from All
Allow from env=VALID_HOST

Однако я не уверен в том, что делает этот код (и если это то, что мне нужно), и как перевести его в .ebextensions.

В конечном итоге я хотел бы выяснить, что я могу добавить в свой файл .ebextensions, чтобы он проверял заголовки HTTP_HOST, прежде чем они достигнут Django.

1 Ответ

0 голосов
/ 22 мая 2019

Я думаю, вам нужно Промежуточное программное обеспечение Django .

Вы должны создать файл промежуточного программного обеспечения в вашем приложении.

middleware.py (создать этот файл в вашем приложении django)

from django.http import JsonResponse

MY_HEADER = 'HTTP_HOST'

class InputCheckMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # <add your logic here>, this is before your code reach django views.
        headers = {k: v for k, v in request.META.items() if k.startswith('HTTP_')} # this will return all http headers
        if MY_HEADER not in headers:
            # make all kinds of validations here
            # and return HttpResponse (or subclass. JsonResponse for example) here.
            # this case request does not reach in your view.
            return JsonResponse({'status_message': 'bad request'})
        response = self.get_response(request)
        return response

Теперь вы должны добавить путь к классу промежуточного программного обеспечения в свой файл settings.py внутри списка MIDDLEWARE.

MIDDLEWARE = [
    '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',
    # your own middleware
    'myapp.middleware.InputCheckMiddleware',
]

Промежуточное программное обеспечение вызывается для каждого запроса.Если вы используете Django1.8, структура класса Middleware отличается, просто проверьте в документах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...