P0-C: 安全修复
- 会话文件移出 web 根(data/ 目录),auth_secret 启动自动生成并持久化(0600) - cookie 签名改 HMAC-SHA256 + compare_digest;会话表加锁 + 原子写 - serve_path 增加敏感文件黑名单(纵深防御) - PyPI: 移除 ?url= 任意 URL 回退(SSRF),限制 scheme,缓存键防路径穿越 - v2 文件元数据/版本/缩略图端点全部加 is_safe_path;缩略图尺寸与像素上限 - api-docs/generate 限写 docs 目录;user/password 强制旧密码;GET /api/v2/config 脱敏 - 目录列表/错误页 HTML 转义(防存储型 XSS);Content-Disposition 文件名清洗 - 信号处理改优雅退出(移除 os._exit);启动时默认凭据安全警告
This commit is contained in:
@@ -36,10 +36,9 @@ from core.optimization import (
|
||||
|
||||
|
||||
def signal_handler(signum, _frame):
|
||||
"""处理退出信号"""
|
||||
print(f"\n收到信号 {signum},正在关闭服务器...")
|
||||
import os
|
||||
os._exit(0)
|
||||
"""处理退出信号(优雅退出:触发 KeyboardInterrupt 走正常关闭流程)"""
|
||||
print(f"\n收到信号 {signum},正在优雅关闭服务器...")
|
||||
raise KeyboardInterrupt
|
||||
|
||||
|
||||
def parse_arguments():
|
||||
@@ -587,6 +586,21 @@ def main():
|
||||
# 设置服务器启动时间(用于计算运行时间)
|
||||
config['start_time'] = time.time()
|
||||
|
||||
# 默认凭据警告
|
||||
try:
|
||||
if config.get('auth_type') == 'basic' and config.get('auth_pass') in (None, '', 'admin123'):
|
||||
print("\n" + "!" * 60)
|
||||
print("! 安全警告: 正在使用默认/空认证密码 (admin/admin123)")
|
||||
print("! 请立即修改 settings.json 中的 auth_pass 或使用 --auth-pass 指定")
|
||||
print("!" * 60)
|
||||
if config.get('auth_type') == 'token' and config.get('auth_token') in (None, '', 'admin_token_123456'):
|
||||
print("\n" + "!" * 60)
|
||||
print("! 安全警告: 正在使用默认/空认证 token")
|
||||
print("! 请立即修改 settings.json 中的 auth_token 或使用 --auth-token 指定")
|
||||
print("!" * 60)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# 创建并启动服务器
|
||||
try:
|
||||
server = MirrorServer(config)
|
||||
@@ -595,6 +609,10 @@ def main():
|
||||
else:
|
||||
print("服务器启动失败")
|
||||
sys.exit(1)
|
||||
except KeyboardInterrupt:
|
||||
# 信号处理已触发优雅关闭(server.stop + atexit cleanup 已执行)
|
||||
print("\n服务器已正常退出")
|
||||
sys.exit(0)
|
||||
except Exception as e:
|
||||
print(f"错误: {e}")
|
||||
import traceback
|
||||
|
||||
Reference in New Issue
Block a user