跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python http.server 模块的安全风险与加固方案

Python 内置 http.server 模块在公网环境下的安全风险,包括目录暴露、无加密、无认证及性能问题。介绍了已知历史漏洞(如 CVE-2019-9740),并给出安全加固建议:限制绑定地址、使用临时目录、添加 Basic Auth、启用 HTTPS 以及生产环境替换为 Nginx 等专业服务器。文末提供了一个包含白名单、认证、HTTPS 及日志功能的 Python 安全服务器脚本示例。

Qiny01发布于 2026/3/23更新于 2026/10/1712K 浏览

在测试环境中使用 python -m http.server 8080 可以快速启动一个 Web 服务,测试一些简单的网页,但是如果要在公网发布页面还是存在一些安全问题的。


1. python -m http.server 的作用与安全风险

python -m http.server 8080 是 Python 内置的一个简单 HTTP 服务器,用于快速共享文件或调试。它的主要安全风险如下:

(1)默认暴露当前目录所有文件
  • 启动后,任何人(包括外网)都能访问你当前工作目录及子目录的所有文件,存在信息泄露风险。
  • 例如:cd /etc && python3 -m http.server 8080 会导致 /etc 目录下的敏感配置文件被公开访问。
(2)无身份验证与加密
  • 传输为明文 HTTP,没有 HTTPS 加密,数据可能被中间人窃取或篡改。
  • 没有密码保护,任何人都可访问服务器。
(3)潜在的执行风险
  • 如果目录中存在可执行文件(如 .py、.sh),虽然默认不会执行,但攻击者可能通过其他方式诱导执行。
  • 例如:上传恶意文件到可访问目录,再结合其他漏洞执行。
(4)性能与稳定性
  • 该服务器为单线程,不适合高并发,易被 DDoS 攻击拖垮。

2. http.server 库的安全漏洞情况

官方维护状态:

  • http.server 是 Python 标准库的一部分,安全漏洞会在新版本中修复。
  • 建议使用最新版本的 Python(如 3.12+)以获取安全补丁。

已知漏洞(历史):

  • CVE-2019-9740:目录遍历漏洞(已修复)。
  • CVE-2021-23336:请求解析缺陷(已修复)。
  • CVE-2023-40217:HTTP 请求走私漏洞(已修复)。

结论:

  • 最新版本的 http.server 没有已知高危漏洞,但它的设计目标是开发调试,不适合生产环境。

3. 安全使用建议

(1)限制访问范围
  • 绑定到本地回环地址:python3 -m http.server 8080 --bind 127.0.0.1 仅允许本机访问。
  • 或使用防火墙限制端口:sudo ufw allow from 192.168.1.0/24 to any port 8080
(2)使用临时目录
  • 在空目录中启动服务器,避免暴露敏感文件:mkdir /tmp/web && cd /tmp/web && python3 -m http.server 8080
(3)启用身份验证
  • 自定义 SimpleHTTPRequestHandler 添加 Basic Auth:
from http.server import SimpleHTTPRequestHandler, HTTPServer
 base64

 ():
     ():
        .send_response()
        .send_header(, )
        .send_header(, )
        .end_headers()

     ():
         .headers.get()  :
            .do_AUTHHEAD()
            .wfile.write()
        :
            auth = .headers.get().split()[]
            username, password = base64.b64decode(auth).decode().split()
             username ==   password == :
                SimpleHTTPRequestHandler.do_GET()
            :
                .do_AUTHHEAD()
                .wfile.write()

 __name__ == :
    server = HTTPServer((, ), AuthHandler)
    server.serve_forever()
import
class
AuthHandler
SimpleHTTPRequestHandler
def
do_AUTHHEAD
self
self
401
self
'WWW-Authenticate'
'Basic realm="Test"'
self
'Content-type'
'text/html'
self
def
do_GET
self
if
self
'Authorization'
is
None
self
self
b'No auth header received'
else
self
'Authorization'
1
':'
if
'admin'
and
'password'
self
else
self
self
b'Invalid credentials'
if
'__main__'
'0.0.0.0'
8080
(4)使用 HTTPS
  • 通过 ssl 模块包装:openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out cert.pem 然后配合 python3 -m http.server 8080 --bind 0.0.0.0 --ssl-cert cert.pem --ssl-key key.pem
