2

我在本地网络上为我的家人创建了一个简单的 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 一样,所以这没什么

4

1 回答 1

7

默认模式open'r',代表读取文本数据,在 Windows 上进行自动 EOL 转换。替换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 上),您可以f.close()手动调用。

os.path.join(您可能需要import os.path在文件的开头)是比字符串连接更简洁的文件名构造机制。检查生成的文件名是否在您期望的目录中可以防止路径遍历漏洞,该漏洞允许任何人读取您系统上的所有文件。

于 2012-01-06T01:08:51.123 回答