修复12项安全漏洞和代码质量问题
安全修复: - 使用secrets替代random生成验证码,提升安全性 - 添加内存清理调度器,防止内存泄漏 - PIL缺失时返回503而非降级服务 - 改进会话安全配置,支持环境自动检测 - 密钥文件路径支持环境变量配置 Bug修复: - 改进异常处理,不再吞掉SystemExit/KeyboardInterrupt - 清理死代码(if False占位符) - 改进浏览器资源释放逻辑,使用try-finally确保关闭 - 重构数据库连接池归还逻辑,修复竞态条件 - 添加安全的JSON解析方法,处理损坏数据 - 日志级别默认值改为INFO - 提取魔法数字为可配置常量 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""浏览器池管理 - 工作线程池模式(真正的浏览器复用)"""
|
||||
|
||||
import os
|
||||
import threading
|
||||
import queue
|
||||
import time
|
||||
@@ -9,6 +10,10 @@ from typing import Callable, Optional, Dict, Any
|
||||
import nest_asyncio
|
||||
nest_asyncio.apply()
|
||||
|
||||
# 安全修复: 将魔法数字提取为可配置常量
|
||||
BROWSER_IDLE_TIMEOUT = int(os.environ.get('BROWSER_IDLE_TIMEOUT', '300')) # 空闲超时(秒),默认5分钟
|
||||
TASK_QUEUE_TIMEOUT = int(os.environ.get('TASK_QUEUE_TIMEOUT', '10')) # 队列获取超时(秒)
|
||||
|
||||
|
||||
class BrowserWorker(threading.Thread):
|
||||
"""浏览器工作线程 - 每个worker维护自己的浏览器"""
|
||||
@@ -101,19 +106,18 @@ class BrowserWorker(threading.Thread):
|
||||
"""工作线程主循环 - 按需启动浏览器模式"""
|
||||
self.log("Worker启动(按需模式,等待任务时不占用浏览器资源)")
|
||||
last_task_time = 0
|
||||
IDLE_TIMEOUT = 300 # 空闲5分钟后关闭浏览器
|
||||
|
||||
while self.running:
|
||||
try:
|
||||
# 从队列获取任务(带超时,以便能响应停止信号和空闲检查)
|
||||
self.idle = True
|
||||
try:
|
||||
task = self.task_queue.get(timeout=10)
|
||||
task = self.task_queue.get(timeout=TASK_QUEUE_TIMEOUT)
|
||||
except queue.Empty:
|
||||
# 检查是否需要关闭空闲的浏览器
|
||||
if self.browser_instance and last_task_time > 0:
|
||||
idle_time = time.time() - last_task_time
|
||||
if idle_time > IDLE_TIMEOUT:
|
||||
if idle_time > BROWSER_IDLE_TIMEOUT:
|
||||
self.log(f"空闲{int(idle_time)}秒,关闭浏览器释放资源")
|
||||
self._close_browser()
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user