(5)生产环境替换方案
  • Nginx:高性能、安全的静态文件服务器。
  • Apache:支持复杂配置和访问控制。
  • Flask/Django:带路由和权限管理的应用服务器。

4. 总结

  • 漏洞情况:最新版本的 http.server 无已知高危漏洞,但它不是为生产环境设计的。
  • 安全风险:默认配置会暴露文件、无加密、无认证。
  • 建议:
    1. 限制访问范围(--bind 127.0.0.1)。
    2. 在空目录中运行。
    3. 添加身份验证和 HTTPS。
    4. 生产环境使用专业服务器。

如果临时使用,为了快速搭建一个应急用的服务器,这里有一个安全加固版的 Python HTTP 服务器脚本,它会包含以下安全特性:

安全特性
  1. 目录白名单:只允许访问指定目录,防止越权访问。
  2. 身份验证:支持 HTTP Basic Auth。
  3. HTTPS 加密:通过 SSL/TLS 加密传输。
  4. 访问日志:记录访问请求(方便审计)。
  5. 禁用目录列表:防止直接列出目录内容。

安全加固版 Python HTTP 服务器脚本

import os
import ssl
import base64
import logging
from http.server import HTTPServer, SimpleHTTPRequestHandler

# ===== 配置 =====
HOST = '0.0.0.0'       # 监听地址,0.0.0.0 表示允许外网访问
PORT = 8080            # 监听端口
WHITELIST_DIR = '/tmp/web'  # 允许访问的目录
USERNAME = 'admin'     # 用户名
PASSWORD = 'securepass'  # 密码
CERT_FILE = 'cert.pem' # SSL 证书
KEY_FILE = 'key.pem'   # SSL 私钥

# 初始化日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('access.log'),
        logging.StreamHandler()
    ]
)

class SecureHTTPRequestHandler(SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        # 切换到白名单目录
        os.chdir(WHITELIST_DIR)
        super().__init__(*args, **kwargs)

    def do_AUTHHEAD(self):
        self.send_response(401)
        self.send_header('WWW-Authenticate', 'Basic realm="Secure File Server"')
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        # 1. 检查认证
        auth_header = self.headers.get('Authorization')
        if not auth_header or not auth_header.startswith('Basic '):
            self.do_AUTHHEAD()
            self.wfile.write(b'401 Unauthorized: Authentication required.')
            logging.warning(f"Unauthorized access attempt from {self.client_address[0]}")
            return

        # 2. 验证用户名和密码
        try:
            auth_decoded = base64.b64decode(auth_header.split(' ')[1]).decode('utf-8')
            username, password = auth_decoded.split(':')
        except Exception:
            self.do_AUTHHEAD()
            self.wfile.write(b'401 Unauthorized: Invalid credentials.')
            logging.warning(f"Invalid credentials from {self.client_address[0]}")
            return

        if username != USERNAME or password != PASSWORD:
            self.do_AUTHHEAD()
            self.wfile.write(b'401 Unauthorized: Invalid username or password.')
            logging.warning(f"Failed login from {self.client_address[0]}")
            return

        # 3. 检查路径是否在白名单目录内
        path = self.translate_path(self.path)
        if not path.startswith(os.path.abspath(WHITELIST_DIR)):
            self.send_response(403)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(b'403 Forbidden: Access denied.')
            logging.warning(f"Directory traversal attempt from {self.client_address[0]}: {self.path}")
            return

        # 4. 禁用目录列表
        if os.path.isdir(path):
            self.send_response(404)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(b'404 Not Found: Directory listing disabled.')
            logging.info(f"Directory listing attempt from {self.client_address[0]}: {self.path}")
            return

        # 5. 正常响应
        logging.info(f"Access from {self.client_address[0]}: {self.path}")
        super().do_GET()

    def log_message(self, format, *args):
        # 自定义日志格式
        logging.info(f"{self.client_address[0]} - {format % args}")

def run_server():
    # 创建服务器
    server_address = (HOST, PORT)
    httpd = HTTPServer(server_address, SecureHTTPRequestHandler)

    # 启用 HTTPS
    context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)
    httpd.socket = context.wrap_socket(httpd.socket, server_side=True)

    print(f"Secure HTTP server running on https://{HOST}:{PORT}")
    print(f"Whitelisted directory: {WHITELIST_DIR}")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("\nServer stopped.")
        httpd.server_close()

