Проблемы безопасности При размещении. * (Точка звездочка) в Django URL Conf Regex - PullRequest
1 голос
/ 02 августа 2011

У меня есть вид, который выбирает файл и передает его пользователю.Представление выглядит следующим образом:

@login_required
def file(request, mid_id, file_name):
    user = request.user

    authorized_mids = user.profile.authorized_mids(True)

    mid = get_object_or_404(Mid, id=mid_id)
    try:
        authorized_mids[mid.id]
    except KeyError:
        raise Http404

    mid_file_path = settings.PATH_TO_REPORTS + ('/%s/' % mid.pk) + file_name

    to_return = open(mid_file_path, 'r')

    mimetype = mimetypes.guess_type(mid_file_path)

    response = HttpResponse(to_return, mimetype=mimetype)
    response['Content-Disposition'] = 'attachment; filename=%s' % file_name;

    return response

Мой URL выглядит следующим образом:

url(r'^mid/(?P<mid_id>\d+)/file/(?P<file_name>.*?)/$', 'mid.views.file', name='fetch_report')

Есть ли какие-либо проблемы безопасности с наличием. * В URL?Сможет ли (злонамеренный) пользователь взломать таким образом, что он сможет получить доступ к файлам, которые он не должен иметь?

1 Ответ

1 голос
/ 02 августа 2011

Вам, вероятно, следует заменить .*? на [^#?]*?, чтобы избежать совпадения частей запроса или фрагмента URL-адреса, или использовать urllib.parse для выделения части пути.

Кроме того, помните о .. последовательностях в URL.

r'^mid/(?P<mid_id>\d+)/file/(?P<file_name>.*?)/$'

соответствует

mid/1/file/../../../../etc/

, что находится вне дерева подкаталогов mid/1/file.

Вы можете сделать

os.path.normpath(path)

перед запуском регулярного выражения, которое должно отклонить вышеизложенное, поскольку

os.path.normpath('mid/1/file/../../../../etc/')

равно

../etc

, но вам придется удалить / до $ и normpath могут вести себя по-другому на компьютерах с Windows, чем на * nix.Я не знаю ни одного эквивалента normpath в модуле urllib.

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