第一批(快速修复): - H6: main.py --debug 默认值 True→False,防止 Werkzeug RCE - M2+M3: /search 增加 validate_query + top_k 范围限制(1-50) - M4: context_count 范围限制(0-10) + 异常捕获 - L3: assert → raise RuntimeError(生产环境 API Key 检查) - H1: SSE 错误事件移除 traceback 字段 第二批(安全加固): - H2+H3: 文档接口路径遍历 realpath 校验 + 文件类型/大小限制 - H4+H5: 批量上传文件大小检查 - M6: LIKE 查询通配符转义 - M1: 37 处 str(e) 异常信息统一脱敏(6 文件) - M5: CORS 生产环境限制来源 - M7: SESSION_MANAGER None 保护(503) - M11: subprocess 参数注入防护(白名单 + -- 分隔符) 第三批(架构改进): - M8+M9: 提取 JSON 解析共享工具(extract_json_object/list) - M10: Prompt 注入检测防御(prompt_guard.py) - M12: 解析器文件大小限制(Excel 50MB/TXT 20MB/PDF 100MB) - M13: 全局单例竞态条件双重检查锁定(engine/bm25/intent_analyzer)
41 lines
1.0 KiB
Python
41 lines
1.0 KiB
Python
"""
|
|
TXT 文本解析器
|
|
|
|
简单的文本文件读取,支持 UTF-8 和 GBK 编码自动检测。
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# 文件大小限制
|
|
MAX_TXT_SIZE = 20 * 1024 * 1024 # 20MB
|
|
|
|
|
|
def extract_text_from_txt(filepath):
|
|
"""从TXT提取文本"""
|
|
# 检查文件大小
|
|
try:
|
|
file_size = os.path.getsize(filepath)
|
|
if file_size > MAX_TXT_SIZE:
|
|
logger.error(f"TXT文件过大: {file_size / 1024 / 1024:.1f}MB")
|
|
return ""
|
|
except OSError:
|
|
return ""
|
|
|
|
try:
|
|
with open(filepath, 'r', encoding='utf-8') as f:
|
|
return f.read()
|
|
except UnicodeDecodeError:
|
|
# 尝试其他编码
|
|
try:
|
|
with open(filepath, 'r', encoding='gbk') as f:
|
|
return f.read()
|
|
except Exception as e:
|
|
logger.error(f"TXT解析错误 {filepath}: {e}")
|
|
return ""
|
|
except Exception as e:
|
|
print(f" TXT解析错误 {filepath}: {e}")
|
|
return ""
|