if __name__ == '__main__':
    # 检查目录是否存在
    if not os.path.isdir(WHITELIST_DIR):
        os.makedirs(WHITELIST_DIR)
        print(f"Created whitelist directory: {WHITELIST_DIR}")

    # 检查证书和密钥
    if not (os.path.isfile(CERT_FILE) and os.path.isfile(KEY_FILE)):
        print("Generating self-signed SSL certificate...")
        os.system(f"openssl req -newkey rsa:2048 -nodes -keyout {KEY_FILE} -x509 -days 365 -out {CERT_FILE} -subj '/CN=localhost'")

    run_server()

使用步骤

1. 保存脚本

将上面的代码保存为 secure_server.py。

2. 安装依赖

脚本使用 Python 标准库,无需额外安装依赖。

3. 生成 SSL 证书

首次运行会自动生成自签名证书:

python3 secure_server.py
4. 启动服务器
python3 secure_server.py
5. 访问测试

浏览器访问:

https://your-ip:8080

会提示输入用户名(admin)和密码(securepass)。


安全建议

  • 密码:生产环境中建议使用强密码,并通过环境变量或配置文件读取,而不是硬编码。
  • 证书:生产环境中建议使用可信 CA 签发的证书,而不是自签名证书。
  • 防火墙:配合防火墙限制访问 IP 范围。
  • 日志:定期查看 access.log 以检测异常访问。

目录

  1. 1. python -m http.server 的作用与安全风险
  2. (1)默认暴露当前目录所有文件
  3. (2)无身份验证与加密
  4. (3)潜在的执行风险
  5. (4)性能与稳定性
  6. 2. http.server 库的安全漏洞情况
  7. 3. 安全使用建议
  8. (1)限制访问范围
  9. (2)使用临时目录
  10. (3)启用身份验证
  11. (4)使用 HTTPS
  12. (5)生产环境替换方案
  13. 4. 总结
  14. 安全特性
  15. 安全加固版 Python HTTP 服务器脚本
  16. ===== 配置 =====
  17. 初始化日志
  18. 使用步骤
  19. 1. 保存脚本
  20. 2. 安装依赖
  21. 3. 生成 SSL 证书
  22. 4. 启动服务器
  23. 5. 访问测试
  24. 安全建议

更多推荐文章

查看全部
  • OpenClaw 本地部署与 Ollama 集成配置指南
  • PID 循迹机器人控制算法实战:24 电赛 H 题解析
  • 无人机路径规划算法详解:原理与实战应用
  • 一个 SpringBoot + Vue 酒店客房管理系统的实现记录
  • Android Studio 安装与 SDK、JDK、Gradle 配置详解
  • JavaScript 基础语法与 jQuery 入门
  • 从医疗行业转型人工智能项目管理:求职实战经验
  • 如何将 Android 项目上传至 GitHub
  • 6 款开源视觉模型推荐:M2FP 多人人体解析与 WebUI 实践
  • Qwen3Guard-Gen-8B 内容安全模型及 Python 集成方案
  • Visual C++运行库修复指南:解决程序启动失败问题
  • RTX 4090 本地 AI 绘画:Z-Image 写实图像工作流实践
  • AI 代理工具全景:Claude Code 等六大产品深度解析
  • Xilinx FPGA 开发:Vivado 流与 Vitis 流对比解析
  • 双指针经典算法题实战解析:从原理到代码
  • C++多态实现深度剖析:从抽象类约束到虚函数表机制
  • Magic API:低代码接口开发平台完全指南
  • N8N Data Table 实现自定义表单数据增删改查实战
  • OpenClaw Memory 本地模式配置:Ubuntu CUDA cuDNN llama.cpp
  • SAR与ISAR雷达成像核心算法详解

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online