Czy poniższy fragment kodu z aplikacji Python WSGI jest bezpieczny z katalogu traversal? Odczytuje nazwę pliku przekazaną jako parametr i zwraca wskazany plik.Czy mój kod zapobiega przechodzeniu katalogu?
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
I zamontowany aplikację pod http://localhost:8000/file/{file}
i wysłane zapytania z adresów URL http://localhost:8000/file/../alarm.gif
i http://localhost:8000/file/%2e%2e%2falarm.gif
. Ale żadna z moich prób nie dostarczyła (istniejącego) pliku. Czy mój kod jest już bezpieczny z katalogu?
Nowe podejście
Wydaje się następującym kodem uniemożliwia przechodzenie katalogu:
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
Co stanie się, jeśli nadasz mu absolutną ścieżkę? – katrielalex
Dobry pomysł! Twoja sugestia doprowadziła mnie do odpowiedzi: jest niepewna! Przemieszczenie katalogów zostało "przypadkowo" zablokowane przez inną część używanego środowiska. – deamon