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 комментариев:

Анонимный комментирует...

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

Unknown комментирует...

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

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

Ivan Markeev комментирует...

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

Artyom Semyonov комментирует...

Костыли такие костыли. man iptables Вам в руки.

Ivan Markeev комментирует...

Причем тут iptables?

Artyom Semyonov комментирует...

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

Ivan Markeev комментирует...

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