Предотвращает ли мой код обход каталога?

Безопасен ли следующий фрагмент кода из приложения Python WSGI от обхода каталогов? Он считывает имя файла, переданное в качестве параметра, и возвращает указанный файл.

file_name = request.path_params["file"]
file = open(file_name, "rb")
mime_type = mimetypes.guess_type(file_name)[0]
start_response(status.OK, [('Content-Type', mime_type)])
return file

Я смонтировал приложение в http: // localhost: 8000 / file / {file} и отправил запросы с URL-адресами http: // localhost: 8000 / file /../ alarm.gif и http: // localhost: 8000 / file /% 2e% 2e% 2falarm.gif . Но ни одна из моих попыток не дала (существующий) файл. Итак, мой код уже защищен от обхода каталогов?

Новый подход

Похоже, что следующий код предотвращает обход каталога:

file_name = request.path_params["file"]
absolute_path = os.path.join(self.base_directory, file_name)
normalized_path = os.path.normpath(absolute_path)

# security check to prevent directory traversal
if not normalized_path.startswith(self.base_directory):
    raise IOError()

file = open(normalized_path, "rb")
mime_type = mimetypes.guess_type(normalized_path)[0]
start_response(status.OK, [('Content-Type', mime_type)])
return file
17
задан deamon 24 July 2011 в 09:22
поделиться