веб-сервер Python http - PullRequest
       43

веб-сервер Python http

2 голосов
/ 06 января 2012

Я создал простой http-сервер для своей семьи в локальной сети, когда я добавляю html-файл и изображение png и пытаюсь просмотреть HTML-файл, мое изображение не может загрузиться.Это говорит:«Изображение« http://...:255/header.png” не может быть отображено, поскольку оно содержит ошибки ».Вот немного моего кода

        elif self.path.endswith(".bm"):   #our dynamic content
            self.send_response(200)
            self.send_header('Content-type',    'text/html')
            self.end_headers()
            f= open(curdir + sep + self.path)
            ren = self.render(f.read())
            self.wfile.write(ren)
            return
        elif self.path.endswith('.png'):
            print "IMAGE WANTED!"
            self.send_response(200)
            self.send_header('Content-type',    'image/png')
            self.end_headers()
            f = open(curdir + sep + self.path)
            self.wfile.write(f.read())
            return
        elif self.path.endswith('.jpg'):
            print "IMAGE WANTED!"
            self.send_response(200)
            self.send_header('Content-type',    'image/jpeg')
            self.end_headers()
            f= open(curdir + sep + self.path)
            print f.read()
            self.wfile.write(f.read())
            return
        elif self.path.endswith(".esp"):
            self.send_response(200)
            self.send_header('Content-type',    'text/plain')
            self.end_headers()
            self.wfile.write("This Format Is Not Supported Any More, Upgrade To BM Script")
            return

Они все работают, за исключением разделов png и jpeg.Сценарий BM, который я сделал сам, тоже самое с esp, так что просто ничего нет

1 Ответ

7 голосов
/ 06 января 2012

Режим по умолчанию open - 'r', который обозначает чтение текстовых данных и выполняет автоматическое преобразование EOL в Windows. Заменить f = open(curdir + sep + self.path); self.wfile.write(f.read()) на

fn = os.path.normpath(os.path.join(curdir, self.path))
if not fn.startswith(abspath + os.path.sep):
    raise Exception('Path traversal attempt')
with open(fn, 'rb') as f:
    self.wfile.write(f.read())

Оператор with устраняет утечку файловых дескрипторов. В качестве альтернативы (на Python <2.5) вы можете вызвать <code>f.close() вручную.

os.path.join (для которого вам может понадобиться import os.path в начале файла) - более чистый механизм построения имени файла, чем конкатенация строк. Проверка того, что полученное имя файла находится в каталоге, который вы ожидаете, предотвращает уязвимость обхода пути , которая позволит любому читать все файлы в вашей системе.

...