23 окт. 2009 г.

Block REQUEST_URI adresses

Вчера некто пытался подобрать адрес к phpmyadmin (а затем бы и пароль), видимо, на одном из моих сайтов.

Работал с 2 IP адресов, видимо, какой-то программой, так как за 1 минуту перебрал 26 предполагаемых URI.

Придется как-то реагировать на это событие. Как вариант заблокировать оба адреса. Ну для этого, видимо можно использовать снипет http://www.djangosnippets.org/snippets/744/ или настройку BANNED_IPS в самой django.

Можно ещё избавиться от трейсбэков по поводу не существующей страницы немного переработав указанный ранее снипет:


from django.conf import settings

from django import http



class BlockedUriMiddleware(object):



    def process_request(self, request):

        if request.META['REQUEST_URI'] in settings.BLOCKED_URIS:

            return http.HttpResponseForbidden('<h1>Forbidden</h1>')

        return None



# in settings.py:



MIDDLEWARE_CLASSES = (

    ...

    "myapp_with_middleware_module.BlockedUriMiddleware",

)



BLOCKED_URIS = (

    '/phpmyadmin/index.php',

    '/phpMyAdmin/index.php',

    '/PMA/index.php',

    '/pma/index.php',

    '/dbadmin/index.php',

    '/mysql/index.php',

    ...

)


Кстати в тест-сервере (это тот, что по runserver запускается) нет никакого REQUEST_URI, так что работать не будет – подробнее тут http://groups.google.com/group/django-users/browse_thread/thread/3261e7ece9ff3b33.

UPD: А можно ещё внимательней почитать документацию и обнаружить для себя два параметра настройки: IGNORABLE_404_ENDS и IGNORABLE_404_STARTS.

Со вторым, вместо BLOCKED_URIS можно написать IGNORABLE_404_STARTS со следующим контентом:


IGNORABLE_404_STARTS = (

    '/cgi-bin/'

    '/_vti_bin'

    '/_vti_inf'



    '/php',

    '/PMA',

    '/pma',

    '/dbadmin',

    '/mysql',

    '/myadmin',

    '/sql',

    '/p/m/a/',

    '/web',

    '/Tools',

    '/index.php',

    '/wp-login',

)


Первые три лежат в настройке по умолчанию.

7 комментариев:

  1. да всё время такое в логах, но у меня ни phpmyadmin ни mysql нет. так что особо как-то не беспокоит =)

    ОтветитьУдалить
  2. Не совсем понятно какой смысл вообще блокировать подобные урли?

    Понятно, что блокировка, как таковая где-то может понадобиться, но в каком-нибудь другом случае.

    ОтветитьУдалить
  3. Я блокирую их, чтоб они мне не портили настроение с утра :). Другого применения пока и сам не придумал.

    ОтветитьУдалить
  4. Костыли такие костыли. man iptables Вам в руки.

    ОтветитьУдалить
  5. Ок, не допустим iptables, но если хотите выдавать 403, то зачем джангой это велосипедить? Отдавайте сервером.

    ОтветитьУдалить
  6. Не вижу ничего дурного в том, чтоб делать это django'й.
    К тому же, на хостингах задачу решать с помощью того же апача уже сложней.
    В чем конкретные минусы моего решения?

    ОтветитьУдалить