Files

1 line
236 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "1290288259/miguan", "files": {"API.md": {"238da94ae54462601373d62a1bc960d125bfb636": {"t": 1785746436.5874426, "n": 2247, "h": "8e68a0277f3a5d14", "c": "# Flask API 接口文档\n\n本文档描述了Flask后端API接口的使用方法。\n\n## 基础信息\n\n- **基础URL**: `http://localhost:5000`\n- **内容类型**: `application/json`\n- **字符编码**: `UTF-8`\n\n## 通用响应格式\n\n所有API响应都遵循以下格式:\n\n```json\n{\n \"code\": 200, // 200表示成功,非200表示失败\n \"message\": \"响应消息(可选)\",\n \"data\": \"响应数据(可选)\"\n}\n```\n\n## 认证方式\n\n大多数接口需要JWT认证。在请求头中添加:\n`Authorization: Bearer <access_token>`\n\n## API 接口列表\n\n### 1. 用户认证\n\n#### 1.1 用户登录\n\n- **URL**: `/api/user/login`\n- **Method**: `POST`\n- **Body**:\n```json\n{\n \"username\": \"administrator\",\n \"password\": \"password\"\n}\n```\n\n#### 1.2 用户注册\n\n- **URL**: `/api/user/register`\n- **Method**: `POST`\n- **Body**:\n```json\n{\n \"username\": \"newuser\",\n \"password\": \"password\",\n \"role\": 2 // 1: 管理员, 2: 普通用户\n}\n```\n\n### 2. AI 配置管理\n\n#### 2.1 获取所有配置\n\n- **URL**: `/api/ai-config/`\n- **Method**: `GET`\n- **Auth**: Required\n\n#### 2.2 创建配置\n\n- **URL**: `/api/ai-config/`\n- **Method**: `POST`\n- **Auth**: Required\n- **Body**:\n```json\n{\n \"name\": \"DeepSeek-V3\",\n \"api_url\": \"https://api.deepseek.com\",\n \"model_name\": \"deepseek-chat\",\n \"api_key\": \"sk-...\",\n \"provider\": \"DeepSeek\",\n \"is_auto_block\": false\n}\n```\n\n#### 2.3 更新配置\n\n- **URL**: `/api/ai-config/<config_id>`\n- **Method**: `PUT`\n- **Auth**: Required\n- **Body**: 同创建配置\n\n#### 2.4 删除配置\n\n- **URL**: `/api/ai-config/<config_id>`\n- **Method**: `DELETE`\n- **Auth**: Required\n\n#### 2.5 激活配置\n\n- **URL**: `/api/ai-config/<config_id>/activate`\n- **Method**: `POST`\n- **Auth**: Required\n\n#### 2.6 禁用配置\n\n- **URL**: `/api/ai-config/<config_id>/deactivate`\n- **Method**: `POST`\n- **Auth**: Required\n\n#### 2.7 测试配置\n\n- **URL**: `/api/ai-config/<config_id>/test`\n- **Method**: `POST`\n- **Auth**: Required\n\n### 3. 日志查询\n\n#### 3.1 获取日志列表\n\n- **URL**: `/api/logs/`\n- **Method**: `GET`\n- **Auth**: Required\n- **Params**:\n - `page`: 页码\n - `per_page`: 每页数量\n - `start_time`: 开始时间\n - `end_time`: 结束时间\n\n### 4. 蜜罐管理\n\n#### 4.1 获取蜜罐列表\n\n- **URL**: `/api/honeypots/`\n- **Method**: `GET`\n- **Auth**: Required\n\n### 5. 恶意IP管理\n\n#### 5.1 获取恶意IP列表\n\n- **URL**: `/api/malicious-ips/`\n- **Method**: `GET`\n- **Auth**: Required\n\n#### 5.2 封禁IP\n\n- **URL**: `/api/malicious-ips/block`\n- **Method**: `POST`\n- **Auth**: Required\n- **Body**:\n```json\n{\n \"ip_address\": \"1.2.3.4\",\n \"reason\": \"恶意攻击\",\n \"duration\": 24 // 封禁时长(小时)\n}\n```\n"}, "a7ab7a9c33477759e6b32cf659a1c63676ec456d": {"t": 1785764203.9635336, "n": 2247, "h": "8e68a0277f3a5d14", "c": "# Flask API 接口文档\n\n本文档描述了Flask后端API接口的使用方法。\n\n## 基础信息\n\n- **基础URL**: `http://localhost:5000`\n- **内容类型**: `application/json`\n- **字符编码**: `UTF-8`\n\n## 通用响应格式\n\n所有API响应都遵循以下格式:\n\n```json\n{\n \"code\": 200, // 200表示成功,非200表示失败\n \"message\": \"响应消息(可选)\",\n \"data\": \"响应数据(可选)\"\n}\n```\n\n## 认证方式\n\n大多数接口需要JWT认证。在请求头中添加:\n`Authorization: Bearer <access_token>`\n\n## API 接口列表\n\n### 1. 用户认证\n\n#### 1.1 用户登录\n\n- **URL**: `/api/user/login`\n- **Method**: `POST`\n- **Body**:\n```json\n{\n \"username\": \"administrator\",\n \"password\": \"password\"\n}\n```\n\n#### 1.2 用户注册\n\n- **URL**: `/api/user/register`\n- **Method**: `POST`\n- **Body**:\n```json\n{\n \"username\": \"newuser\",\n \"password\": \"password\",\n \"role\": 2 // 1: 管理员, 2: 普通用户\n}\n```\n\n### 2. AI 配置管理\n\n#### 2.1 获取所有配置\n\n- **URL**: `/api/ai-config/`\n- **Method**: `GET`\n- **Auth**: Required\n\n#### 2.2 创建配置\n\n- **URL**: `/api/ai-config/`\n- **Method**: `POST`\n- **Auth**: Required\n- **Body**:\n```json\n{\n \"name\": \"DeepSeek-V3\",\n \"api_url\": \"https://api.deepseek.com\",\n \"model_name\": \"deepseek-chat\",\n \"api_key\": \"sk-...\",\n \"provider\": \"DeepSeek\",\n \"is_auto_block\": false\n}\n```\n\n#### 2.3 更新配置\n\n- **URL**: `/api/ai-config/<config_id>`\n- **Method**: `PUT`\n- **Auth**: Required\n- **Body**: 同创建配置\n\n#### 2.4 删除配置\n\n- **URL**: `/api/ai-config/<config_id>`\n- **Method**: `DELETE`\n- **Auth**: Required\n\n#### 2.5 激活配置\n\n- **URL**: `/api/ai-config/<config_id>/activate`\n- **Method**: `POST`\n- **Auth**: Required\n\n#### 2.6 禁用配置\n\n- **URL**: `/api/ai-config/<config_id>/deactivate`\n- **Method**: `POST`\n- **Auth**: Required\n\n#### 2.7 测试配置\n\n- **URL**: `/api/ai-config/<config_id>/test`\n- **Method**: `POST`\n- **Auth**: Required\n\n### 3. 日志查询\n\n#### 3.1 获取日志列表\n\n- **URL**: `/api/logs/`\n- **Method**: `GET`\n- **Auth**: Required\n- **Params**:\n - `page`: 页码\n - `per_page`: 每页数量\n - `start_time`: 开始时间\n - `end_time`: 结束时间\n\n### 4. 蜜罐管理\n\n#### 4.1 获取蜜罐列表\n\n- **URL**: `/api/honeypots/`\n- **Method**: `GET`\n- **Auth**: Required\n\n### 5. 恶意IP管理\n\n#### 5.1 获取恶意IP列表\n\n- **URL**: `/api/malicious-ips/`\n- **Method**: `GET`\n- **Auth**: Required\n\n#### 5.2 封禁IP\n\n- **URL**: `/api/malicious-ips/block`\n- **Method**: `POST`\n- **Auth**: Required\n- **Body**:\n```json\n{\n \"ip_address\": \"1.2.3.4\",\n \"reason\": \"恶意攻击\",\n \"duration\": 24 // 封禁时长(小时)\n}\n```\n"}, "7c01c87999963f779b205e40a9defe491633f40f": {"t": 1785764205.4726546, "n": 4466, "h": "7ebe09bcddce09d4", "c": "# Flask API 接口文档\n\n本文档描述了Flask后端API接口的使用方法。\n\n## 基础信息\n\n- **基础URL**: `http://localhost:5000`\n- **内容类型**: `application/json`\n- **字符编码**: `UTF-8`\n\n## 通用响应格式\n\n所有API响应都遵循以下格式:\n\n```json\n{\n \"status\": \"success|error\",\n \"message\": \"响应消息(可选)\",\n \"data\": \"响应数据(可选)\"\n}\n```\n\n## 错误响应\n\n当请求失败时,API会返回相应的HTTP状态码和错误信息:\n\n- `400 Bad Request`: 请求参数错误\n- `404 Not Found`: 资源不存在\n- `500 Internal Server Error`: 服务器内部错误\n\n## API 接口列表\n\n### 1. 问候接口\n\n获取简单的问候信息。\n\n**请求方式**: `GET`\n\n**请求URL**: `/api/hello`\n\n**请求参数**: 无\n\n**响应示例**:\n```json\n{\n \"message\": \"你好!欢迎使用Flask标准框架\",\n \"status\": \"success\"\n}\n```\n\n---\n\n### 2. 获取单个用户信息\n\n根据用户ID获取用户信息。\n\n**请求方式**: `GET`\n\n**请求URL**: `/api/user/{user_id}`\n\n**路径参数**:\n- `user_id` (int): 用户ID\n\n**响应示例**:\n```json\n{\n \"user\": {\n \"name\": \"张三\",\n \"email\": \"zhangsan@example.com\",\n \"age\": 25\n },\n \"status\": \"success\"\n}\n```\n\n**错误响应**:\n```json\n{\n \"message\": \"用户不存在\",\n \"status\": \"error\"\n}\n```\n\n---\n\n### 3. 获取所有用户信息\n\n获取所有用户的信息列表。\n\n**请求方式**: `GET`\n\n**请求URL**: `/api/users`\n\n**请求参数**: 无\n\n**响应示例**:\n```json\n{\n \"users\": [\n {\n \"id\": 1,\n \"name\": \"张三\",\n \"email\": \"zhangsan@example.com\",\n \"age\": 25\n },\n {\n \"id\": 2,\n \"name\": \"李四\",\n \"email\": \"lisi@example.com\",\n \"age\": 30\n },\n {\n \"id\": 3,\n \"name\": \"王五\",\n \"email\": \"wangwu@example.com\",\n \"age\": 28\n }\n ],\n \"count\": 3,\n \"status\": \"success\"\n}\n```\n\n---\n\n### 4. 创建用户\n\n创建一个新的用户。\n\n**请求方式**: `POST`\n\n**请求URL**: `/api/user`\n\n**请求头**:\n- `Content-Type: application/json`\n\n**请求体**:\n```json\n{\n \"name\": \"赵六\",\n \"email\": \"zhaoliu@example.com\",\n \"age\": 35\n}\n```\n\n**请求参数**:\n- `name` (string, 必需): 用户姓名\n- `email` (string, 必需): 用户邮箱\n- `age` (int, 可选): 用户年龄\n\n**响应示例**:\n```json\n{\n \"user\": {\n \"id\": 4,\n \"name\": \"赵六\",\n \"email\": \"zhaoliu@example.com\",\n \"age\": 35\n },\n \"message\": \"用户创建成功\",\n \"status\": \"success\"\n}\n```\n\n**错误响应**:\n```json\n{\n \"message\": \"缺少必需字段\",\n \"status\": \"error\"\n}\n```\n\n---\n\n### 5. 更新用户信息\n\n更新指定用户的信息。\n\n**请求方式**: `PUT`\n\n**请求URL**: `/api/user/{user_id}`\n\n**路径参数**:\n- `user_id` (int): 用户ID\n\n**请求头**:\n- `Content-Type: application/json`\n\n**请求体**:\n```json\n{\n \"name\": \"张三三\",\n \"email\": \"zhangsansan@example.com\",\n \"age\": 26\n}\n```\n\n**请求参数**:\n- `name` (string, 可选): 用户姓名\n- `email` (string, 可选): 用户邮箱\n- `age` (int, 可选): 用户年龄\n\n**响应示例**:\n```json\n{\n \"user\": {\n \"name\": \"张三三\",\n \"email\": \"zhangsansan@example.com\",\n \"age\": 26\n },\n \"message\": \"用户信息更新成功\",\n \"status\": \"success\"\n}\n```\n\n**错误响应**:\n```json\n{\n \"message\": \"用户不存在\",\n \"status\": \"error\"\n}\n```\n\n---\n\n### 6. 删除用户\n\n删除指定的用户。\n\n**请求方式**: `DELETE`\n\n**请求URL**: `/api/user/{user_id}`\n\n**路径参数**:\n- `user_id` (int): 用户ID\n\n**响应示例**:\n```json\n{\n \"message\": \"用户删除成功\",\n \"status\": \"success\"\n}\n```\n\n**错误响应**:\n```json\n{\n \"message\": \"用户不存在\",\n \"status\": \"error\"\n}\n```\n\n---\n\n### 7. 文件上传\n\n上传文件到服务器。\n\n**请求方式**: `POST`\n\n**请求URL**: `/api/upload`\n\n**请求头**:\n- `Content-Type: multipart/form-data`\n\n**请求参数**:\n- `file` (file, 必需): 要上传的文件\n\n**响应示例**:\n```json\n{\n \"message\": \"文件上传成功\",\n \"filename\": \"example.jpg\",\n \"file_path\": \"uploads/example.jpg\",\n \"status\": \"success\"\n}\n```\n\n**错误响应**:\n```json\n{\n \"message\": \"没有文件被上传\",\n \"status\": \"error\"\n}\n```\n\n---\n\n## 使用示例\n\n### JavaScript (使用fetch API)\n\n```javascript\n// 获取所有用户\nfetch('http://localhost:5000/api/users')\n .then(response => response.json())\n .then(data => console.log(data));\n\n// 创建新用户\nfetch('http://localhost:5000/api/user', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: '新用户',\n email: 'newuser@example.com',\n age: 25\n })\n})\n .then(response => response.json())\n .then(data => console.log(data));\n\n// 上传文件\nconst formData = new FormData();\nformData.append('file', fileInput.files[0]);\n\nfetch('http://localhost:5000/api/upload', {\n method: 'POST',\n body: formData\n})\n .then(response => response.json())\n .then(data => console.log(data));\n```\n\n### Python (使用requests库)\n\n```python\nimport requests\n\n# 获取所有用户\nresponse = requests.get('http://localhost:5000/api/users')\nprint(response.json())\n\n# 创建新用户\nuser_data = {\n 'name': '新用户',\n 'email': 'newuser@example.com',\n 'age': 25\n}\nresponse = requests.post('http://localhost:5000/api/user', json=user_data)\nprint(response.json())\n\n# 上传文件\nfiles = {'file': open('example.jpg', 'rb')}\nresponse = requests.post('http://localhost:5000/api/upload', files=files)\nprint(response.json())\n```\n\n---\n\n## 注意事项\n\n1. 所有API接口都支持跨域请求(CORS)\n2. 文件上传大小限制为16MB\n3. 上传的文件保存在服务器的`uploads`目录下\n4. 用户数据目前是模拟数据,重启服务器后会重置\n5. 在生产环境中,应该实现数据库持久化和用户认证"}}, "CLAUDE.md": {"238da94ae54462601373d62a1bc960d125bfb636": {"t": 1785747326.3243504, "n": 19363, "h": "a8af72b9476cc737", "c": "# 第一个规范 (必须遵守)\n 当每次大的修改和功能的新增,如果与CLAUDE.md文件内容不一致了,需要把新增的功能或者修改功能的逻辑重新写入CLAUDE.md,确保CLAUDE.md文件为最新的。\n \n# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n\n| 业务模块 | Route 文件 | Service 文件 | Model 文件 | 职责说明 |\n| :--- | :--- | :--- | :--- | :--- |\n| **User (用户权限)** | `user_route.py` | `user_service.py` | `user_model.py`, `user_info_model.py`, `permission_model.py`, `module_model.py` | 注册、登录、JWT鉴权、用户管理、模块权限分配 |\n| **Dashboard (数据大屏)** | `dashboard_route.py` | `dashboard_service.py` | `attack_stats_model.py` | 攻击趋势、类型分布、地图热力、总览统计(均需JWT) |\n| **Honeypot (蜜罐管理)** | `honeypot_route.py` | `honeypot_service.py` | `honeypot_model.py` | 蜜罐CRUD、进程启停、健康检查、PID持久化 |\n| **Log (日志审计)** | `log_route.py` | `log_service.py` | `log_model.py` | 日志查询、分页、导出CSV、内部上报(蜜罐使用) |\n| **Malicious IP (恶意拦截)** | `malicious_ip_route.py` | `malicious_ip_service.py` | `malicious_ip_model.py`, `block_history_model.py` | 恶意IP列表、封禁/解封、防火墙命令下发 |\n| **Match Rule (规则引擎)** | `match_rule_route.py` | `match_rule_service.py` | `match_rule_model.py` | 正则匹配规则管理、启停切换、自动封禁配置 |\n| **AI Config (大模型配置)** | `ai_config_route.py` | `ai_config_service.py`, `ai_analysis_service.py` | `ai_config_model.py` | LLM参数化配置、激活/禁用、连通性测试 |\n| **Test (测试接口)** | `test_route.py` | `test_service.py` | — | 内部功能测试,非生产接口 |\n\n### 2. 完整 API 端点清单\n\n#### /api/user — 用户管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| POST | `/api/user/register` | 无 | 用户注册 |\n| POST | `/api/user/login` | 无 | 用户登录,返回 JWT |\n| POST | `/api/user/create_admin` | 无 | 创建管理员(初始化用) |\n| GET | `/api/user/me` | JWT | 获取当前用户信息 |\n| PUT | `/api/user/me` | JWT | 更新当前用户信息(手机/邮箱/密码) |\n| GET | `/api/user/list` | JWT + 管理员 | 分页获取用户列表 |\n| POST | `/api/user/add` | JWT + 管理员 | 管理员新增用户 |\n| PUT | `/api/user/<user_id>` | JWT + 管理员 | 管理员修改用户 |\n| DELETE | `/api/user/<user_id>` | JWT + 管理员 | 管理员删除用户 |\n| GET | `/api/user/permissions` | JWT + 管理员 | 获取所有权限列表 |\n| GET | `/api/user/modules` | JWT | 获取所有模块列表 |\n\n#### /api/dashboard — 数据大屏\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/dashboard/trend` | JWT | 攻击趋势(支持 days/granularity 参数) |\n| GET | `/api/dashboard/types` | JWT | 攻击类型统计分布 |\n| GET | `/api/dashboard/map` | JWT | 攻击来源地图数据 |\n| GET | `/api/dashboard/summary` | JWT | 总览统计(总攻击数、封禁数等) |\n\n#### /api/honeypots — 蜜罐管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/honeypots` | JWT | 分页查询蜜罐列表(支持 type/status/keyword) |\n| POST | `/api/honeypots` | JWT | 创建新蜜罐 |\n| PUT | `/api/honeypots/<hp_id>` | JWT | 更新蜜罐配置 |\n| DELETE | `/api/honeypots/<hp_id>` | JWT | 删除蜜罐 |\n| POST | `/api/honeypots/<hp_id>/start` | JWT | 启动蜜罐进程 |\n| POST | `/api/honeypots/<hp_id>/stop` | JWT | 停止蜜罐进程 |\n| GET | `/api/honeypots/<hp_id>/health` | JWT | 蜜罐健康检查 |\n\n#### /api/logs — 日志审计\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/logs` | JWT | 分页查询日志(支持多字段过滤) |\n| GET | `/api/logs/export` | JWT | 导出日志为 CSV(含 BOM,支持 Excel) |\n| GET | `/api/logs/<log_id>` | JWT | 根据 ID 获取单条日志 |\n| GET | `/api/logs/attack-types` | JWT | 获取所有攻击类型枚举 |\n| GET | `/api/logs/threat-levels` | JWT | 获取所有威胁等级枚举 |\n| GET | `/api/logs/statistics` | JWT | 获取日志统计汇总 |\n| POST | `/api/logs/internal/upload` | 无 | **内部接口**:蜜罐进程上报攻击日志 |\n\n#### /api/malicious-ips — 恶意IP管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/malicious-ips` | JWT | 分页查询恶意IP(支持 is_blocked/threat_level/keyword) |\n| POST | `/api/malicious-ips/block` | JWT | 封禁指定IP(支持时长/截止时间) |\n| POST | `/api/malicious-ips/unblock` | JWT | 解封指定IP |\n\n#### /api/match-rules — 匹配规则引擎\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/match-rules` | JWT | 分页查询规则 |\n| GET | `/api/match-rules/<rule_id>` | JWT | 获取单条规则 |\n| POST | `/api/match-rules` | JWT | 创建规则(正则+威胁等级+自动封禁配置) |\n| PUT | `/api/match-rules/<rule_id>` | JWT | 更新规则 |\n| DELETE | `/api/match-rules/<rule_id>` | JWT | 删除规则 |\n| PUT | `/api/match-rules/<rule_id>/toggle` | JWT | 切换规则启用状态 |\n| GET | `/api/match-rules/attack-types` | JWT | 获取攻击类型枚举 |\n| GET | `/api/match-rules/threat-levels` | JWT | 获取威胁等级枚举 |\n\n#### /api/ai-config — AI大模型配置\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/ai-config/` | JWT | 获取所有AI配置 |\n| POST | `/api/ai-config/` | JWT | 创建AI配置(name/api_url/model_name必填) |\n| PUT | `/api/ai-config/<config_id>` | JWT | 更新AI配置 |\n| DELETE | `/api/ai-config/<config_id>` | JWT | 删除AI配置 |\n| POST | `/api/ai-config/<config_id>/activate` | JWT | 激活配置(设为当前使用) |\n| POST | `/api/ai-config/<config_id>/deactivate` | JWT | 禁用配置 |\n| POST | `/api/ai-config/<config_id>/test` | JWT | 测试AI配置连通性 |\n\n### 3. 数据库模型清单\n\n共 12 个 Model 文件,对应以下数据库表:\n\n| 模型文件 | 表名 | 说明 |\n| :--- | :--- | :--- |\n| `user_model.py` | `users` | 用户账号、密码哈希、角色(1管理员/2普通用户) |\n| `user_info_model.py` | `user_infos` | 用户扩展信息(手机号、邮箱、头像等) |\n| `permission_model.py` | `permissions` | 系统权限定义 |\n| `module_model.py` | `modules` / `user_modules` | 系统模块定义及用户-模块关联 |\n| `honeypot_model.py` | `honeypots` | 蜜罐配置(类型、端口、状态、`pid` 字段用于持久化进程) |\n| `log_model.py` | `logs` | 攻击日志记录(来源IP、载荷、威胁等级、协议等) |\n| `malicious_ip_model.py` | `malicious_ips` | 恶意IP列表(封禁状态、威胁等级、攻击次数) |\n| `block_history_model.py` | `block_history` | 封禁/解封操作历史记录 |\n| `attack_stats_model.py` | `attack_stats` | 攻击统计聚合数据(供 Dashboard 使用) |\n| `match_rule_model.py` | `match_rules` | 流量匹配规则(正则表达式、自动封禁、优先级) |\n| `ai_config_model.py` | `ai_configs` | AI大模型配置(API地址、模型名称、激活状态) |\n\n> **重要**:`honeypot_model.py` 中包含 `pid` 字段(Integer, nullable),用于在服务重启后通过 `psutil` 检查蜜罐子进程是否仍然存活。\n\n### 4. 蜜罐组件实现 (`backend/honeypots/`)\n\n| 文件 | 协议 | 默认端口 | 捕获目标 |\n| :--- | :--- | :--- | :--- |\n| `ftp_server.py` | FTP | 2121 | 爆破攻击、未授权访问、文件上传尝试 |\n| `ssh_server.py` | SSH | 2222 | 登录爆破、恶意命令执行(基于 Paramiko) |\n| `hikvision_http_server.py` | HTTP | 可配置(读取 `sys.argv[1]`) | IoT/摄像头设备漏洞探测、Web 攻击 |\n| `redis_server.py` | TCP/Redis | 6379 | Redis 未授权访问、SLAVEOF/CONFIG 命令利用 |\n| `mysql_server.py` | TCP/MySQL | 3306 | 数据库弱口令爆破(捕获用户名、客户端版本) |\n\n**蜜罐进程管理机制**:\n- 所有蜜罐以**独立子进程**方式启动(`subprocess.Popen`),与主 Flask 服务解耦。\n- 启动时将 PID 写入 `honeypots.pid` 数据库字段;停止时发送 `SIGTERM`/`taskkill`。\n- 服务重启后调用 `psutil.pid_exists()` 检查进程存活状态,自动修正数据库状态。\n- 蜜罐捕获到攻击后,通过 HTTP 调用 `/api/logs/internal/upload` 上报主服务。\n\n### 5. Agent 与智能响应模块 (`backend/agent/`)\n\n```\nagent/\n├── core.py # AI代理调度核心,支持多模型工作池、Queue+Threading异步队列\n├── llm_client.py # LLM客户端,封装 OpenAI 兼容 API 调用\n├── mcp/\n│ └── skill.py # MCP技能协议基类\n└── skills/\n ├── block_ip_skill.py # 自动封禁技能:先记录 malicious_ip 再调用防火墙封禁\n ├── decoder_skill.py # Base64/URL解码技能,辅助攻击载荷分析\n └── log_query_skill.py # 日志查询技能,供 AI Agent 检索历史攻击日志\n```\n\n**关键设计**:AI 分析通过 `Queue + Threading` 异步执行,不阻塞 HTTP 请求线程。\n\n### 6. 工具模块 (`backend/utils/`)\n\n| 文件 | 说明 |\n| :--- | :--- |\n| `api_response.py` | 统一 API 响应格式工具(`ApiResponse.success/error/bad_request` 等) |\n| `ip_utils.py` | **离线** IP 地理位置解析(MaxMind GeoLite2 MMDB),含 LRU 缓存 10000 条、私有 IP 判断 |\n| `time_utils.py` | 时间格式化工具函数 |\n| `download_geoip.py` | 自动下载/更新 GeoLite2 数据库脚本 |\n| `data/GeoLite2-City.mmdb` | 离线城市/国家地理数据库 |\n| `data/GeoLite2-ASN.mmdb` | 离线 ASN 自治系统数据库 |\n\n> **注意**:IP 溯源已从在线 `ip-api.com` 全面迁移至离线 MaxMind GeoLite2,无需外网访问。\n\n### 7. 前端视图清单 (`vueweb/vue-project/src/views/`)\n\n| 文件路径 | 功能说明 |\n| :--- | :--- |\n| `Dashboard.vue` | 仪表盘入口(路由容器) |\n| `dashboard/DashboardLayout.vue` | 数据大屏布局(导航 + 内容区) |\n| `dashboard/Overview.vue` | 攻击总览(总数、封禁数、实时告警) |\n| `dashboard/Trend.vue` | 攻击趋势折线图(按天/小时粒度) |\n| `dashboard/Types.vue` | 攻击类型饼图/柱状图分布 |\n| `dashboard/Map.vue` | 世界地图攻击来源热力图(ECharts) |\n| `HoneypotManagement.vue` | 蜜罐管理(CRUD、启停控制、健康状态监控) |\n| `LogQuery.vue` | 日志查询(多维度过滤、详情展示、CSV导出) |\n| `MaliciousIPManagement.vue` | 恶意IP管理(封禁/解封、威胁等级筛选) |\n| `MatchRuleManagement.vue` | 匹配规则管理(正则规则CRUD、启停切换) |\n| `AIConfigManagement.vue` | AI配置管理(多模型配置、激活/禁用、连通测试) |\n| `UserManagement.vue` | 用户管理(管理员):列表、增删改、模块权限分配 |\n| `UserProfile.vue` | 个人中心:查看/修改自己的手机、邮箱、密码 |\n\n**前端特性**:\n- 支持**暗黑/明亮**主题切换(持久化到 localStorage)。\n- 路由守卫:token 存在但 `user` 为空时,先 `await fetchCurrentUser()` 再放行,防止权限检查时序问题。\n- 所有 HTTP 请求通过 Axios 统一拦截器附加 `Authorization: Bearer <token>`。\n\n### 8. 后端初始化脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `init_database.py` | 创建所有数据库表(`db.create_all()`) |\n| `init_data.py` | 初始化基础数据(角色、权限) |\n| `init_modules.py` | 初始化系统功能模块数据 |\n| `init_permissions.py` | 初始化权限条目 |\n| `init_honeypot.py` | 初始化默认蜜罐配置 |\n| `config.py` | Flask 配置类(数据库URI、JWT密钥、CORS等) |\n| `extensions.py` | Flask 扩展实例集中管理(SocketIO 全局单例),避免 reloader 实例不一致 |\n| `app.py` | Flask 应用入口,注册所有蓝图,初始化 SocketIO 并注册 /ws namespace |\n\n### 9. 数据库迁移\n\n使用 Flask-Migrate(Alembic),迁移文件位于 `backend/migrations/versions/`。\n\n**已有迁移**:\n- `f1a2b3c4d5e6_add_pid_to_honeypots.py` — 为 `honeypots` 表新增 `pid` 字段,支持进程持久化重启检测。\n\n---\n\n## 八、WebSocket 实时推送架构\n\n### 1. 技术选型\n| 层 | 技术 | 版本 |\n| :--- | :--- | :--- |\n| 后端 | Flask-SocketIO | 5.3.6 |\n| 后端传输 | python-socketio + python-engineio | 5.10.0 / 4.8.2 |\n| 前端 | socket.io-client | 4.7.5 |\n\n### 2. 架构流程\n\n```\n蜜罐捕获攻击\n ↓ HTTP POST /api/logs/internal/upload\nlog_service.py · create_log()\n ├─ 规则匹配 (MatchRule)\n ├─ 写入 MySQL (Log)\n ├─ AI 分析任务入队\n ├─ 记录恶意 IP\n └─ [仅恶意流量] socketio.emit('new_attack', payload, namespace='/ws')\n ↓ WebSocket\n 前端 useSocket composable\n ↓\n ┌─────────────┼─────────────┐\n DashboardLayout.vue Overview.vue Map.vue\n (ElNotification弹窗 (数字跳动+ (地图红色\n + 高危横幅) 实时告警列表) 脉冲散点)\n```\n\n### 3. 关键文件\n\n| 文件 | 职责 |\n| :--- | :--- |\n| `backend/extensions.py` | **全局唯一** `socketio = SocketIO()` 实例,所有模块必须从此处导入 socketio,避免 werkzeug reloader 导致实例不一致 |\n| `backend/app.py` | `from extensions import socketio`,调用 `socketio.init_app(app, ...)`,注册 `/ws` namespace 的 connect/disconnect handler,使用 `socketio.run()` 替代 `app.run()` |\n| `backend/service/log_service.py` | `create_log()` 末尾 `from extensions import socketio`,emit `new_attack` 事件到 `/ws` namespace |\n| `frontend/src/composables/useSocket.ts` | 全局 Socket 单例管理,`connectSocket()`/`disconnectSocket()` 由 DashboardLayout 统一管理生命周期,提供 `onAttack/offAttack` 订阅方法,pending 队列 + 重连恢复(先 `off('new_attack')` 再统一重绑,避免 handler 重复注册) |\n| `frontend/src/views/dashboard/DashboardLayout.vue` | 订阅 `new_attack`,显示 `ElNotification` 弹窗 + 高危横幅(含滑入动画),菜单栏显示连接状态指示灯(绿/红),使用 `<keep-alive>` 缓存子路由 |\n| `frontend/src/views/dashboard/Overview.vue` | 订阅 `new_attack`,数字递增 + bounce 跳动动画 + 实时告警列表(最多 10 条,transition-group 滑入动画) |\n| `frontend/src/views/dashboard/Map.vue` | 订阅 `new_attack`,追加 `effectScatter` 脉冲散点到地图(使用 `Map` 结构消除竞态),5 秒后自动消失,过滤 `(0,0)` null-island 坐标 |\n\n> **重要**:`socketio` 实例必须从 `extensions.py` 导入,**禁止**从 `app.py` 导入。原因:werkzeug 的 `use_reloader=True` 会在子进程中重新执行 `app.py`,导致 `app.py` 中定义的 `socketio` 和其他模块缓存导入的 `socketio` 不是同一个对象。`extensions.py` 作为独立模块不受 reloader 影响。\n\n### 4. 推送事件规范\n\n**事件名**:`new_attack` \n**Namespace**:`/ws` \n**触发条件**:`is_malicious == True`(低危/正常流量不推送,减少噪声)\n\n**载荷字段**:\n```json\n{\n \"log_id\": 123,\n \"source_ip\": \"1.2.3.4\",\n \"attack_type\": \"SQL注入\",\n \"threat_level\": \"high\",\n \"protocol\": \"HTTP\",\n \"target_port\": 80,\n \"attack_time\": \"2026-03-27T10:30:00\",\n \"attack_description\": \"触发规则: SQL注入检测\",\n \"longitude\": 116.4074,\n \"latitude\": 39.9042\n}\n```\n\n### 5. 后端重启说明\n\nWebSocket 需要使用 `socketio.run()` 替代 `app.run()`,已在 `app.py` 中完成更新。\n重启后端后 WebSocket 功能即生效,无需额外操作。\n\n### 6. WebSocket 测试脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `backend/test/test_realtime_report.py` | 主测试脚本:30 次/60 秒全球 IP 的 SQL 注入攻击,用于验证大屏 4 个核心动态效果 |\n| `backend/test/verify_websocket.py` | WebSocket 推送端到端验证:Python socketio 客户端连接 `/ws`,发 3 条攻击,验证 4 项指标(事件到达、坐标、攻击类型、威胁等级) |\n\n---\n\n## 九、代码重载\n后端代码修改之后必须重新启动后端进程\n\n---\n\n## 十、多级恶意流量识别引擎\n\n### 1. 架构概述\n\n蜜罐捕获的原始流量经过**三级识别漏斗**,逐级过滤和分类:\n\n```\n蜜罐原始数据 → 第一级:正则规则匹配 → 第二级:暴力破解频次分析 → 第三级:AI深度分析\n```\n\n### 2. 蜜罐端设计原则(纯数据采集探针)\n\n蜜罐脚本**只负责捕获原始数据**,不做任何攻击分类。上报字段:\n- `attacker_ip` / `attacker_port` — 攻击来源\n- `honeypot_port` — 蜜罐端口\n- `protocol` — 协议类型 (SSH/FTP/HTTP/TCP 等)\n- `raw_log` — 原始请求/命令完整记录\n- `payload` — 载荷内容(认证类蜜罐统一格式:`\"Username: xxx, Password: xxx\"`)\n- `request_path` / `user_agent` — HTTP 蜜罐专用字段\n\n**禁止**在蜜罐脚本中包含 `attack_type`、`threat_level`、`attack_description` 等分类逻辑。\n\n### 3. 三级识别流水线(`log_service.py` · `create_log()`)\n\n#### 第一级:正则规则引擎匹配\n- 从 `match_rules` 表读取所有 `is_enabled=True` 的规则,按 `priority ASC` 排序(数字越小优先级越高)\n- 匹配字段由规则的 `match_field` 决定(目前全部为 `raw_log`)\n- 命中规则后立即设置 `attack_type`、`threat_level`、`attack_description`、`is_malicious`\n- **匹配所有启用的规则**,如果触发多个规则,则威胁等级取最高的一个,并在详细页面中同时展示多个攻击类型(简略展示在表格中,悬停查看全部)\n\n#### 第二级:暴力破解频次分析\n- **默认恶意判定规则**:对于蜜罐流量,所有的 `SSH尝试登录`、`FTP尝试登录`、`MySQL尝试登录`、`Redis尝试登录` 以及限定在 `/login` 目录的 `HTTP尝试登录` 均默认判定为**恶意流量** (`is_malicious=True`),并自动加入恶意 IP 列表(对于非`/login`的HTTP请求,除非触发其他规则,否则默认为正常流量)。\n- **触发条件**:第一级未命中任何高危规则,且属于尝试登录类行为(包括上述尝试登录以及正常流量)。\n- **检测方法**:`_check_brute_force(source_ip, protocol, current_payload)`\n - 查询同一 IP + 同一协议在最近 **1 分钟** 内的日志数量\n - HTTP 协议特殊处理:只有包含认证凭证(`Username:...Password:...`)的请求才计入暴力破解计数\n - 阈值:**20 次/分钟** (`BRUTE_FORCE_THRESHOLD = 20`)\n- **凭证检测**:`_is_credential_payload(payload)` 使用正则 `r'Username:\\s*.+,\\s*Password:\\s*.+'` 判断\n- 命中后设置 `attack_type='暴力破解'`、`threat_level='high'`、`is_malicious=True`\n\n#### 第三级:AI 深度分析\n- **触发条件**:所有日志均入 AI 分析队列(`Queue + Threading` 异步执行)\n- **AI 辅助判断机制**(\u0007i_analysis_service.py · _process_single_log()):\n - AI 仅独立提取和存入自己的分析结果字段(如 \u0007i_attack_type、\u0007i_confidence、\u0007i_analysis_result)。\n - **不修改、不覆写** 前置规则匹配引擎和暴力破解识别引擎的主判断结论(如 \u0007ttack_type、is_malicious、\threat_level 和 \u0007ttack_description)。\n - AI 判定后,将 AI 判断结论与主记录判断进行比较,记录在 \u0007i_rule_match_consistency 字段(一致 / 不一致),用作辅助审计依据。\n\n### 4. 匹配规则优先级说明\n\n规则按 `priority ASC` 排序匹配,关键优先级分布:\n\n| 优先级范围 | 规则类型 | 说明 |\n| :--- | :--- | :--- |\n| 1-3 | XSS、SQL注入(基础)、目录遍历 | 高频攻击,精确正则 |\n| 5 | Redis未授权访问 | 协议专用规则 |\n| 6-9 | WebShell、RCE、扫描探测 | 中等精度规则 |\n| 11-15 | SQL注入(盲注)、XXE、信息泄露 | 长正则、较复杂模式 |\n| 18 | 命令注入(宽泛匹配) | 匹配 `;` `|` `(` 等字符,优先级故意调低,避免误判 |\n| 20-50 | XSS/目录遍历/信息泄露/扫描探测(补充) | 低优先级兜底规则 |\n\n> **重要**:命令注入规则 (ID=8) 的正则包含 `(;|\\||&|\\$|\\(|\\)|...)` 极其宽泛,priority 已从 5 调整为 18,防止将 `sleep()`、`eval()`、Nmap UA 等载荷误判为命令注入。\n\n### 5. 自动化测试\n\n测试脚本:`backend/test_traffic_identification.py`\n\n- **51 个断言**,覆盖 22 个测试场景\n- 4 个正常流量测试(SSH/FTP/HTTP/ES)\n- 11 个正则规则匹配测试(SQL注入×2、XSS×2、命令注入、目录遍历、信息泄露、Redis×2、WebShell、扫描探测)\n- 5 个暴力破解测试(SSH低频/高频、HTTP纯GET不触发、HTTP凭证爆破、FTP爆破、MySQL爆破)\n- 2 个混合场景测试\n\n运行方式:\n```bash\n# 确保 Flask 后端运行在 5000 端口\ncd backend\npython run_server.py & # 或 python app.py\npython test_traffic_identification.py\n```\n\n测试脚本在 SETUP 阶段会自动:\n- 创建/复用测试账户 `testadmin01`\n- 动态发现蜜罐端口\n- 确保 Redis 匹配规则存在\n- 将命令注入规则优先级调至 18"}, "d29e414d604b9f5fd340fa59c5aa963d0464a8fb": {"t": 1785764205.4447565, "n": 19297, "h": "10c1243478836833", "c": "# 第一个规范 (必须遵守)\n 当每次大的修改和功能的新增,如果与CLAUDE.md文件内容不一致了,需要把新增的功能或者修改功能的逻辑重新写入CLAUDE.md,确保CLAUDE.md文件为最新的。\n \n# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n\n| 业务模块 | Route 文件 | Service 文件 | Model 文件 | 职责说明 |\n| :--- | :--- | :--- | :--- | :--- |\n| **User (用户权限)** | `user_route.py` | `user_service.py` | `user_model.py`, `user_info_model.py`, `permission_model.py`, `module_model.py` | 注册、登录、JWT鉴权、用户管理、模块权限分配 |\n| **Dashboard (数据大屏)** | `dashboard_route.py` | `dashboard_service.py` | `attack_stats_model.py` | 攻击趋势、类型分布、地图热力、总览统计(均需JWT) |\n| **Honeypot (蜜罐管理)** | `honeypot_route.py` | `honeypot_service.py` | `honeypot_model.py` | 蜜罐CRUD、进程启停、健康检查、PID持久化 |\n| **Log (日志审计)** | `log_route.py` | `log_service.py` | `log_model.py` | 日志查询、分页、导出CSV、内部上报(蜜罐使用) |\n| **Malicious IP (恶意拦截)** | `malicious_ip_route.py` | `malicious_ip_service.py` | `malicious_ip_model.py`, `block_history_model.py` | 恶意IP列表、封禁/解封、防火墙命令下发 |\n| **Match Rule (规则引擎)** | `match_rule_route.py` | `match_rule_service.py` | `match_rule_model.py` | 正则匹配规则管理、启停切换、自动封禁配置 |\n| **AI Config (大模型配置)** | `ai_config_route.py` | `ai_config_service.py`, `ai_analysis_service.py` | `ai_config_model.py` | LLM参数化配置、激活/禁用、连通性测试 |\n| **Test (测试接口)** | `test_route.py` | `test_service.py` | — | 内部功能测试,非生产接口 |\n\n### 2. 完整 API 端点清单\n\n#### /api/user — 用户管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| POST | `/api/user/register` | 无 | 用户注册 |\n| POST | `/api/user/login` | 无 | 用户登录,返回 JWT |\n| POST | `/api/user/create_admin` | 无 | 创建管理员(初始化用) |\n| GET | `/api/user/me` | JWT | 获取当前用户信息 |\n| PUT | `/api/user/me` | JWT | 更新当前用户信息(手机/邮箱/密码) |\n| GET | `/api/user/list` | JWT + 管理员 | 分页获取用户列表 |\n| POST | `/api/user/add` | JWT + 管理员 | 管理员新增用户 |\n| PUT | `/api/user/<user_id>` | JWT + 管理员 | 管理员修改用户 |\n| DELETE | `/api/user/<user_id>` | JWT + 管理员 | 管理员删除用户 |\n| GET | `/api/user/permissions` | JWT + 管理员 | 获取所有权限列表 |\n| GET | `/api/user/modules` | JWT | 获取所有模块列表 |\n\n#### /api/dashboard — 数据大屏\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/dashboard/trend` | JWT | 攻击趋势(支持 days/granularity 参数) |\n| GET | `/api/dashboard/types` | JWT | 攻击类型统计分布 |\n| GET | `/api/dashboard/map` | JWT | 攻击来源地图数据 |\n| GET | `/api/dashboard/summary` | JWT | 总览统计(总攻击数、封禁数等) |\n\n#### /api/honeypots — 蜜罐管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/honeypots` | JWT | 分页查询蜜罐列表(支持 type/status/keyword) |\n| POST | `/api/honeypots` | JWT | 创建新蜜罐 |\n| PUT | `/api/honeypots/<hp_id>` | JWT | 更新蜜罐配置 |\n| DELETE | `/api/honeypots/<hp_id>` | JWT | 删除蜜罐 |\n| POST | `/api/honeypots/<hp_id>/start` | JWT | 启动蜜罐进程 |\n| POST | `/api/honeypots/<hp_id>/stop` | JWT | 停止蜜罐进程 |\n| GET | `/api/honeypots/<hp_id>/health` | JWT | 蜜罐健康检查 |\n\n#### /api/logs — 日志审计\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/logs` | JWT | 分页查询日志(支持多字段过滤) |\n| GET | `/api/logs/export` | JWT | 导出日志为 CSV(含 BOM,支持 Excel) |\n| GET | `/api/logs/<log_id>` | JWT | 根据 ID 获取单条日志 |\n| GET | `/api/logs/attack-types` | JWT | 获取所有攻击类型枚举 |\n| GET | `/api/logs/threat-levels` | JWT | 获取所有威胁等级枚举 |\n| GET | `/api/logs/statistics` | JWT | 获取日志统计汇总 |\n| POST | `/api/logs/internal/upload` | 无 | **内部接口**:蜜罐进程上报攻击日志 |\n\n#### /api/malicious-ips — 恶意IP管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/malicious-ips` | JWT | 分页查询恶意IP(支持 is_blocked/threat_level/keyword) |\n| POST | `/api/malicious-ips/block` | JWT | 封禁指定IP(支持时长/截止时间) |\n| POST | `/api/malicious-ips/unblock` | JWT | 解封指定IP |\n\n#### /api/match-rules — 匹配规则引擎\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/match-rules` | JWT | 分页查询规则 |\n| GET | `/api/match-rules/<rule_id>` | JWT | 获取单条规则 |\n| POST | `/api/match-rules` | JWT | 创建规则(正则+威胁等级+自动封禁配置) |\n| PUT | `/api/match-rules/<rule_id>` | JWT | 更新规则 |\n| DELETE | `/api/match-rules/<rule_id>` | JWT | 删除规则 |\n| PUT | `/api/match-rules/<rule_id>/toggle` | JWT | 切换规则启用状态 |\n| GET | `/api/match-rules/attack-types` | JWT | 获取攻击类型枚举 |\n| GET | `/api/match-rules/threat-levels` | JWT | 获取威胁等级枚举 |\n\n#### /api/ai-config — AI大模型配置\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/ai-config/` | JWT | 获取所有AI配置 |\n| POST | `/api/ai-config/` | JWT | 创建AI配置(name/api_url/model_name必填) |\n| PUT | `/api/ai-config/<config_id>` | JWT | 更新AI配置 |\n| DELETE | `/api/ai-config/<config_id>` | JWT | 删除AI配置 |\n| POST | `/api/ai-config/<config_id>/activate` | JWT | 激活配置(设为当前使用) |\n| POST | `/api/ai-config/<config_id>/deactivate` | JWT | 禁用配置 |\n| POST | `/api/ai-config/<config_id>/test` | JWT | 测试AI配置连通性 |\n\n### 3. 数据库模型清单\n\n共 12 个 Model 文件,对应以下数据库表:\n\n| 模型文件 | 表名 | 说明 |\n| :--- | :--- | :--- |\n| `user_model.py` | `users` | 用户账号、密码哈希、角色(1管理员/2普通用户) |\n| `user_info_model.py` | `user_infos` | 用户扩展信息(手机号、邮箱、头像等) |\n| `permission_model.py` | `permissions` | 系统权限定义 |\n| `module_model.py` | `modules` / `user_modules` | 系统模块定义及用户-模块关联 |\n| `honeypot_model.py` | `honeypots` | 蜜罐配置(类型、端口、状态、`pid` 字段用于持久化进程) |\n| `log_model.py` | `logs` | 攻击日志记录(来源IP、载荷、威胁等级、协议等) |\n| `malicious_ip_model.py` | `malicious_ips` | 恶意IP列表(封禁状态、威胁等级、攻击次数) |\n| `block_history_model.py` | `block_history` | 封禁/解封操作历史记录 |\n| `attack_stats_model.py` | `attack_stats` | 攻击统计聚合数据(供 Dashboard 使用) |\n| `match_rule_model.py` | `match_rules` | 流量匹配规则(正则表达式、自动封禁、优先级) |\n| `ai_config_model.py` | `ai_configs` | AI大模型配置(API地址、模型名称、激活状态) |\n\n> **重要**:`honeypot_model.py` 中包含 `pid` 字段(Integer, nullable),用于在服务重启后通过 `psutil` 检查蜜罐子进程是否仍然存活。\n\n### 4. 蜜罐组件实现 (`backend/honeypots/`)\n\n| 文件 | 协议 | 默认端口 | 捕获目标 |\n| :--- | :--- | :--- | :--- |\n| `ftp_server.py` | FTP | 2121 | 爆破攻击、未授权访问、文件上传尝试 |\n| `ssh_server.py` | SSH | 2222 | 登录爆破、恶意命令执行(基于 Paramiko) |\n| `hikvision_http_server.py` | HTTP | 可配置(读取 `sys.argv[1]`) | IoT/摄像头设备漏洞探测、Web 攻击 |\n| `redis_server.py` | TCP/Redis | 6379 | Redis 未授权访问、SLAVEOF/CONFIG 命令利用 |\n| `mysql_server.py` | TCP/MySQL | 3306 | 数据库弱口令爆破(捕获用户名、客户端版本) |\n\n**蜜罐进程管理机制**:\n- 所有蜜罐以**独立子进程**方式启动(`subprocess.Popen`),与主 Flask 服务解耦。\n- 启动时将 PID 写入 `honeypots.pid` 数据库字段;停止时发送 `SIGTERM`/`taskkill`。\n- 服务重启后调用 `psutil.pid_exists()` 检查进程存活状态,自动修正数据库状态。\n- 蜜罐捕获到攻击后,通过 HTTP 调用 `/api/logs/internal/upload` 上报主服务。\n\n### 5. Agent 与智能响应模块 (`backend/agent/`)\n\n```\nagent/\n├── core.py # AI代理调度核心,支持多模型工作池、Queue+Threading异步队列\n├── llm_client.py # LLM客户端,封装 OpenAI 兼容 API 调用\n├── mcp/\n│ └── skill.py # MCP技能协议基类\n└── skills/\n ├── block_ip_skill.py # 自动封禁技能:先记录 malicious_ip 再调用防火墙封禁\n ├── decoder_skill.py # Base64/URL解码技能,辅助攻击载荷分析\n └── log_query_skill.py # 日志查询技能,供 AI Agent 检索历史攻击日志\n```\n\n**关键设计**:AI 分析通过 `Queue + Threading` 异步执行,不阻塞 HTTP 请求线程。\n\n### 6. 工具模块 (`backend/utils/`)\n\n| 文件 | 说明 |\n| :--- | :--- |\n| `api_response.py` | 统一 API 响应格式工具(`ApiResponse.success/error/bad_request` 等) |\n| `ip_utils.py` | **离线** IP 地理位置解析(MaxMind GeoLite2 MMDB),含 LRU 缓存 10000 条、私有 IP 判断 |\n| `time_utils.py` | 时间格式化工具函数 |\n| `download_geoip.py` | 自动下载/更新 GeoLite2 数据库脚本 |\n| `data/GeoLite2-City.mmdb` | 离线城市/国家地理数据库 |\n| `data/GeoLite2-ASN.mmdb` | 离线 ASN 自治系统数据库 |\n\n> **注意**:IP 溯源已从在线 `ip-api.com` 全面迁移至离线 MaxMind GeoLite2,无需外网访问。\n\n### 7. 前端视图清单 (`vueweb/vue-project/src/views/`)\n\n| 文件路径 | 功能说明 |\n| :--- | :--- |\n| `Dashboard.vue` | 仪表盘入口(路由容器) |\n| `dashboard/DashboardLayout.vue` | 数据大屏布局(导航 + 内容区) |\n| `dashboard/Overview.vue` | 攻击总览(总数、封禁数、实时告警) |\n| `dashboard/Trend.vue` | 攻击趋势折线图(按天/小时粒度) |\n| `dashboard/Types.vue` | 攻击类型饼图/柱状图分布 |\n| `dashboard/Map.vue` | 世界地图攻击来源热力图(ECharts) |\n| `HoneypotManagement.vue` | 蜜罐管理(CRUD、启停控制、健康状态监控) |\n| `LogQuery.vue` | 日志查询(多维度过滤、详情展示、CSV导出) |\n| `MaliciousIPManagement.vue` | 恶意IP管理(封禁/解封、威胁等级筛选) |\n| `MatchRuleManagement.vue` | 匹配规则管理(正则规则CRUD、启停切换) |\n| `AIConfigManagement.vue` | AI配置管理(多模型配置、激活/禁用、连通测试) |\n| `UserManagement.vue` | 用户管理(管理员):列表、增删改、模块权限分配 |\n| `UserProfile.vue` | 个人中心:查看/修改自己的手机、邮箱、密码 |\n\n**前端特性**:\n- 支持**暗黑/明亮**主题切换(持久化到 localStorage)。\n- 路由守卫:token 存在但 `user` 为空时,先 `await fetchCurrentUser()` 再放行,防止权限检查时序问题。\n- 所有 HTTP 请求通过 Axios 统一拦截器附加 `Authorization: Bearer <token>`。\n\n### 8. 后端初始化脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `init_database.py` | 创建所有数据库表(`db.create_all()`) |\n| `init_data.py` | 初始化基础数据(角色、权限) |\n| `init_modules.py` | 初始化系统功能模块数据 |\n| `init_permissions.py` | 初始化权限条目 |\n| `init_honeypot.py` | 初始化默认蜜罐配置 |\n| `config.py` | Flask 配置类(数据库URI、JWT密钥、CORS等) |\n| `extensions.py` | Flask 扩展实例集中管理(SocketIO 全局单例),避免 reloader 实例不一致 |\n| `app.py` | Flask 应用入口,注册所有蓝图,初始化 SocketIO 并注册 /ws namespace |\n\n### 9. 数据库迁移\n\n使用 Flask-Migrate(Alembic),迁移文件位于 `backend/migrations/versions/`。\n\n**已有迁移**:\n- `f1a2b3c4d5e6_add_pid_to_honeypots.py` — 为 `honeypots` 表新增 `pid` 字段,支持进程持久化重启检测。\n\n---\n\n## 八、WebSocket 实时推送架构\n\n### 1. 技术选型\n| 层 | 技术 | 版本 |\n| :--- | :--- | :--- |\n| 后端 | Flask-SocketIO | 5.3.6 |\n| 后端传输 | python-socketio + python-engineio | 5.10.0 / 4.8.2 |\n| 前端 | socket.io-client | 4.7.5 |\n\n### 2. 架构流程\n\n```\n蜜罐捕获攻击\n ↓ HTTP POST /api/logs/internal/upload\nlog_service.py · create_log()\n ├─ 规则匹配 (MatchRule)\n ├─ 写入 MySQL (Log)\n ├─ AI 分析任务入队\n ├─ 记录恶意 IP\n └─ [仅恶意流量] socketio.emit('new_attack', payload, namespace='/ws')\n ↓ WebSocket\n 前端 useSocket composable\n ↓\n ┌─────────────┼─────────────┐\n DashboardLayout.vue Overview.vue Map.vue\n (ElNotification弹窗 (数字跳动+ (地图红色\n + 高危横幅) 实时告警列表) 脉冲散点)\n```\n\n### 3. 关键文件\n\n| 文件 | 职责 |\n| :--- | :--- |\n| `backend/extensions.py` | **全局唯一** `socketio = SocketIO()` 实例,所有模块必须从此处导入 socketio,避免 werkzeug reloader 导致实例不一致 |\n| `backend/app.py` | `from extensions import socketio`,调用 `socketio.init_app(app, ...)`,注册 `/ws` namespace 的 connect/disconnect handler,使用 `socketio.run()` 替代 `app.run()` |\n| `backend/service/log_service.py` | `create_log()` 末尾 `from extensions import socketio`,emit `new_attack` 事件到 `/ws` namespace |\n| `frontend/src/composables/useSocket.ts` | 全局 Socket 单例管理,`connectSocket()`/`disconnectSocket()` 由 DashboardLayout 统一管理生命周期,提供 `onAttack/offAttack` 订阅方法,pending 队列 + 重连恢复(先 `off('new_attack')` 再统一重绑,避免 handler 重复注册) |\n| `frontend/src/views/dashboard/DashboardLayout.vue` | 订阅 `new_attack`,显示 `ElNotification` 弹窗 + 高危横幅(含滑入动画),菜单栏显示连接状态指示灯(绿/红),使用 `<keep-alive>` 缓存子路由 |\n| `frontend/src/views/dashboard/Overview.vue` | 订阅 `new_attack`,数字递增 + bounce 跳动动画 + 实时告警列表(最多 10 条,transition-group 滑入动画) |\n| `frontend/src/views/dashboard/Map.vue` | 订阅 `new_attack`,追加 `effectScatter` 脉冲散点到地图(使用 `Map` 结构消除竞态),5 秒后自动消失,过滤 `(0,0)` null-island 坐标 |\n\n> **重要**:`socketio` 实例必须从 `extensions.py` 导入,**禁止**从 `app.py` 导入。原因:werkzeug 的 `use_reloader=True` 会在子进程中重新执行 `app.py`,导致 `app.py` 中定义的 `socketio` 和其他模块缓存导入的 `socketio` 不是同一个对象。`extensions.py` 作为独立模块不受 reloader 影响。\n\n### 4. 推送事件规范\n\n**事件名**:`new_attack` \n**Namespace**:`/ws` \n**触发条件**:`is_malicious == True`(低危/正常流量不推送,减少噪声)\n\n**载荷字段**:\n```json\n{\n \"log_id\": 123,\n \"source_ip\": \"1.2.3.4\",\n \"attack_type\": \"SQL注入\",\n \"threat_level\": \"high\",\n \"protocol\": \"HTTP\",\n \"target_port\": 80,\n \"attack_time\": \"2026-03-27T10:30:00\",\n \"attack_description\": \"触发规则: SQL注入检测\",\n \"longitude\": 116.4074,\n \"latitude\": 39.9042\n}\n```\n\n### 5. 后端重启说明\n\nWebSocket 需要使用 `socketio.run()` 替代 `app.run()`,已在 `app.py` 中完成更新。\n重启后端后 WebSocket 功能即生效,无需额外操作。\n\n### 6. WebSocket 测试脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `backend/test/test_realtime_report.py` | 主测试脚本:30 次/60 秒全球 IP 的 SQL 注入攻击,用于验证大屏 4 个核心动态效果 |\n| `backend/test/verify_websocket.py` | WebSocket 推送端到端验证:Python socketio 客户端连接 `/ws`,发 3 条攻击,验证 4 项指标(事件到达、坐标、攻击类型、威胁等级) |\n\n---\n\n## 九、代码重载\n后端代码修改之后必须重新启动后端进程\n\n---\n\n## 十、多级恶意流量识别引擎\n\n### 1. 架构概述\n\n蜜罐捕获的原始流量经过**三级识别漏斗**,逐级过滤和分类:\n\n```\n蜜罐原始数据 → 第一级:正则规则匹配 → 第二级:暴力破解频次分析 → 第三级:AI深度分析\n```\n\n### 2. 蜜罐端设计原则(纯数据采集探针)\n\n蜜罐脚本**只负责捕获原始数据**,不做任何攻击分类。上报字段:\n- `attacker_ip` / `attacker_port` — 攻击来源\n- `honeypot_port` — 蜜罐端口\n- `protocol` — 协议类型 (SSH/FTP/HTTP/TCP 等)\n- `raw_log` — 原始请求/命令完整记录\n- `payload` — 载荷内容(认证类蜜罐统一格式:`\"Username: xxx, Password: xxx\"`)\n- `request_path` / `user_agent` — HTTP 蜜罐专用字段\n\n**禁止**在蜜罐脚本中包含 `attack_type`、`threat_level`、`attack_description` 等分类逻辑。\n\n### 3. 三级识别流水线(`log_service.py` · `create_log()`)\n\n#### 第一级:正则规则引擎匹配\n- 从 `match_rules` 表读取所有 `is_enabled=True` 的规则,按 `priority ASC` 排序(数字越小优先级越高)\n- 匹配字段由规则的 `match_field` 决定(目前全部为 `raw_log`)\n- 命中规则后立即设置 `attack_type`、`threat_level`、`attack_description`、`is_malicious`\n- **首条命中即停止**,不会继续匹配后续规则\n\n#### 第二级:暴力破解频次分析\n- **默认恶意判定规则**:对于蜜罐流量,除 HTTP 访问 `/` 和 `/dashboard` 外,所有的 `SSH尝试登录`、`FTP尝试登录`、`MySQL尝试登录`、`Redis尝试登录` 以及其他路径的 `HTTP尝试登录` 均默认判定为**恶意流量** (`is_malicious=True`),并自动加入恶意 IP 列表。\n- **触发条件**:第一级未命中任何高危规则,且属于尝试登录类行为(包括上述尝试登录以及正常流量)。\n- **检测方法**:`_check_brute_force(source_ip, protocol, current_payload)`\n - 查询同一 IP + 同一协议在最近 **1 分钟** 内的日志数量\n - HTTP 协议特殊处理:只有包含认证凭证(`Username:...Password:...`)的请求才计入暴力破解计数\n - 阈值:**20 次/分钟** (`BRUTE_FORCE_THRESHOLD = 20`)\n- **凭证检测**:`_is_credential_payload(payload)` 使用正则 `r'Username:\\s*.+,\\s*Password:\\s*.+'` 判断\n- 命中后设置 `attack_type='暴力破解'`、`threat_level='high'`、`is_malicious=True`\n\n#### 第三级:AI 深度分析\n- **触发条件**:所有日志均入 AI 分析队列(`Queue + Threading` 异步执行)\n- **AI 辅助判断机制**(\u0007i_analysis_service.py · _process_single_log()):\n - AI 仅独立提取和存入自己的分析结果字段(如 \u0007i_attack_type、\u0007i_confidence、\u0007i_analysis_result)。\n - **不修改、不覆写** 前置规则匹配引擎和暴力破解识别引擎的主判断结论(如 \u0007ttack_type、is_malicious、\threat_level 和 \u0007ttack_description)。\n - AI 判定后,将 AI 判断结论与主记录判断进行比较,记录在 \u0007i_rule_match_consistency 字段(一致 / 不一致),用作辅助审计依据。\n\n### 4. 匹配规则优先级说明\n\n规则按 `priority ASC` 排序匹配,关键优先级分布:\n\n| 优先级范围 | 规则类型 | 说明 |\n| :--- | :--- | :--- |\n| 1-3 | XSS、SQL注入(基础)、目录遍历 | 高频攻击,精确正则 |\n| 5 | Redis未授权访问 | 协议专用规则 |\n| 6-9 | WebShell、RCE、扫描探测 | 中等精度规则 |\n| 11-15 | SQL注入(盲注)、XXE、信息泄露 | 长正则、较复杂模式 |\n| 18 | 命令注入(宽泛匹配) | 匹配 `;` `|` `(` 等字符,优先级故意调低,避免误判 |\n| 20-50 | XSS/目录遍历/信息泄露/扫描探测(补充) | 低优先级兜底规则 |\n\n> **重要**:命令注入规则 (ID=8) 的正则包含 `(;|\\||&|\\$|\\(|\\)|...)` 极其宽泛,priority 已从 5 调整为 18,防止将 `sleep()`、`eval()`、Nmap UA 等载荷误判为命令注入。\n\n### 5. 自动化测试\n\n测试脚本:`backend/test_traffic_identification.py`\n\n- **51 个断言**,覆盖 22 个测试场景\n- 4 个正常流量测试(SSH/FTP/HTTP/ES)\n- 11 个正则规则匹配测试(SQL注入×2、XSS×2、命令注入、目录遍历、信息泄露、Redis×2、WebShell、扫描探测)\n- 5 个暴力破解测试(SSH低频/高频、HTTP纯GET不触发、HTTP凭证爆破、FTP爆破、MySQL爆破)\n- 2 个混合场景测试\n\n运行方式:\n```bash\n# 确保 Flask 后端运行在 5000 端口\ncd backend\npython run_server.py & # 或 python app.py\npython test_traffic_identification.py\n```\n\n测试脚本在 SETUP 阶段会自动:\n- 创建/复用测试账户 `testadmin01`\n- 动态发现蜜罐端口\n- 确保 Redis 匹配规则存在\n- 将命令注入规则优先级调至 18"}, "c2e2f73c48f7d351c1034f6035a5d4bf09cd27ad": {"t": 1785764207.0433843, "n": 19122, "h": "a941ef13b7a165b3", "c": "# 第一个规范 (必须遵守)\n 当每次大的修改和功能的新增,如果与CLAUDE.md文件内容不一致了,需要把新增的功能或者修改功能的逻辑重新写入CLAUDE.md,确保CLAUDE.md文件为最新的。\n \n# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n\n| 业务模块 | Route 文件 | Service 文件 | Model 文件 | 职责说明 |\n| :--- | :--- | :--- | :--- | :--- |\n| **User (用户权限)** | `user_route.py` | `user_service.py` | `user_model.py`, `user_info_model.py`, `permission_model.py`, `module_model.py` | 注册、登录、JWT鉴权、用户管理、模块权限分配 |\n| **Dashboard (数据大屏)** | `dashboard_route.py` | `dashboard_service.py` | `attack_stats_model.py` | 攻击趋势、类型分布、地图热力、总览统计(均需JWT) |\n| **Honeypot (蜜罐管理)** | `honeypot_route.py` | `honeypot_service.py` | `honeypot_model.py` | 蜜罐CRUD、进程启停、健康检查、PID持久化 |\n| **Log (日志审计)** | `log_route.py` | `log_service.py` | `log_model.py` | 日志查询、分页、导出CSV、内部上报(蜜罐使用) |\n| **Malicious IP (恶意拦截)** | `malicious_ip_route.py` | `malicious_ip_service.py` | `malicious_ip_model.py`, `block_history_model.py` | 恶意IP列表、封禁/解封、防火墙命令下发 |\n| **Match Rule (规则引擎)** | `match_rule_route.py` | `match_rule_service.py` | `match_rule_model.py` | 正则匹配规则管理、启停切换、自动封禁配置 |\n| **AI Config (大模型配置)** | `ai_config_route.py` | `ai_config_service.py`, `ai_analysis_service.py` | `ai_config_model.py` | LLM参数化配置、激活/禁用、连通性测试 |\n| **Test (测试接口)** | `test_route.py` | `test_service.py` | — | 内部功能测试,非生产接口 |\n\n### 2. 完整 API 端点清单\n\n#### /api/user — 用户管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| POST | `/api/user/register` | 无 | 用户注册 |\n| POST | `/api/user/login` | 无 | 用户登录,返回 JWT |\n| POST | `/api/user/create_admin` | 无 | 创建管理员(初始化用) |\n| GET | `/api/user/me` | JWT | 获取当前用户信息 |\n| PUT | `/api/user/me` | JWT | 更新当前用户信息(手机/邮箱/密码) |\n| GET | `/api/user/list` | JWT + 管理员 | 分页获取用户列表 |\n| POST | `/api/user/add` | JWT + 管理员 | 管理员新增用户 |\n| PUT | `/api/user/<user_id>` | JWT + 管理员 | 管理员修改用户 |\n| DELETE | `/api/user/<user_id>` | JWT + 管理员 | 管理员删除用户 |\n| GET | `/api/user/permissions` | JWT + 管理员 | 获取所有权限列表 |\n| GET | `/api/user/modules` | JWT | 获取所有模块列表 |\n\n#### /api/dashboard — 数据大屏\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/dashboard/trend` | JWT | 攻击趋势(支持 days/granularity 参数) |\n| GET | `/api/dashboard/types` | JWT | 攻击类型统计分布 |\n| GET | `/api/dashboard/map` | JWT | 攻击来源地图数据 |\n| GET | `/api/dashboard/summary` | JWT | 总览统计(总攻击数、封禁数等) |\n\n#### /api/honeypots — 蜜罐管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/honeypots` | JWT | 分页查询蜜罐列表(支持 type/status/keyword) |\n| POST | `/api/honeypots` | JWT | 创建新蜜罐 |\n| PUT | `/api/honeypots/<hp_id>` | JWT | 更新蜜罐配置 |\n| DELETE | `/api/honeypots/<hp_id>` | JWT | 删除蜜罐 |\n| POST | `/api/honeypots/<hp_id>/start` | JWT | 启动蜜罐进程 |\n| POST | `/api/honeypots/<hp_id>/stop` | JWT | 停止蜜罐进程 |\n| GET | `/api/honeypots/<hp_id>/health` | JWT | 蜜罐健康检查 |\n\n#### /api/logs — 日志审计\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/logs` | JWT | 分页查询日志(支持多字段过滤) |\n| GET | `/api/logs/export` | JWT | 导出日志为 CSV(含 BOM,支持 Excel) |\n| GET | `/api/logs/<log_id>` | JWT | 根据 ID 获取单条日志 |\n| GET | `/api/logs/attack-types` | JWT | 获取所有攻击类型枚举 |\n| GET | `/api/logs/threat-levels` | JWT | 获取所有威胁等级枚举 |\n| GET | `/api/logs/statistics` | JWT | 获取日志统计汇总 |\n| POST | `/api/logs/internal/upload` | 无 | **内部接口**:蜜罐进程上报攻击日志 |\n\n#### /api/malicious-ips — 恶意IP管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/malicious-ips` | JWT | 分页查询恶意IP(支持 is_blocked/threat_level/keyword) |\n| POST | `/api/malicious-ips/block` | JWT | 封禁指定IP(支持时长/截止时间) |\n| POST | `/api/malicious-ips/unblock` | JWT | 解封指定IP |\n\n#### /api/match-rules — 匹配规则引擎\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/match-rules` | JWT | 分页查询规则 |\n| GET | `/api/match-rules/<rule_id>` | JWT | 获取单条规则 |\n| POST | `/api/match-rules` | JWT | 创建规则(正则+威胁等级+自动封禁配置) |\n| PUT | `/api/match-rules/<rule_id>` | JWT | 更新规则 |\n| DELETE | `/api/match-rules/<rule_id>` | JWT | 删除规则 |\n| PUT | `/api/match-rules/<rule_id>/toggle` | JWT | 切换规则启用状态 |\n| GET | `/api/match-rules/attack-types` | JWT | 获取攻击类型枚举 |\n| GET | `/api/match-rules/threat-levels` | JWT | 获取威胁等级枚举 |\n\n#### /api/ai-config — AI大模型配置\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/ai-config/` | JWT | 获取所有AI配置 |\n| POST | `/api/ai-config/` | JWT | 创建AI配置(name/api_url/model_name必填) |\n| PUT | `/api/ai-config/<config_id>` | JWT | 更新AI配置 |\n| DELETE | `/api/ai-config/<config_id>` | JWT | 删除AI配置 |\n| POST | `/api/ai-config/<config_id>/activate` | JWT | 激活配置(设为当前使用) |\n| POST | `/api/ai-config/<config_id>/deactivate` | JWT | 禁用配置 |\n| POST | `/api/ai-config/<config_id>/test` | JWT | 测试AI配置连通性 |\n\n### 3. 数据库模型清单\n\n共 12 个 Model 文件,对应以下数据库表:\n\n| 模型文件 | 表名 | 说明 |\n| :--- | :--- | :--- |\n| `user_model.py` | `users` | 用户账号、密码哈希、角色(1管理员/2普通用户) |\n| `user_info_model.py` | `user_infos` | 用户扩展信息(手机号、邮箱、头像等) |\n| `permission_model.py` | `permissions` | 系统权限定义 |\n| `module_model.py` | `modules` / `user_modules` | 系统模块定义及用户-模块关联 |\n| `honeypot_model.py` | `honeypots` | 蜜罐配置(类型、端口、状态、`pid` 字段用于持久化进程) |\n| `log_model.py` | `logs` | 攻击日志记录(来源IP、载荷、威胁等级、协议等) |\n| `malicious_ip_model.py` | `malicious_ips` | 恶意IP列表(封禁状态、威胁等级、攻击次数) |\n| `block_history_model.py` | `block_history` | 封禁/解封操作历史记录 |\n| `attack_stats_model.py` | `attack_stats` | 攻击统计聚合数据(供 Dashboard 使用) |\n| `match_rule_model.py` | `match_rules` | 流量匹配规则(正则表达式、自动封禁、优先级) |\n| `ai_config_model.py` | `ai_configs` | AI大模型配置(API地址、模型名称、激活状态) |\n\n> **重要**:`honeypot_model.py` 中包含 `pid` 字段(Integer, nullable),用于在服务重启后通过 `psutil` 检查蜜罐子进程是否仍然存活。\n\n### 4. 蜜罐组件实现 (`backend/honeypots/`)\n\n| 文件 | 协议 | 默认端口 | 捕获目标 |\n| :--- | :--- | :--- | :--- |\n| `ftp_server.py` | FTP | 2121 | 爆破攻击、未授权访问、文件上传尝试 |\n| `ssh_server.py` | SSH | 2222 | 登录爆破、恶意命令执行(基于 Paramiko) |\n| `hikvision_http_server.py` | HTTP | 可配置(读取 `sys.argv[1]`) | IoT/摄像头设备漏洞探测、Web 攻击 |\n| `redis_server.py` | TCP/Redis | 6379 | Redis 未授权访问、SLAVEOF/CONFIG 命令利用 |\n| `mysql_server.py` | TCP/MySQL | 3306 | 数据库弱口令爆破(捕获用户名、客户端版本) |\n\n**蜜罐进程管理机制**:\n- 所有蜜罐以**独立子进程**方式启动(`subprocess.Popen`),与主 Flask 服务解耦。\n- 启动时将 PID 写入 `honeypots.pid` 数据库字段;停止时发送 `SIGTERM`/`taskkill`。\n- 服务重启后调用 `psutil.pid_exists()` 检查进程存活状态,自动修正数据库状态。\n- 蜜罐捕获到攻击后,通过 HTTP 调用 `/api/logs/internal/upload` 上报主服务。\n\n### 5. Agent 与智能响应模块 (`backend/agent/`)\n\n```\nagent/\n├── core.py # AI代理调度核心,支持多模型工作池、Queue+Threading异步队列\n├── llm_client.py # LLM客户端,封装 OpenAI 兼容 API 调用\n├── mcp/\n│ └── skill.py # MCP技能协议基类\n└── skills/\n ├── block_ip_skill.py # 自动封禁技能:先记录 malicious_ip 再调用防火墙封禁\n ├── decoder_skill.py # Base64/URL解码技能,辅助攻击载荷分析\n └── log_query_skill.py # 日志查询技能,供 AI Agent 检索历史攻击日志\n```\n\n**关键设计**:AI 分析通过 `Queue + Threading` 异步执行,不阻塞 HTTP 请求线程。\n\n### 6. 工具模块 (`backend/utils/`)\n\n| 文件 | 说明 |\n| :--- | :--- |\n| `api_response.py` | 统一 API 响应格式工具(`ApiResponse.success/error/bad_request` 等) |\n| `ip_utils.py` | **离线** IP 地理位置解析(MaxMind GeoLite2 MMDB),含 LRU 缓存 10000 条、私有 IP 判断 |\n| `time_utils.py` | 时间格式化工具函数 |\n| `download_geoip.py` | 自动下载/更新 GeoLite2 数据库脚本 |\n| `data/GeoLite2-City.mmdb` | 离线城市/国家地理数据库 |\n| `data/GeoLite2-ASN.mmdb` | 离线 ASN 自治系统数据库 |\n\n> **注意**:IP 溯源已从在线 `ip-api.com` 全面迁移至离线 MaxMind GeoLite2,无需外网访问。\n\n### 7. 前端视图清单 (`vueweb/vue-project/src/views/`)\n\n| 文件路径 | 功能说明 |\n| :--- | :--- |\n| `Dashboard.vue` | 仪表盘入口(路由容器) |\n| `dashboard/DashboardLayout.vue` | 数据大屏布局(导航 + 内容区) |\n| `dashboard/Overview.vue` | 攻击总览(总数、封禁数、实时告警) |\n| `dashboard/Trend.vue` | 攻击趋势折线图(按天/小时粒度) |\n| `dashboard/Types.vue` | 攻击类型饼图/柱状图分布 |\n| `dashboard/Map.vue` | 世界地图攻击来源热力图(ECharts) |\n| `HoneypotManagement.vue` | 蜜罐管理(CRUD、启停控制、健康状态监控) |\n| `LogQuery.vue` | 日志查询(多维度过滤、详情展示、CSV导出) |\n| `MaliciousIPManagement.vue` | 恶意IP管理(封禁/解封、威胁等级筛选) |\n| `MatchRuleManagement.vue` | 匹配规则管理(正则规则CRUD、启停切换) |\n| `AIConfigManagement.vue` | AI配置管理(多模型配置、激活/禁用、连通测试) |\n| `UserManagement.vue` | 用户管理(管理员):列表、增删改、模块权限分配 |\n| `UserProfile.vue` | 个人中心:查看/修改自己的手机、邮箱、密码 |\n\n**前端特性**:\n- 支持**暗黑/明亮**主题切换(持久化到 localStorage)。\n- 路由守卫:token 存在但 `user` 为空时,先 `await fetchCurrentUser()` 再放行,防止权限检查时序问题。\n- 所有 HTTP 请求通过 Axios 统一拦截器附加 `Authorization: Bearer <token>`。\n\n### 8. 后端初始化脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `init_database.py` | 创建所有数据库表(`db.create_all()`) |\n| `init_data.py` | 初始化基础数据(角色、权限) |\n| `init_modules.py` | 初始化系统功能模块数据 |\n| `init_permissions.py` | 初始化权限条目 |\n| `init_honeypot.py` | 初始化默认蜜罐配置 |\n| `config.py` | Flask 配置类(数据库URI、JWT密钥、CORS等) |\n| `extensions.py` | Flask 扩展实例集中管理(SocketIO 全局单例),避免 reloader 实例不一致 |\n| `app.py` | Flask 应用入口,注册所有蓝图,初始化 SocketIO 并注册 /ws namespace |\n\n### 9. 数据库迁移\n\n使用 Flask-Migrate(Alembic),迁移文件位于 `backend/migrations/versions/`。\n\n**已有迁移**:\n- `f1a2b3c4d5e6_add_pid_to_honeypots.py` — 为 `honeypots` 表新增 `pid` 字段,支持进程持久化重启检测。\n\n---\n\n## 八、WebSocket 实时推送架构\n\n### 1. 技术选型\n| 层 | 技术 | 版本 |\n| :--- | :--- | :--- |\n| 后端 | Flask-SocketIO | 5.3.6 |\n| 后端传输 | python-socketio + python-engineio | 5.10.0 / 4.8.2 |\n| 前端 | socket.io-client | 4.7.5 |\n\n### 2. 架构流程\n\n```\n蜜罐捕获攻击\n ↓ HTTP POST /api/logs/internal/upload\nlog_service.py · create_log()\n ├─ 规则匹配 (MatchRule)\n ├─ 写入 MySQL (Log)\n ├─ AI 分析任务入队\n ├─ 记录恶意 IP\n └─ [仅恶意流量] socketio.emit('new_attack', payload, namespace='/ws')\n ↓ WebSocket\n 前端 useSocket composable\n ↓\n ┌─────────────┼─────────────┐\n DashboardLayout.vue Overview.vue Map.vue\n (ElNotification弹窗 (数字跳动+ (地图红色\n + 高危横幅) 实时告警列表) 脉冲散点)\n```\n\n### 3. 关键文件\n\n| 文件 | 职责 |\n| :--- | :--- |\n| `backend/extensions.py` | **全局唯一** `socketio = SocketIO()` 实例,所有模块必须从此处导入 socketio,避免 werkzeug reloader 导致实例不一致 |\n| `backend/app.py` | `from extensions import socketio`,调用 `socketio.init_app(app, ...)`,注册 `/ws` namespace 的 connect/disconnect handler,使用 `socketio.run()` 替代 `app.run()` |\n| `backend/service/log_service.py` | `create_log()` 末尾 `from extensions import socketio`,emit `new_attack` 事件到 `/ws` namespace |\n| `frontend/src/composables/useSocket.ts` | 全局 Socket 单例管理,`connectSocket()`/`disconnectSocket()` 由 DashboardLayout 统一管理生命周期,提供 `onAttack/offAttack` 订阅方法,pending 队列 + 重连恢复(先 `off('new_attack')` 再统一重绑,避免 handler 重复注册) |\n| `frontend/src/views/dashboard/DashboardLayout.vue` | 订阅 `new_attack`,显示 `ElNotification` 弹窗 + 高危横幅(含滑入动画),菜单栏显示连接状态指示灯(绿/红),使用 `<keep-alive>` 缓存子路由 |\n| `frontend/src/views/dashboard/Overview.vue` | 订阅 `new_attack`,数字递增 + bounce 跳动动画 + 实时告警列表(最多 10 条,transition-group 滑入动画) |\n| `frontend/src/views/dashboard/Map.vue` | 订阅 `new_attack`,追加 `effectScatter` 脉冲散点到地图(使用 `Map` 结构消除竞态),5 秒后自动消失,过滤 `(0,0)` null-island 坐标 |\n\n> **重要**:`socketio` 实例必须从 `extensions.py` 导入,**禁止**从 `app.py` 导入。原因:werkzeug 的 `use_reloader=True` 会在子进程中重新执行 `app.py`,导致 `app.py` 中定义的 `socketio` 和其他模块缓存导入的 `socketio` 不是同一个对象。`extensions.py` 作为独立模块不受 reloader 影响。\n\n### 4. 推送事件规范\n\n**事件名**:`new_attack` \n**Namespace**:`/ws` \n**触发条件**:`is_malicious == True`(低危/正常流量不推送,减少噪声)\n\n**载荷字段**:\n```json\n{\n \"log_id\": 123,\n \"source_ip\": \"1.2.3.4\",\n \"attack_type\": \"SQL注入\",\n \"threat_level\": \"high\",\n \"protocol\": \"HTTP\",\n \"target_port\": 80,\n \"attack_time\": \"2026-03-27T10:30:00\",\n \"attack_description\": \"触发规则: SQL注入检测\",\n \"longitude\": 116.4074,\n \"latitude\": 39.9042\n}\n```\n\n### 5. 后端重启说明\n\nWebSocket 需要使用 `socketio.run()` 替代 `app.run()`,已在 `app.py` 中完成更新。\n重启后端后 WebSocket 功能即生效,无需额外操作。\n\n### 6. WebSocket 测试脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `backend/test/test_realtime_report.py` | 主测试脚本:30 次/60 秒全球 IP 的 SQL 注入攻击,用于验证大屏 4 个核心动态效果 |\n| `backend/test/verify_websocket.py` | WebSocket 推送端到端验证:Python socketio 客户端连接 `/ws`,发 3 条攻击,验证 4 项指标(事件到达、坐标、攻击类型、威胁等级) |\n\n---\n\n## 九、代码重载\n后端代码修改之后必须重新启动后端进程\n\n---\n\n## 十、多级恶意流量识别引擎\n\n### 1. 架构概述\n\n蜜罐捕获的原始流量经过**三级识别漏斗**,逐级过滤和分类:\n\n```\n蜜罐原始数据 → 第一级:正则规则匹配 → 第二级:暴力破解频次分析 → 第三级:AI深度分析\n```\n\n### 2. 蜜罐端设计原则(纯数据采集探针)\n\n蜜罐脚本**只负责捕获原始数据**,不做任何攻击分类。上报字段:\n- `attacker_ip` / `attacker_port` — 攻击来源\n- `honeypot_port` — 蜜罐端口\n- `protocol` — 协议类型 (SSH/FTP/HTTP/TCP 等)\n- `raw_log` — 原始请求/命令完整记录\n- `payload` — 载荷内容(认证类蜜罐统一格式:`\"Username: xxx, Password: xxx\"`)\n- `request_path` / `user_agent` — HTTP 蜜罐专用字段\n\n**禁止**在蜜罐脚本中包含 `attack_type`、`threat_level`、`attack_description` 等分类逻辑。\n\n### 3. 三级识别流水线(`log_service.py` · `create_log()`)\n\n#### 第一级:正则规则引擎匹配\n- 从 `match_rules` 表读取所有 `is_enabled=True` 的规则,按 `priority ASC` 排序(数字越小优先级越高)\n- 匹配字段由规则的 `match_field` 决定(目前全部为 `raw_log`)\n- 命中规则后立即设置 `attack_type`、`threat_level`、`attack_description`、`is_malicious`\n- **首条命中即停止**,不会继续匹配后续规则\n\n#### 第二级:暴力破解频次分析\n- **触发条件**:第一级未命中任何规则(`attack_type` 仍为 `'正常流量'`)\n- **检测方法**:`_check_brute_force(source_ip, protocol, current_payload)`\n - 查询同一 IP + 同一协议在最近 **1 分钟** 内的日志数量\n - HTTP 协议特殊处理:只有包含认证凭证(`Username:...Password:...`)的请求才计入暴力破解计数\n - 阈值:**20 次/分钟** (`BRUTE_FORCE_THRESHOLD = 20`)\n- **凭证检测**:`_is_credential_payload(payload)` 使用正则 `r'Username:\\s*.+,\\s*Password:\\s*.+'` 判断\n- 命中后设置 `attack_type='暴力破解'`、`threat_level='high'`、`is_malicious=True`\n\n#### 第三级:AI 深度分析\n- **触发条件**:所有日志均入 AI 分析队列(`Queue + Threading` 异步执行)\n- **AI 辅助判断机制**(\u0007i_analysis_service.py · _process_single_log()):\n - AI 仅独立提取和存入自己的分析结果字段(如 \u0007i_attack_type、\u0007i_confidence、\u0007i_analysis_result)。\n - **不修改、不覆写** 前置规则匹配引擎和暴力破解识别引擎的主判断结论(如 \u0007ttack_type、is_malicious、\threat_level 和 \u0007ttack_description)。\n - AI 判定后,将 AI 判断结论与主记录判断进行比较,记录在 \u0007i_rule_match_consistency 字段(一致 / 不一致),用作辅助审计依据。\n\n### 4. 匹配规则优先级说明\n\n规则按 `priority ASC` 排序匹配,关键优先级分布:\n\n| 优先级范围 | 规则类型 | 说明 |\n| :--- | :--- | :--- |\n| 1-3 | XSS、SQL注入(基础)、目录遍历 | 高频攻击,精确正则 |\n| 5 | Redis未授权访问 | 协议专用规则 |\n| 6-9 | WebShell、RCE、扫描探测 | 中等精度规则 |\n| 11-15 | SQL注入(盲注)、XXE、信息泄露 | 长正则、较复杂模式 |\n| 18 | 命令注入(宽泛匹配) | 匹配 `;` `|` `(` 等字符,优先级故意调低,避免误判 |\n| 20-50 | XSS/目录遍历/信息泄露/扫描探测(补充) | 低优先级兜底规则 |\n\n> **重要**:命令注入规则 (ID=8) 的正则包含 `(;|\\||&|\\$|\\(|\\)|...)` 极其宽泛,priority 已从 5 调整为 18,防止将 `sleep()`、`eval()`、Nmap UA 等载荷误判为命令注入。\n\n### 5. 自动化测试\n\n测试脚本:`backend/test_traffic_identification.py`\n\n- **51 个断言**,覆盖 22 个测试场景\n- 4 个正常流量测试(SSH/FTP/HTTP/ES)\n- 11 个正则规则匹配测试(SQL注入×2、XSS×2、命令注入、目录遍历、信息泄露、Redis×2、WebShell、扫描探测)\n- 5 个暴力破解测试(SSH低频/高频、HTTP纯GET不触发、HTTP凭证爆破、FTP爆破、MySQL爆破)\n- 2 个混合场景测试\n\n运行方式:\n```bash\n# 确保 Flask 后端运行在 5000 端口\ncd backend\npython run_server.py & # 或 python app.py\npython test_traffic_identification.py\n```\n\n测试脚本在 SETUP 阶段会自动:\n- 创建/复用测试账户 `testadmin01`\n- 动态发现蜜罐端口\n- 确保 Redis 匹配规则存在\n- 将命令注入规则优先级调至 18"}, "03726e3bec8514732b64d446f248df6ef3a1cf87": {"t": 1785764208.8296773, "n": 19107, "h": "adcef2f5266ad1cf", "c": "# 第一个规范 (必须遵守)\n 当每次大的修改和功能的新增,如果与CLAUDE.md文件内容不一致了,需要把新增的功能或者修改功能的逻辑重新写入CLAUDE.md,确保CLAUDE.md文件为最新的。\n \n# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n\n| 业务模块 | Route 文件 | Service 文件 | Model 文件 | 职责说明 |\n| :--- | :--- | :--- | :--- | :--- |\n| **User (用户权限)** | `user_route.py` | `user_service.py` | `user_model.py`, `user_info_model.py`, `permission_model.py`, `module_model.py` | 注册、登录、JWT鉴权、用户管理、模块权限分配 |\n| **Dashboard (数据大屏)** | `dashboard_route.py` | `dashboard_service.py` | `attack_stats_model.py` | 攻击趋势、类型分布、地图热力、总览统计(均需JWT) |\n| **Honeypot (蜜罐管理)** | `honeypot_route.py` | `honeypot_service.py` | `honeypot_model.py` | 蜜罐CRUD、进程启停、健康检查、PID持久化 |\n| **Log (日志审计)** | `log_route.py` | `log_service.py` | `log_model.py` | 日志查询、分页、导出CSV、内部上报(蜜罐使用) |\n| **Malicious IP (恶意拦截)** | `malicious_ip_route.py` | `malicious_ip_service.py` | `malicious_ip_model.py`, `block_history_model.py` | 恶意IP列表、封禁/解封、防火墙命令下发 |\n| **Match Rule (规则引擎)** | `match_rule_route.py` | `match_rule_service.py` | `match_rule_model.py` | 正则匹配规则管理、启停切换、自动封禁配置 |\n| **AI Config (大模型配置)** | `ai_config_route.py` | `ai_config_service.py`, `ai_analysis_service.py` | `ai_config_model.py` | LLM参数化配置、激活/禁用、连通性测试 |\n| **Test (测试接口)** | `test_route.py` | `test_service.py` | — | 内部功能测试,非生产接口 |\n\n### 2. 完整 API 端点清单\n\n#### /api/user — 用户管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| POST | `/api/user/register` | 无 | 用户注册 |\n| POST | `/api/user/login` | 无 | 用户登录,返回 JWT |\n| POST | `/api/user/create_admin` | 无 | 创建管理员(初始化用) |\n| GET | `/api/user/me` | JWT | 获取当前用户信息 |\n| PUT | `/api/user/me` | JWT | 更新当前用户信息(手机/邮箱/密码) |\n| GET | `/api/user/list` | JWT + 管理员 | 分页获取用户列表 |\n| POST | `/api/user/add` | JWT + 管理员 | 管理员新增用户 |\n| PUT | `/api/user/<user_id>` | JWT + 管理员 | 管理员修改用户 |\n| DELETE | `/api/user/<user_id>` | JWT + 管理员 | 管理员删除用户 |\n| GET | `/api/user/permissions` | JWT + 管理员 | 获取所有权限列表 |\n| GET | `/api/user/modules` | JWT | 获取所有模块列表 |\n\n#### /api/dashboard — 数据大屏\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/dashboard/trend` | JWT | 攻击趋势(支持 days/granularity 参数) |\n| GET | `/api/dashboard/types` | JWT | 攻击类型统计分布 |\n| GET | `/api/dashboard/map` | JWT | 攻击来源地图数据 |\n| GET | `/api/dashboard/summary` | JWT | 总览统计(总攻击数、封禁数等) |\n\n#### /api/honeypots — 蜜罐管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/honeypots` | JWT | 分页查询蜜罐列表(支持 type/status/keyword) |\n| POST | `/api/honeypots` | JWT | 创建新蜜罐 |\n| PUT | `/api/honeypots/<hp_id>` | JWT | 更新蜜罐配置 |\n| DELETE | `/api/honeypots/<hp_id>` | JWT | 删除蜜罐 |\n| POST | `/api/honeypots/<hp_id>/start` | JWT | 启动蜜罐进程 |\n| POST | `/api/honeypots/<hp_id>/stop` | JWT | 停止蜜罐进程 |\n| GET | `/api/honeypots/<hp_id>/health` | JWT | 蜜罐健康检查 |\n\n#### /api/logs — 日志审计\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/logs` | JWT | 分页查询日志(支持多字段过滤) |\n| GET | `/api/logs/export` | JWT | 导出日志为 CSV(含 BOM,支持 Excel) |\n| GET | `/api/logs/<log_id>` | JWT | 根据 ID 获取单条日志 |\n| GET | `/api/logs/attack-types` | JWT | 获取所有攻击类型枚举 |\n| GET | `/api/logs/threat-levels` | JWT | 获取所有威胁等级枚举 |\n| GET | `/api/logs/statistics` | JWT | 获取日志统计汇总 |\n| POST | `/api/logs/internal/upload` | 无 | **内部接口**:蜜罐进程上报攻击日志 |\n\n#### /api/malicious-ips — 恶意IP管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/malicious-ips` | JWT | 分页查询恶意IP(支持 is_blocked/threat_level/keyword) |\n| POST | `/api/malicious-ips/block` | JWT | 封禁指定IP(支持时长/截止时间) |\n| POST | `/api/malicious-ips/unblock` | JWT | 解封指定IP |\n\n#### /api/match-rules — 匹配规则引擎\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/match-rules` | JWT | 分页查询规则 |\n| GET | `/api/match-rules/<rule_id>` | JWT | 获取单条规则 |\n| POST | `/api/match-rules` | JWT | 创建规则(正则+威胁等级+自动封禁配置) |\n| PUT | `/api/match-rules/<rule_id>` | JWT | 更新规则 |\n| DELETE | `/api/match-rules/<rule_id>` | JWT | 删除规则 |\n| PUT | `/api/match-rules/<rule_id>/toggle` | JWT | 切换规则启用状态 |\n| GET | `/api/match-rules/attack-types` | JWT | 获取攻击类型枚举 |\n| GET | `/api/match-rules/threat-levels` | JWT | 获取威胁等级枚举 |\n\n#### /api/ai-config — AI大模型配置\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/ai-config/` | JWT | 获取所有AI配置 |\n| POST | `/api/ai-config/` | JWT | 创建AI配置(name/api_url/model_name必填) |\n| PUT | `/api/ai-config/<config_id>` | JWT | 更新AI配置 |\n| DELETE | `/api/ai-config/<config_id>` | JWT | 删除AI配置 |\n| POST | `/api/ai-config/<config_id>/activate` | JWT | 激活配置(设为当前使用) |\n| POST | `/api/ai-config/<config_id>/deactivate` | JWT | 禁用配置 |\n| POST | `/api/ai-config/<config_id>/test` | JWT | 测试AI配置连通性 |\n\n### 3. 数据库模型清单\n\n共 12 个 Model 文件,对应以下数据库表:\n\n| 模型文件 | 表名 | 说明 |\n| :--- | :--- | :--- |\n| `user_model.py` | `users` | 用户账号、密码哈希、角色(1管理员/2普通用户) |\n| `user_info_model.py` | `user_infos` | 用户扩展信息(手机号、邮箱、头像等) |\n| `permission_model.py` | `permissions` | 系统权限定义 |\n| `module_model.py` | `modules` / `user_modules` | 系统模块定义及用户-模块关联 |\n| `honeypot_model.py` | `honeypots` | 蜜罐配置(类型、端口、状态、`pid` 字段用于持久化进程) |\n| `log_model.py` | `logs` | 攻击日志记录(来源IP、载荷、威胁等级、协议等) |\n| `malicious_ip_model.py` | `malicious_ips` | 恶意IP列表(封禁状态、威胁等级、攻击次数) |\n| `block_history_model.py` | `block_history` | 封禁/解封操作历史记录 |\n| `attack_stats_model.py` | `attack_stats` | 攻击统计聚合数据(供 Dashboard 使用) |\n| `match_rule_model.py` | `match_rules` | 流量匹配规则(正则表达式、自动封禁、优先级) |\n| `ai_config_model.py` | `ai_configs` | AI大模型配置(API地址、模型名称、激活状态) |\n\n> **重要**:`honeypot_model.py` 中包含 `pid` 字段(Integer, nullable),用于在服务重启后通过 `psutil` 检查蜜罐子进程是否仍然存活。\n\n### 4. 蜜罐组件实现 (`backend/honeypots/`)\n\n| 文件 | 协议 | 默认端口 | 捕获目标 |\n| :--- | :--- | :--- | :--- |\n| `ftp_server.py` | FTP | 2121 | 爆破攻击、未授权访问、文件上传尝试 |\n| `ssh_server.py` | SSH | 2222 | 登录爆破、恶意命令执行(基于 Paramiko) |\n| `hikvision_http_server.py` | HTTP | 可配置(读取 `sys.argv[1]`) | IoT/摄像头设备漏洞探测、Web 攻击 |\n| `redis_server.py` | TCP/Redis | 6379 | Redis 未授权访问、SLAVEOF/CONFIG 命令利用 |\n| `mysql_server.py` | TCP/MySQL | 3306 | 数据库弱口令爆破(捕获用户名、客户端版本) |\n\n**蜜罐进程管理机制**:\n- 所有蜜罐以**独立子进程**方式启动(`subprocess.Popen`),与主 Flask 服务解耦。\n- 启动时将 PID 写入 `honeypots.pid` 数据库字段;停止时发送 `SIGTERM`/`taskkill`。\n- 服务重启后调用 `psutil.pid_exists()` 检查进程存活状态,自动修正数据库状态。\n- 蜜罐捕获到攻击后,通过 HTTP 调用 `/api/logs/internal/upload` 上报主服务。\n\n### 5. Agent 与智能响应模块 (`backend/agent/`)\n\n```\nagent/\n├── core.py # AI代理调度核心,支持多模型工作池、Queue+Threading异步队列\n├── llm_client.py # LLM客户端,封装 OpenAI 兼容 API 调用\n├── mcp/\n│ └── skill.py # MCP技能协议基类\n└── skills/\n ├── block_ip_skill.py # 自动封禁技能:先记录 malicious_ip 再调用防火墙封禁\n ├── decoder_skill.py # Base64/URL解码技能,辅助攻击载荷分析\n └── log_query_skill.py # 日志查询技能,供 AI Agent 检索历史攻击日志\n```\n\n**关键设计**:AI 分析通过 `Queue + Threading` 异步执行,不阻塞 HTTP 请求线程。\n\n### 6. 工具模块 (`backend/utils/`)\n\n| 文件 | 说明 |\n| :--- | :--- |\n| `api_response.py` | 统一 API 响应格式工具(`ApiResponse.success/error/bad_request` 等) |\n| `ip_utils.py` | **离线** IP 地理位置解析(MaxMind GeoLite2 MMDB),含 LRU 缓存 10000 条、私有 IP 判断 |\n| `time_utils.py` | 时间格式化工具函数 |\n| `download_geoip.py` | 自动下载/更新 GeoLite2 数据库脚本 |\n| `data/GeoLite2-City.mmdb` | 离线城市/国家地理数据库 |\n| `data/GeoLite2-ASN.mmdb` | 离线 ASN 自治系统数据库 |\n\n> **注意**:IP 溯源已从在线 `ip-api.com` 全面迁移至离线 MaxMind GeoLite2,无需外网访问。\n\n### 7. 前端视图清单 (`vueweb/vue-project/src/views/`)\n\n| 文件路径 | 功能说明 |\n| :--- | :--- |\n| `Dashboard.vue` | 仪表盘入口(路由容器) |\n| `dashboard/DashboardLayout.vue` | 数据大屏布局(导航 + 内容区) |\n| `dashboard/Overview.vue` | 攻击总览(总数、封禁数、实时告警) |\n| `dashboard/Trend.vue` | 攻击趋势折线图(按天/小时粒度) |\n| `dashboard/Types.vue` | 攻击类型饼图/柱状图分布 |\n| `dashboard/Map.vue` | 世界地图攻击来源热力图(ECharts) |\n| `HoneypotManagement.vue` | 蜜罐管理(CRUD、启停控制、健康状态监控) |\n| `LogQuery.vue` | 日志查询(多维度过滤、详情展示、CSV导出) |\n| `MaliciousIPManagement.vue` | 恶意IP管理(封禁/解封、威胁等级筛选) |\n| `MatchRuleManagement.vue` | 匹配规则管理(正则规则CRUD、启停切换) |\n| `AIConfigManagement.vue` | AI配置管理(多模型配置、激活/禁用、连通测试) |\n| `UserManagement.vue` | 用户管理(管理员):列表、增删改、模块权限分配 |\n| `UserProfile.vue` | 个人中心:查看/修改自己的手机、邮箱、密码 |\n\n**前端特性**:\n- 支持**暗黑/明亮**主题切换(持久化到 localStorage)。\n- 路由守卫:token 存在但 `user` 为空时,先 `await fetchCurrentUser()` 再放行,防止权限检查时序问题。\n- 所有 HTTP 请求通过 Axios 统一拦截器附加 `Authorization: Bearer <token>`。\n\n### 8. 后端初始化脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `init_database.py` | 创建所有数据库表(`db.create_all()`) |\n| `init_data.py` | 初始化基础数据(角色、权限) |\n| `init_modules.py` | 初始化系统功能模块数据 |\n| `init_permissions.py` | 初始化权限条目 |\n| `init_honeypot.py` | 初始化默认蜜罐配置 |\n| `config.py` | Flask 配置类(数据库URI、JWT密钥、CORS等) |\n| `extensions.py` | Flask 扩展实例集中管理(SocketIO 全局单例),避免 reloader 实例不一致 |\n| `app.py` | Flask 应用入口,注册所有蓝图,初始化 SocketIO 并注册 /ws namespace |\n\n### 9. 数据库迁移\n\n使用 Flask-Migrate(Alembic),迁移文件位于 `backend/migrations/versions/`。\n\n**已有迁移**:\n- `f1a2b3c4d5e6_add_pid_to_honeypots.py` — 为 `honeypots` 表新增 `pid` 字段,支持进程持久化重启检测。\n\n---\n\n## 八、WebSocket 实时推送架构\n\n### 1. 技术选型\n| 层 | 技术 | 版本 |\n| :--- | :--- | :--- |\n| 后端 | Flask-SocketIO | 5.3.6 |\n| 后端传输 | python-socketio + python-engineio | 5.10.0 / 4.8.2 |\n| 前端 | socket.io-client | 4.7.5 |\n\n### 2. 架构流程\n\n```\n蜜罐捕获攻击\n ↓ HTTP POST /api/logs/internal/upload\nlog_service.py · create_log()\n ├─ 规则匹配 (MatchRule)\n ├─ 写入 MySQL (Log)\n ├─ AI 分析任务入队\n ├─ 记录恶意 IP\n └─ [仅恶意流量] socketio.emit('new_attack', payload, namespace='/ws')\n ↓ WebSocket\n 前端 useSocket composable\n ↓\n ┌─────────────┼─────────────┐\n DashboardLayout.vue Overview.vue Map.vue\n (ElNotification弹窗 (数字跳动+ (地图红色\n + 高危横幅) 实时告警列表) 脉冲散点)\n```\n\n### 3. 关键文件\n\n| 文件 | 职责 |\n| :--- | :--- |\n| `backend/extensions.py` | **全局唯一** `socketio = SocketIO()` 实例,所有模块必须从此处导入 socketio,避免 werkzeug reloader 导致实例不一致 |\n| `backend/app.py` | `from extensions import socketio`,调用 `socketio.init_app(app, ...)`,注册 `/ws` namespace 的 connect/disconnect handler,使用 `socketio.run()` 替代 `app.run()` |\n| `backend/service/log_service.py` | `create_log()` 末尾 `from extensions import socketio`,emit `new_attack` 事件到 `/ws` namespace |\n| `frontend/src/composables/useSocket.ts` | 全局 Socket 单例管理,`connectSocket()`/`disconnectSocket()` 由 DashboardLayout 统一管理生命周期,提供 `onAttack/offAttack` 订阅方法,pending 队列 + 重连恢复(先 `off('new_attack')` 再统一重绑,避免 handler 重复注册) |\n| `frontend/src/views/dashboard/DashboardLayout.vue` | 订阅 `new_attack`,显示 `ElNotification` 弹窗 + 高危横幅(含滑入动画),菜单栏显示连接状态指示灯(绿/红),使用 `<keep-alive>` 缓存子路由 |\n| `frontend/src/views/dashboard/Overview.vue` | 订阅 `new_attack`,数字递增 + bounce 跳动动画 + 实时告警列表(最多 10 条,transition-group 滑入动画) |\n| `frontend/src/views/dashboard/Map.vue` | 订阅 `new_attack`,追加 `effectScatter` 脉冲散点到地图(使用 `Map` 结构消除竞态),5 秒后自动消失,过滤 `(0,0)` null-island 坐标 |\n\n> **重要**:`socketio` 实例必须从 `extensions.py` 导入,**禁止**从 `app.py` 导入。原因:werkzeug 的 `use_reloader=True` 会在子进程中重新执行 `app.py`,导致 `app.py` 中定义的 `socketio` 和其他模块缓存导入的 `socketio` 不是同一个对象。`extensions.py` 作为独立模块不受 reloader 影响。\n\n### 4. 推送事件规范\n\n**事件名**:`new_attack` \n**Namespace**:`/ws` \n**触发条件**:`is_malicious == True`(低危/正常流量不推送,减少噪声)\n\n**载荷字段**:\n```json\n{\n \"log_id\": 123,\n \"source_ip\": \"1.2.3.4\",\n \"attack_type\": \"SQL注入\",\n \"threat_level\": \"high\",\n \"protocol\": \"HTTP\",\n \"target_port\": 80,\n \"attack_time\": \"2026-03-27T10:30:00\",\n \"attack_description\": \"触发规则: SQL注入检测\",\n \"longitude\": 116.4074,\n \"latitude\": 39.9042\n}\n```\n\n### 5. 后端重启说明\n\nWebSocket 需要使用 `socketio.run()` 替代 `app.run()`,已在 `app.py` 中完成更新。\n重启后端后 WebSocket 功能即生效,无需额外操作。\n\n### 6. WebSocket 测试脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `backend/test/test_realtime_report.py` | 主测试脚本:30 次/60 秒全球 IP 的 SQL 注入攻击,用于验证大屏 4 个核心动态效果 |\n| `backend/test/verify_websocket.py` | WebSocket 推送端到端验证:Python socketio 客户端连接 `/ws`,发 3 条攻击,验证 4 项指标(事件到达、坐标、攻击类型、威胁等级) |\n\n---\n\n## 九、代码重载\n后端代码修改之后必须重新启动后端进程\n\n---\n\n## 十、多级恶意流量识别引擎\n\n### 1. 架构概述\n\n蜜罐捕获的原始流量经过**三级识别漏斗**,逐级过滤和分类:\n\n```\n蜜罐原始数据 → 第一级:正则规则匹配 → 第二级:暴力破解频次分析 → 第三级:AI深度分析\n```\n\n### 2. 蜜罐端设计原则(纯数据采集探针)\n\n蜜罐脚本**只负责捕获原始数据**,不做任何攻击分类。上报字段:\n- `attacker_ip` / `attacker_port` — 攻击来源\n- `honeypot_port` — 蜜罐端口\n- `protocol` — 协议类型 (SSH/FTP/HTTP/TCP 等)\n- `raw_log` — 原始请求/命令完整记录\n- `payload` — 载荷内容(认证类蜜罐统一格式:`\"Username: xxx, Password: xxx\"`)\n- `request_path` / `user_agent` — HTTP 蜜罐专用字段\n\n**禁止**在蜜罐脚本中包含 `attack_type`、`threat_level`、`attack_description` 等分类逻辑。\n\n### 3. 三级识别流水线(`log_service.py` · `create_log()`)\n\n#### 第一级:正则规则引擎匹配\n- 从 `match_rules` 表读取所有 `is_enabled=True` 的规则,按 `priority ASC` 排序(数字越小优先级越高)\n- 匹配字段由规则的 `match_field` 决定(目前全部为 `raw_log`)\n- 命中规则后立即设置 `attack_type`、`threat_level`、`attack_description`、`is_malicious`\n- **首条命中即停止**,不会继续匹配后续规则\n\n#### 第二级:暴力破解频次分析\n- **触发条件**:第一级未命中任何规则(`attack_type` 仍为 `'正常流量'`)\n- **检测方法**:`_check_brute_force(source_ip, protocol, current_payload)`\n - 查询同一 IP + 同一协议在最近 **1 分钟** 内的日志数量\n - HTTP 协议特殊处理:只有包含认证凭证(`Username:...Password:...`)的请求才计入暴力破解计数\n - 阈值:**20 次/分钟** (`BRUTE_FORCE_THRESHOLD = 20`)\n- **凭证检测**:`_is_credential_payload(payload)` 使用正则 `r'Username:\\s*.+,\\s*Password:\\s*.+'` 判断\n- 命中后设置 `attack_type='暴力破解'`、`threat_level='high'`、`is_malicious=True`\n\n#### 第三级:AI 深度分析\n- **触发条件**:所有日志均入 AI 分析队列(`Queue + Threading` 异步执行)\n- **AI 回写机制**(`ai_analysis_service.py` · `_process_single_log()`):\n - 当 AI 置信度 >= 0.7 且判定为恶意时,自动回写主记录的 `attack_type`、`threat_level`、`is_malicious`\n - AI 分析摘要追加到 `attack_description` 字段(带 `[AI分析]` 前缀)\n - AI 发现新恶意流量时同步调用 `MaliciousIPService.record_malicious_ip()`\n - 威胁等级映射:置信度 >= 0.9 → `high`,>= 0.7 → `medium`\n\n### 4. 匹配规则优先级说明\n\n规则按 `priority ASC` 排序匹配,关键优先级分布:\n\n| 优先级范围 | 规则类型 | 说明 |\n| :--- | :--- | :--- |\n| 1-3 | XSS、SQL注入(基础)、目录遍历 | 高频攻击,精确正则 |\n| 5 | Redis未授权访问 | 协议专用规则 |\n| 6-9 | WebShell、RCE、扫描探测 | 中等精度规则 |\n| 11-15 | SQL注入(盲注)、XXE、信息泄露 | 长正则、较复杂模式 |\n| 18 | 命令注入(宽泛匹配) | 匹配 `;` `|` `(` 等字符,优先级故意调低,避免误判 |\n| 20-50 | XSS/目录遍历/信息泄露/扫描探测(补充) | 低优先级兜底规则 |\n\n> **重要**:命令注入规则 (ID=8) 的正则包含 `(;|\\||&|\\$|\\(|\\)|...)` 极其宽泛,priority 已从 5 调整为 18,防止将 `sleep()`、`eval()`、Nmap UA 等载荷误判为命令注入。\n\n### 5. 自动化测试\n\n测试脚本:`backend/test_traffic_identification.py`\n\n- **51 个断言**,覆盖 22 个测试场景\n- 4 个正常流量测试(SSH/FTP/HTTP/ES)\n- 11 个正则规则匹配测试(SQL注入×2、XSS×2、命令注入、目录遍历、信息泄露、Redis×2、WebShell、扫描探测)\n- 5 个暴力破解测试(SSH低频/高频、HTTP纯GET不触发、HTTP凭证爆破、FTP爆破、MySQL爆破)\n- 2 个混合场景测试\n\n运行方式:\n```bash\n# 确保 Flask 后端运行在 5000 端口\ncd backend\npython run_server.py & # 或 python app.py\npython test_traffic_identification.py\n```\n\n测试脚本在 SETUP 阶段会自动:\n- 创建/复用测试账户 `testadmin01`\n- 动态发现蜜罐端口\n- 确保 Redis 匹配规则存在\n- 将命令注入规则优先级调至 18"}, "b0372387751e2067552375c76e34eac9da324ada": {"t": 1785764216.4821656, "n": 19178, "h": "0557348a44c00d46", "c": "# 第一个规范 (必须遵守)\n 当每次大的修改和功能的新增,如果与CLAUDE.md文件内容不一致了,需要把新增的功能或者修改功能的逻辑重新写入CLAUDE.md,确保CLAUDE.md文件为最新的。\n \n# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n\n| 业务模块 | Route 文件 | Service 文件 | Model 文件 | 职责说明 |\n| :--- | :--- | :--- | :--- | :--- |\n| **User (用户权限)** | `user_route.py` | `user_service.py` | `user_model.py`, `user_info_model.py`, `permission_model.py`, `module_model.py` | 注册、登录、JWT鉴权、用户管理、模块权限分配 |\n| **Dashboard (数据大屏)** | `dashboard_route.py` | `dashboard_service.py` | `attack_stats_model.py` | 攻击趋势、类型分布、地图热力、总览统计(均需JWT) |\n| **Honeypot (蜜罐管理)** | `honeypot_route.py` | `honeypot_service.py` | `honeypot_model.py` | 蜜罐CRUD、进程启停、健康检查、PID持久化 |\n| **Log (日志审计)** | `log_route.py` | `log_service.py` | `log_model.py` | 日志查询、分页、导出CSV、内部上报(蜜罐使用) |\n| **Malicious IP (恶意拦截)** | `malicious_ip_route.py` | `malicious_ip_service.py` | `malicious_ip_model.py`, `block_history_model.py` | 恶意IP列表、封禁/解封、防火墙命令下发 |\n| **Match Rule (规则引擎)** | `match_rule_route.py` | `match_rule_service.py` | `match_rule_model.py` | 正则匹配规则管理、启停切换、自动封禁配置 |\n| **AI Config (大模型配置)** | `ai_config_route.py` | `ai_config_service.py`, `ai_analysis_service.py` | `ai_config_model.py` | LLM参数化配置、激活/禁用、连通性测试 |\n| **Test (测试接口)** | `test_route.py` | `test_service.py` | — | 内部功能测试,非生产接口 |\n\n### 2. 完整 API 端点清单\n\n#### /api/user — 用户管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| POST | `/api/user/register` | 无 | 用户注册 |\n| POST | `/api/user/login` | 无 | 用户登录,返回 JWT |\n| POST | `/api/user/create_admin` | 无 | 创建管理员(初始化用) |\n| GET | `/api/user/me` | JWT | 获取当前用户信息 |\n| PUT | `/api/user/me` | JWT | 更新当前用户信息(手机/邮箱/密码) |\n| GET | `/api/user/list` | JWT + 管理员 | 分页获取用户列表 |\n| POST | `/api/user/add` | JWT + 管理员 | 管理员新增用户 |\n| PUT | `/api/user/<user_id>` | JWT + 管理员 | 管理员修改用户 |\n| DELETE | `/api/user/<user_id>` | JWT + 管理员 | 管理员删除用户 |\n| GET | `/api/user/permissions` | JWT + 管理员 | 获取所有权限列表 |\n| GET | `/api/user/modules` | JWT | 获取所有模块列表 |\n\n#### /api/dashboard — 数据大屏\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/dashboard/trend` | JWT | 攻击趋势(支持 days/granularity 参数) |\n| GET | `/api/dashboard/types` | JWT | 攻击类型统计分布 |\n| GET | `/api/dashboard/map` | JWT | 攻击来源地图数据 |\n| GET | `/api/dashboard/summary` | JWT | 总览统计(总攻击数、封禁数等) |\n\n#### /api/honeypots — 蜜罐管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/honeypots` | JWT | 分页查询蜜罐列表(支持 type/status/keyword) |\n| POST | `/api/honeypots` | JWT | 创建新蜜罐 |\n| PUT | `/api/honeypots/<hp_id>` | JWT | 更新蜜罐配置 |\n| DELETE | `/api/honeypots/<hp_id>` | JWT | 删除蜜罐 |\n| POST | `/api/honeypots/<hp_id>/start` | JWT | 启动蜜罐进程 |\n| POST | `/api/honeypots/<hp_id>/stop` | JWT | 停止蜜罐进程 |\n| GET | `/api/honeypots/<hp_id>/health` | JWT | 蜜罐健康检查 |\n\n#### /api/logs — 日志审计\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/logs` | JWT | 分页查询日志(支持多字段过滤) |\n| GET | `/api/logs/export` | JWT | 导出日志为 CSV(含 BOM,支持 Excel) |\n| GET | `/api/logs/<log_id>` | JWT | 根据 ID 获取单条日志 |\n| GET | `/api/logs/attack-types` | JWT | 获取所有攻击类型枚举 |\n| GET | `/api/logs/threat-levels` | JWT | 获取所有威胁等级枚举 |\n| GET | `/api/logs/statistics` | JWT | 获取日志统计汇总 |\n| POST | `/api/logs/internal/upload` | 无 | **内部接口**:蜜罐进程上报攻击日志 |\n\n#### /api/malicious-ips — 恶意IP管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/malicious-ips` | JWT | 分页查询恶意IP(支持 is_blocked/threat_level/keyword) |\n| POST | `/api/malicious-ips/block` | JWT | 封禁指定IP(支持时长/截止时间) |\n| POST | `/api/malicious-ips/unblock` | JWT | 解封指定IP |\n\n#### /api/match-rules — 匹配规则引擎\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/match-rules` | JWT | 分页查询规则 |\n| GET | `/api/match-rules/<rule_id>` | JWT | 获取单条规则 |\n| POST | `/api/match-rules` | JWT | 创建规则(正则+威胁等级+自动封禁配置) |\n| PUT | `/api/match-rules/<rule_id>` | JWT | 更新规则 |\n| DELETE | `/api/match-rules/<rule_id>` | JWT | 删除规则 |\n| PUT | `/api/match-rules/<rule_id>/toggle` | JWT | 切换规则启用状态 |\n| GET | `/api/match-rules/attack-types` | JWT | 获取攻击类型枚举 |\n| GET | `/api/match-rules/threat-levels` | JWT | 获取威胁等级枚举 |\n\n#### /api/ai-config — AI大模型配置\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/ai-config/` | JWT | 获取所有AI配置 |\n| POST | `/api/ai-config/` | JWT | 创建AI配置(name/api_url/model_name必填) |\n| PUT | `/api/ai-config/<config_id>` | JWT | 更新AI配置 |\n| DELETE | `/api/ai-config/<config_id>` | JWT | 删除AI配置 |\n| POST | `/api/ai-config/<config_id>/activate` | JWT | 激活配置(设为当前使用) |\n| POST | `/api/ai-config/<config_id>/deactivate` | JWT | 禁用配置 |\n| POST | `/api/ai-config/<config_id>/test` | JWT | 测试AI配置连通性 |\n\n### 3. 数据库模型清单\n\n共 12 个 Model 文件,对应以下数据库表:\n\n| 模型文件 | 表名 | 说明 |\n| :--- | :--- | :--- |\n| `user_model.py` | `users` | 用户账号、密码哈希、角色(1管理员/2普通用户) |\n| `user_info_model.py` | `user_infos` | 用户扩展信息(手机号、邮箱、头像等) |\n| `permission_model.py` | `permissions` | 系统权限定义 |\n| `module_model.py` | `modules` / `user_modules` | 系统模块定义及用户-模块关联 |\n| `honeypot_model.py` | `honeypots` | 蜜罐配置(类型、端口、状态、`pid` 字段用于持久化进程) |\n| `log_model.py` | `logs` | 攻击日志记录(来源IP、载荷、威胁等级、协议等) |\n| `malicious_ip_model.py` | `malicious_ips` | 恶意IP列表(封禁状态、威胁等级、攻击次数) |\n| `block_history_model.py` | `block_history` | 封禁/解封操作历史记录 |\n| `attack_stats_model.py` | `attack_stats` | 攻击统计聚合数据(供 Dashboard 使用) |\n| `match_rule_model.py` | `match_rules` | 流量匹配规则(正则表达式、自动封禁、优先级) |\n| `ai_config_model.py` | `ai_configs` | AI大模型配置(API地址、模型名称、激活状态) |\n\n> **重要**:`honeypot_model.py` 中包含 `pid` 字段(Integer, nullable),用于在服务重启后通过 `psutil` 检查蜜罐子进程是否仍然存活。\n\n### 4. 蜜罐组件实现 (`backend/honeypots/`)\n\n| 文件 | 协议 | 默认端口 | 捕获目标 |\n| :--- | :--- | :--- | :--- |\n| `ftp_server.py` | FTP | 2121 | 爆破攻击、未授权访问、文件上传尝试 |\n| `ssh_server.py` | SSH | 2222 | 登录爆破、恶意命令执行(基于 Paramiko) |\n| `hikvision_http_server.py` | HTTP | 可配置(读取 `sys.argv[1]`) | IoT/摄像头设备漏洞探测、Web 攻击 |\n| `redis_server.py` | TCP/Redis | 6379 | Redis 未授权访问、SLAVEOF/CONFIG 命令利用 |\n| `mysql_server.py` | TCP/MySQL | 3306 | 数据库弱口令爆破(捕获用户名、客户端版本) |\n| `elasticsearch_server.py` | HTTP/ES | 9200 | 接口探测、数据查询、节点查询、恶意写入利用 |\n\n**蜜罐进程管理机制**:\n- 所有蜜罐以**独立子进程**方式启动(`subprocess.Popen`),与主 Flask 服务解耦。\n- 启动时将 PID 写入 `honeypots.pid` 数据库字段;停止时发送 `SIGTERM`/`taskkill`。\n- 服务重启后调用 `psutil.pid_exists()` 检查进程存活状态,自动修正数据库状态。\n- 蜜罐捕获到攻击后,通过 HTTP 调用 `/api/logs/internal/upload` 上报主服务。\n\n### 5. Agent 与智能响应模块 (`backend/agent/`)\n\n```\nagent/\n├── core.py # AI代理调度核心,支持多模型工作池、Queue+Threading异步队列\n├── llm_client.py # LLM客户端,封装 OpenAI 兼容 API 调用\n├── mcp/\n│ └── skill.py # MCP技能协议基类\n└── skills/\n ├── block_ip_skill.py # 自动封禁技能:先记录 malicious_ip 再调用防火墙封禁\n ├── decoder_skill.py # Base64/URL解码技能,辅助攻击载荷分析\n └── log_query_skill.py # 日志查询技能,供 AI Agent 检索历史攻击日志\n```\n\n**关键设计**:AI 分析通过 `Queue + Threading` 异步执行,不阻塞 HTTP 请求线程。\n\n### 6. 工具模块 (`backend/utils/`)\n\n| 文件 | 说明 |\n| :--- | :--- |\n| `api_response.py` | 统一 API 响应格式工具(`ApiResponse.success/error/bad_request` 等) |\n| `ip_utils.py` | **离线** IP 地理位置解析(MaxMind GeoLite2 MMDB),含 LRU 缓存 10000 条、私有 IP 判断 |\n| `time_utils.py` | 时间格式化工具函数 |\n| `download_geoip.py` | 自动下载/更新 GeoLite2 数据库脚本 |\n| `data/GeoLite2-City.mmdb` | 离线城市/国家地理数据库 |\n| `data/GeoLite2-ASN.mmdb` | 离线 ASN 自治系统数据库 |\n\n> **注意**:IP 溯源已从在线 `ip-api.com` 全面迁移至离线 MaxMind GeoLite2,无需外网访问。\n\n### 7. 前端视图清单 (`vueweb/vue-project/src/views/`)\n\n| 文件路径 | 功能说明 |\n| :--- | :--- |\n| `Dashboard.vue` | 仪表盘入口(路由容器) |\n| `dashboard/DashboardLayout.vue` | 数据大屏布局(导航 + 内容区) |\n| `dashboard/Overview.vue` | 攻击总览(总数、封禁数、实时告警) |\n| `dashboard/Trend.vue` | 攻击趋势折线图(按天/小时粒度) |\n| `dashboard/Types.vue` | 攻击类型饼图/柱状图分布 |\n| `dashboard/Map.vue` | 世界地图攻击来源热力图(ECharts) |\n| `HoneypotManagement.vue` | 蜜罐管理(CRUD、启停控制、健康状态监控) |\n| `LogQuery.vue` | 日志查询(多维度过滤、详情展示、CSV导出) |\n| `MaliciousIPManagement.vue` | 恶意IP管理(封禁/解封、威胁等级筛选) |\n| `MatchRuleManagement.vue` | 匹配规则管理(正则规则CRUD、启停切换) |\n| `AIConfigManagement.vue` | AI配置管理(多模型配置、激活/禁用、连通测试) |\n| `UserManagement.vue` | 用户管理(管理员):列表、增删改、模块权限分配 |\n| `UserProfile.vue` | 个人中心:查看/修改自己的手机、邮箱、密码 |\n\n**前端特性**:\n- 支持**暗黑/明亮**主题切换(持久化到 localStorage)。\n- 路由守卫:token 存在但 `user` 为空时,先 `await fetchCurrentUser()` 再放行,防止权限检查时序问题。\n- 所有 HTTP 请求通过 Axios 统一拦截器附加 `Authorization: Bearer <token>`。\n\n### 8. 后端初始化脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `init_database.py` | 创建所有数据库表(`db.create_all()`) |\n| `init_data.py` | 初始化基础数据(角色、权限) |\n| `init_modules.py` | 初始化系统功能模块数据 |\n| `init_permissions.py` | 初始化权限条目 |\n| `init_honeypot.py` | 初始化默认蜜罐配置 |\n| `config.py` | Flask 配置类(数据库URI、JWT密钥、CORS等) |\n| `extensions.py` | Flask 扩展实例集中管理(SocketIO 全局单例),避免 reloader 实例不一致 |\n| `app.py` | Flask 应用入口,注册所有蓝图,初始化 SocketIO 并注册 /ws namespace |\n\n### 9. 数据库迁移\n\n使用 Flask-Migrate(Alembic),迁移文件位于 `backend/migrations/versions/`。\n\n**已有迁移**:\n- `f1a2b3c4d5e6_add_pid_to_honeypots.py` — 为 `honeypots` 表新增 `pid` 字段,支持进程持久化重启检测。\n\n---\n\n## 八、WebSocket 实时推送架构\n\n### 1. 技术选型\n| 层 | 技术 | 版本 |\n| :--- | :--- | :--- |\n| 后端 | Flask-SocketIO | 5.3.6 |\n| 后端传输 | python-socketio + python-engineio | 5.10.0 / 4.8.2 |\n| 前端 | socket.io-client | 4.7.5 |\n\n### 2. 架构流程\n\n```\n蜜罐捕获攻击\n ↓ HTTP POST /api/logs/internal/upload\nlog_service.py · create_log()\n ├─ 规则匹配 (MatchRule)\n ├─ 写入 MySQL (Log)\n ├─ AI 分析任务入队\n ├─ 记录恶意 IP\n └─ [仅恶意流量] socketio.emit('new_attack', payload, namespace='/ws')\n ↓ WebSocket\n 前端 useSocket composable\n ↓\n ┌─────────────┼─────────────┐\n DashboardLayout.vue Overview.vue Map.vue\n (ElNotification弹窗 (数字跳动+ (地图红色\n + 高危横幅) 实时告警列表) 脉冲散点)\n```\n\n### 3. 关键文件\n\n| 文件 | 职责 |\n| :--- | :--- |\n| `backend/extensions.py` | **全局唯一** `socketio = SocketIO()` 实例,所有模块必须从此处导入 socketio,避免 werkzeug reloader 导致实例不一致 |\n| `backend/app.py` | `from extensions import socketio`,调用 `socketio.init_app(app, ...)`,注册 `/ws` namespace 的 connect/disconnect handler,使用 `socketio.run()` 替代 `app.run()` |\n| `backend/service/log_service.py` | `create_log()` 末尾 `from extensions import socketio`,emit `new_attack` 事件到 `/ws` namespace |\n| `frontend/src/composables/useSocket.ts` | 全局 Socket 单例管理,`connectSocket()`/`disconnectSocket()` 由 DashboardLayout 统一管理生命周期,提供 `onAttack/offAttack` 订阅方法,pending 队列 + 重连恢复(先 `off('new_attack')` 再统一重绑,避免 handler 重复注册) |\n| `frontend/src/views/dashboard/DashboardLayout.vue` | 订阅 `new_attack`,显示 `ElNotification` 弹窗 + 高危横幅(含滑入动画),菜单栏显示连接状态指示灯(绿/红),使用 `<keep-alive>` 缓存子路由 |\n| `frontend/src/views/dashboard/Overview.vue` | 订阅 `new_attack`,数字递增 + bounce 跳动动画 + 实时告警列表(最多 10 条,transition-group 滑入动画) |\n| `frontend/src/views/dashboard/Map.vue` | 订阅 `new_attack`,追加 `effectScatter` 脉冲散点到地图(使用 `Map` 结构消除竞态),5 秒后自动消失,过滤 `(0,0)` null-island 坐标 |\n\n> **重要**:`socketio` 实例必须从 `extensions.py` 导入,**禁止**从 `app.py` 导入。原因:werkzeug 的 `use_reloader=True` 会在子进程中重新执行 `app.py`,导致 `app.py` 中定义的 `socketio` 和其他模块缓存导入的 `socketio` 不是同一个对象。`extensions.py` 作为独立模块不受 reloader 影响。\n\n### 4. 推送事件规范\n\n**事件名**:`new_attack` \n**Namespace**:`/ws` \n**触发条件**:`is_malicious == True`(低危/正常流量不推送,减少噪声)\n\n**载荷字段**:\n```json\n{\n \"log_id\": 123,\n \"source_ip\": \"1.2.3.4\",\n \"attack_type\": \"SQL注入\",\n \"threat_level\": \"high\",\n \"protocol\": \"HTTP\",\n \"target_port\": 80,\n \"attack_time\": \"2026-03-27T10:30:00\",\n \"attack_description\": \"触发规则: SQL注入检测\",\n \"longitude\": 116.4074,\n \"latitude\": 39.9042\n}\n```\n\n### 5. 后端重启说明\n\nWebSocket 需要使用 `socketio.run()` 替代 `app.run()`,已在 `app.py` 中完成更新。\n重启后端后 WebSocket 功能即生效,无需额外操作。\n\n### 6. WebSocket 测试脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `backend/test/test_realtime_report.py` | 主测试脚本:30 次/60 秒全球 IP 的 SQL 注入攻击,用于验证大屏 4 个核心动态效果 |\n| `backend/test/verify_websocket.py` | WebSocket 推送端到端验证:Python socketio 客户端连接 `/ws`,发 3 条攻击,验证 4 项指标(事件到达、坐标、攻击类型、威胁等级) |\n\n---\n\n## 九、代码重载\n后端代码修改之后必须重新启动后端进程\n\n---\n\n## 十、多级恶意流量识别引擎\n\n### 1. 架构概述\n\n蜜罐捕获的原始流量经过**三级识别漏斗**,逐级过滤和分类:\n\n```\n蜜罐原始数据 → 第一级:正则规则匹配 → 第二级:暴力破解频次分析 → 第三级:AI深度分析\n```\n\n### 2. 蜜罐端设计原则(纯数据采集探针)\n\n蜜罐脚本**只负责捕获原始数据**,不做任何攻击分类。上报字段:\n- `attacker_ip` / `attacker_port` — 攻击来源\n- `honeypot_port` — 蜜罐端口\n- `protocol` — 协议类型 (SSH/FTP/HTTP/TCP 等)\n- `raw_log` — 原始请求/命令完整记录\n- `payload` — 载荷内容(认证类蜜罐统一格式:`\"Username: xxx, Password: xxx\"`)\n- `request_path` / `user_agent` — HTTP 蜜罐专用字段\n\n**禁止**在蜜罐脚本中包含 `attack_type`、`threat_level`、`attack_description` 等分类逻辑。\n\n### 3. 三级识别流水线(`log_service.py` · `create_log()`)\n\n#### 第一级:正则规则引擎匹配\n- 从 `match_rules` 表读取所有 `is_enabled=True` 的规则,按 `priority ASC` 排序(数字越小优先级越高)\n- 匹配字段由规则的 `match_field` 决定(目前全部为 `raw_log`)\n- 命中规则后立即设置 `attack_type`、`threat_level`、`attack_description`、`is_malicious`\n- **首条命中即停止**,不会继续匹配后续规则\n\n#### 第二级:暴力破解频次分析\n- **触发条件**:第一级未命中任何规则(`attack_type` 仍为 `'正常流量'`)\n- **检测方法**:`_check_brute_force(source_ip, protocol, current_payload)`\n - 查询同一 IP + 同一协议在最近 **1 分钟** 内的日志数量\n - HTTP 协议特殊处理:只有包含认证凭证(`Username:...Password:...`)的请求才计入暴力破解计数\n - 阈值:**20 次/分钟** (`BRUTE_FORCE_THRESHOLD = 20`)\n- **凭证检测**:`_is_credential_payload(payload)` 使用正则 `r'Username:\\s*.+,\\s*Password:\\s*.+'` 判断\n- 命中后设置 `attack_type='暴力破解'`、`threat_level='high'`、`is_malicious=True`\n\n#### 第三级:AI 深度分析\n- **触发条件**:所有日志均入 AI 分析队列(`Queue + Threading` 异步执行)\n- **AI 回写机制**(`ai_analysis_service.py` · `_process_single_log()`):\n - 当 AI 置信度 >= 0.7 且判定为恶意时,自动回写主记录的 `attack_type`、`threat_level`、`is_malicious`\n - AI 分析摘要追加到 `attack_description` 字段(带 `[AI分析]` 前缀)\n - AI 发现新恶意流量时同步调用 `MaliciousIPService.record_malicious_ip()`\n - 威胁等级映射:置信度 >= 0.9 → `high`,>= 0.7 → `medium`\n\n### 4. 匹配规则优先级说明\n\n规则按 `priority ASC` 排序匹配,关键优先级分布:\n\n| 优先级范围 | 规则类型 | 说明 |\n| :--- | :--- | :--- |\n| 1-3 | XSS、SQL注入(基础)、目录遍历 | 高频攻击,精确正则 |\n| 5 | Redis未授权访问 | 协议专用规则 |\n| 6-9 | WebShell、RCE、扫描探测 | 中等精度规则 |\n| 11-15 | SQL注入(盲注)、XXE、信息泄露 | 长正则、较复杂模式 |\n| 18 | 命令注入(宽泛匹配) | 匹配 `;` `|` `(` 等字符,优先级故意调低,避免误判 |\n| 20-50 | XSS/目录遍历/信息泄露/扫描探测(补充) | 低优先级兜底规则 |\n\n> **重要**:命令注入规则 (ID=8) 的正则包含 `(;|\\||&|\\$|\\(|\\)|...)` 极其宽泛,priority 已从 5 调整为 18,防止将 `sleep()`、`eval()`、Nmap UA 等载荷误判为命令注入。\n\n### 5. 自动化测试\n\n测试脚本:`backend/test_traffic_identification.py`\n\n- **51 个断言**,覆盖 22 个测试场景\n- 4 个正常流量测试(SSH/FTP/HTTP/ES)\n- 11 个正则规则匹配测试(SQL注入×2、XSS×2、命令注入、目录遍历、信息泄露、Redis×2、WebShell、扫描探测)\n- 5 个暴力破解测试(SSH低频/高频、HTTP纯GET不触发、HTTP凭证爆破、FTP爆破、MySQL爆破)\n- 2 个混合场景测试\n\n运行方式:\n```bash\n# 确保 Flask 后端运行在 5000 端口\ncd backend\npython run_server.py & # 或 python app.py\npython test_traffic_identification.py\n```\n\n测试脚本在 SETUP 阶段会自动:\n- 创建/复用测试账户 `testadmin01`\n- 动态发现蜜罐端口\n- 确保 Redis 匹配规则存在\n- 将命令注入规则优先级调至 18"}, "b3b41b3b6f9ba192014d620ebd3f14d90a66ca8c": {"t": 1785764218.7023408, "n": 18147, "h": "5bf65d443639d511", "c": "# 第一个规范 (必须遵守)\n 当每次大的修改和功能的新增,如果与CLAUDE.md文件内容不一致了,需要把新增的功能或者修改功能的逻辑重新写入CLAUDE.md,确保CLAUDE.md文件为最新的。\n \n# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n\n| 业务模块 | Route 文件 | Service 文件 | Model 文件 | 职责说明 |\n| :--- | :--- | :--- | :--- | :--- |\n| **User (用户权限)** | `user_route.py` | `user_service.py` | `user_model.py`, `user_info_model.py`, `permission_model.py`, `module_model.py` | 注册、登录、JWT鉴权、用户管理、模块权限分配 |\n| **Dashboard (数据大屏)** | `dashboard_route.py` | `dashboard_service.py` | `attack_stats_model.py` | 攻击趋势、类型分布、地图热力、总览统计(均需JWT) |\n| **Honeypot (蜜罐管理)** | `honeypot_route.py` | `honeypot_service.py` | `honeypot_model.py` | 蜜罐CRUD、进程启停、健康检查、PID持久化 |\n| **Log (日志审计)** | `log_route.py` | `log_service.py` | `log_model.py` | 日志查询、分页、导出CSV、内部上报(蜜罐使用) |\n| **Malicious IP (恶意拦截)** | `malicious_ip_route.py` | `malicious_ip_service.py` | `malicious_ip_model.py`, `block_history_model.py` | 恶意IP列表、封禁/解封、防火墙命令下发 |\n| **Match Rule (规则引擎)** | `match_rule_route.py` | `match_rule_service.py` | `match_rule_model.py` | 正则匹配规则管理、启停切换、自动封禁配置 |\n| **AI Config (大模型配置)** | `ai_config_route.py` | `ai_config_service.py`, `ai_analysis_service.py` | `ai_config_model.py` | LLM参数化配置、激活/禁用、连通性测试 |\n| **Test (测试接口)** | `test_route.py` | `test_service.py` | — | 内部功能测试,非生产接口 |\n\n### 2. 完整 API 端点清单\n\n#### /api/user — 用户管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| POST | `/api/user/register` | 无 | 用户注册 |\n| POST | `/api/user/login` | 无 | 用户登录,返回 JWT |\n| POST | `/api/user/create_admin` | 无 | 创建管理员(初始化用) |\n| GET | `/api/user/me` | JWT | 获取当前用户信息 |\n| PUT | `/api/user/me` | JWT | 更新当前用户信息(手机/邮箱/密码) |\n| GET | `/api/user/list` | JWT + 管理员 | 分页获取用户列表 |\n| POST | `/api/user/add` | JWT + 管理员 | 管理员新增用户 |\n| PUT | `/api/user/<user_id>` | JWT + 管理员 | 管理员修改用户 |\n| DELETE | `/api/user/<user_id>` | JWT + 管理员 | 管理员删除用户 |\n| GET | `/api/user/permissions` | JWT + 管理员 | 获取所有权限列表 |\n| GET | `/api/user/modules` | JWT | 获取所有模块列表 |\n\n#### /api/dashboard — 数据大屏\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/dashboard/trend` | JWT | 攻击趋势(支持 days/granularity 参数) |\n| GET | `/api/dashboard/types` | JWT | 攻击类型统计分布 |\n| GET | `/api/dashboard/map` | JWT | 攻击来源地图数据 |\n| GET | `/api/dashboard/summary` | JWT | 总览统计(总攻击数、封禁数等) |\n\n#### /api/honeypots — 蜜罐管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/honeypots` | JWT | 分页查询蜜罐列表(支持 type/status/keyword) |\n| POST | `/api/honeypots` | JWT | 创建新蜜罐 |\n| PUT | `/api/honeypots/<hp_id>` | JWT | 更新蜜罐配置 |\n| DELETE | `/api/honeypots/<hp_id>` | JWT | 删除蜜罐 |\n| POST | `/api/honeypots/<hp_id>/start` | JWT | 启动蜜罐进程 |\n| POST | `/api/honeypots/<hp_id>/stop` | JWT | 停止蜜罐进程 |\n| GET | `/api/honeypots/<hp_id>/health` | JWT | 蜜罐健康检查 |\n\n#### /api/logs — 日志审计\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/logs` | JWT | 分页查询日志(支持多字段过滤) |\n| GET | `/api/logs/export` | JWT | 导出日志为 CSV(含 BOM,支持 Excel) |\n| GET | `/api/logs/<log_id>` | JWT | 根据 ID 获取单条日志 |\n| GET | `/api/logs/attack-types` | JWT | 获取所有攻击类型枚举 |\n| GET | `/api/logs/threat-levels` | JWT | 获取所有威胁等级枚举 |\n| GET | `/api/logs/statistics` | JWT | 获取日志统计汇总 |\n| POST | `/api/logs/internal/upload` | 无 | **内部接口**:蜜罐进程上报攻击日志 |\n\n#### /api/malicious-ips — 恶意IP管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/malicious-ips` | JWT | 分页查询恶意IP(支持 is_blocked/threat_level/keyword) |\n| POST | `/api/malicious-ips/block` | JWT | 封禁指定IP(支持时长/截止时间) |\n| POST | `/api/malicious-ips/unblock` | JWT | 解封指定IP |\n\n#### /api/match-rules — 匹配规则引擎\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/match-rules` | JWT | 分页查询规则 |\n| GET | `/api/match-rules/<rule_id>` | JWT | 获取单条规则 |\n| POST | `/api/match-rules` | JWT | 创建规则(正则+威胁等级+自动封禁配置) |\n| PUT | `/api/match-rules/<rule_id>` | JWT | 更新规则 |\n| DELETE | `/api/match-rules/<rule_id>` | JWT | 删除规则 |\n| PUT | `/api/match-rules/<rule_id>/toggle` | JWT | 切换规则启用状态 |\n| GET | `/api/match-rules/attack-types` | JWT | 获取攻击类型枚举 |\n| GET | `/api/match-rules/threat-levels` | JWT | 获取威胁等级枚举 |\n\n#### /api/ai-config — AI大模型配置\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/ai-config/` | JWT | 获取所有AI配置 |\n| POST | `/api/ai-config/` | JWT | 创建AI配置(name/api_url/model_name必填) |\n| PUT | `/api/ai-config/<config_id>` | JWT | 更新AI配置 |\n| DELETE | `/api/ai-config/<config_id>` | JWT | 删除AI配置 |\n| POST | `/api/ai-config/<config_id>/activate` | JWT | 激活配置(设为当前使用) |\n| POST | `/api/ai-config/<config_id>/deactivate` | JWT | 禁用配置 |\n| POST | `/api/ai-config/<config_id>/test` | JWT | 测试AI配置连通性 |\n\n### 3. 数据库模型清单\n\n共 12 个 Model 文件,对应以下数据库表:\n\n| 模型文件 | 表名 | 说明 |\n| :--- | :--- | :--- |\n| `user_model.py` | `users` | 用户账号、密码哈希、角色(1管理员/2普通用户) |\n| `user_info_model.py` | `user_infos` | 用户扩展信息(手机号、邮箱、头像等) |\n| `permission_model.py` | `permissions` | 系统权限定义 |\n| `module_model.py` | `modules` / `user_modules` | 系统模块定义及用户-模块关联 |\n| `honeypot_model.py` | `honeypots` | 蜜罐配置(类型、端口、状态、`pid` 字段用于持久化进程) |\n| `log_model.py` | `logs` | 攻击日志记录(来源IP、载荷、威胁等级、协议等) |\n| `malicious_ip_model.py` | `malicious_ips` | 恶意IP列表(封禁状态、威胁等级、攻击次数) |\n| `block_history_model.py` | `block_history` | 封禁/解封操作历史记录 |\n| `attack_stats_model.py` | `attack_stats` | 攻击统计聚合数据(供 Dashboard 使用) |\n| `match_rule_model.py` | `match_rules` | 流量匹配规则(正则表达式、自动封禁、优先级) |\n| `ai_config_model.py` | `ai_configs` | AI大模型配置(API地址、模型名称、激活状态) |\n\n> **重要**:`honeypot_model.py` 中包含 `pid` 字段(Integer, nullable),用于在服务重启后通过 `psutil` 检查蜜罐子进程是否仍然存活。\n\n### 4. 蜜罐组件实现 (`backend/honeypots/`)\n\n| 文件 | 协议 | 默认端口 | 捕获目标 |\n| :--- | :--- | :--- | :--- |\n| `ftp_server.py` | FTP | 2121 | 爆破攻击、未授权访问、文件上传尝试 |\n| `ssh_server.py` | SSH | 2222 | 登录爆破、恶意命令执行(基于 Paramiko) |\n| `hikvision_http_server.py` | HTTP | 可配置(读取 `sys.argv[1]`) | IoT/摄像头设备漏洞探测、Web 攻击 |\n| `redis_server.py` | TCP/Redis | 6379 | Redis 未授权访问、SLAVEOF/CONFIG 命令利用 |\n| `mysql_server.py` | TCP/MySQL | 3306 | 数据库弱口令爆破(捕获用户名、客户端版本) |\n| `elasticsearch_server.py` | HTTP/ES | 9200 | 接口探测、数据查询、节点查询、恶意写入利用 |\n\n**蜜罐进程管理机制**:\n- 所有蜜罐以**独立子进程**方式启动(`subprocess.Popen`),与主 Flask 服务解耦。\n- 启动时将 PID 写入 `honeypots.pid` 数据库字段;停止时发送 `SIGTERM`/`taskkill`。\n- 服务重启后调用 `psutil.pid_exists()` 检查进程存活状态,自动修正数据库状态。\n- 蜜罐捕获到攻击后,通过 HTTP 调用 `/api/logs/internal/upload` 上报主服务。\n\n### 5. Agent 与智能响应模块 (`backend/agent/`)\n\n```\nagent/\n├── core.py # AI代理调度核心,支持多模型工作池、Queue+Threading异步队列\n├── llm_client.py # LLM客户端,封装 OpenAI 兼容 API 调用\n├── mcp/\n│ └── skill.py # MCP技能协议基类\n└── skills/\n ├── block_ip_skill.py # 自动封禁技能:先记录 malicious_ip 再调用防火墙封禁\n ├── decoder_skill.py # Base64/URL解码技能,辅助攻击载荷分析\n └── log_query_skill.py # 日志查询技能,供 AI Agent 检索历史攻击日志\n```\n\n**关键设计**:AI 分析通过 `Queue + Threading` 异步执行,不阻塞 HTTP 请求线程。\n\n### 6. 工具模块 (`backend/utils/`)\n\n| 文件 | 说明 |\n| :--- | :--- |\n| `api_response.py` | 统一 API 响应格式工具(`ApiResponse.success/error/bad_request` 等) |\n| `ip_utils.py` | **离线** IP 地理位置解析(MaxMind GeoLite2 MMDB),含 LRU 缓存 10000 条、私有 IP 判断 |\n| `time_utils.py` | 时间格式化工具函数 |\n| `download_geoip.py` | 自动下载/更新 GeoLite2 数据库脚本 |\n| `data/GeoLite2-City.mmdb` | 离线城市/国家地理数据库 |\n| `data/GeoLite2-ASN.mmdb` | 离线 ASN 自治系统数据库 |\n\n> **注意**:IP 溯源已从在线 `ip-api.com` 全面迁移至离线 MaxMind GeoLite2,无需外网访问。\n\n### 7. 前端视图清单 (`vueweb/vue-project/src/views/`)\n\n| 文件路径 | 功能说明 |\n| :--- | :--- |\n| `Dashboard.vue` | 仪表盘入口(路由容器) |\n| `dashboard/DashboardLayout.vue` | 数据大屏布局(导航 + 内容区) |\n| `dashboard/Overview.vue` | 攻击总览(总数、封禁数、实时告警) |\n| `dashboard/Trend.vue` | 攻击趋势折线图(按天/小时粒度) |\n| `dashboard/Types.vue` | 攻击类型饼图/柱状图分布 |\n| `dashboard/Map.vue` | 世界地图攻击来源热力图(ECharts) |\n| `HoneypotManagement.vue` | 蜜罐管理(CRUD、启停控制、健康状态监控) |\n| `LogQuery.vue` | 日志查询(多维度过滤、详情展示、CSV导出) |\n| `MaliciousIPManagement.vue` | 恶意IP管理(封禁/解封、威胁等级筛选) |\n| `MatchRuleManagement.vue` | 匹配规则管理(正则规则CRUD、启停切换) |\n| `AIConfigManagement.vue` | AI配置管理(多模型配置、激活/禁用、连通测试) |\n| `UserManagement.vue` | 用户管理(管理员):列表、增删改、模块权限分配 |\n| `UserProfile.vue` | 个人中心:查看/修改自己的手机、邮箱、密码 |\n\n**前端特性**:\n- 支持**暗黑/明亮**主题切换(持久化到 localStorage)。\n- 路由守卫:token 存在但 `user` 为空时,先 `await fetchCurrentUser()` 再放行,防止权限检查时序问题。\n- 所有 HTTP 请求通过 Axios 统一拦截器附加 `Authorization: Bearer <token>`。\n\n### 8. 后端初始化脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `init_database.py` | 创建所有数据库表(`db.create_all()`) |\n| `init_data.py` | 初始化基础数据(角色、权限) |\n| `init_modules.py` | 初始化系统功能模块数据 |\n| `init_permissions.py` | 初始化权限条目 |\n| `init_honeypot.py` | 初始化默认蜜罐配置 |\n| `config.py` | Flask 配置类(数据库URI、JWT密钥、CORS等) |\n| `app.py` | Flask 应用入口,注册所有蓝图 |\n\n### 9. 数据库迁移\n\n使用 Flask-Migrate(Alembic),迁移文件位于 `backend/migrations/versions/`。\n\n**已有迁移**:\n- `f1a2b3c4d5e6_add_pid_to_honeypots.py` — 为 `honeypots` 表新增 `pid` 字段,支持进程持久化重启检测。\n\n---\n\n## 八、WebSocket 实时推送架构\n\n### 1. 技术选型\n| 层 | 技术 | 版本 |\n| :--- | :--- | :--- |\n| 后端 | Flask-SocketIO | 5.3.6 |\n| 后端传输 | python-socketio + python-engineio | 5.10.0 / 4.8.2 |\n| 前端 | socket.io-client | 4.7.5 |\n\n### 2. 架构流程\n\n```\n蜜罐捕获攻击\n ↓ HTTP POST /api/logs/internal/upload\nlog_service.py · create_log()\n ├─ 规则匹配 (MatchRule)\n ├─ 写入 MySQL (Log)\n ├─ AI 分析任务入队\n ├─ 记录恶意 IP\n └─ [仅恶意流量] socketio.emit('new_attack', payload, namespace='/ws')\n ↓ WebSocket\n 前端 useSocket composable\n ↓\n ┌─────────────┼─────────────┐\n DashboardLayout.vue Overview.vue Map.vue\n (ElNotification弹窗 (数字跳动+ (地图红色\n + 高危横幅) 实时告警列表) 脉冲散点)\n```\n\n### 3. 关键文件\n\n| 文件 | 职责 |\n| :--- | :--- |\n| `backend/app.py` | 全局 `socketio = SocketIO()` 单例,`socketio.init_app(app, ...)` 初始化,`socketio.run()` 替代 `app.run()` |\n| `backend/service/log_service.py` | `create_log()` 末尾注入 `socketio.emit('new_attack', payload, namespace='/ws')` |\n| `frontend/src/composables/useSocket.ts` | 全局 Socket 单例管理,提供 `onAttack/offAttack` 订阅方法,引用计数自动管理连接生命周期 |\n| `frontend/src/views/dashboard/DashboardLayout.vue` | 订阅 `new_attack`,显示 `ElNotification` 弹窗 + 高危横幅(含滑入动画),菜单栏显示连接状态指示灯 |\n| `frontend/src/views/dashboard/Overview.vue` | 订阅 `new_attack`,数字跳动闪烁 + 实时告警列表(最多 10 条,列表滑入动画) |\n| `frontend/src/views/dashboard/Map.vue` | 订阅 `new_attack`,追加 `effectScatter` 脉冲散点到地图,5 秒后自动消失 |\n\n### 4. 推送事件规范\n\n**事件名**:`new_attack` \n**Namespace**:`/ws` \n**触发条件**:`is_malicious == True`(低危/正常流量不推送,减少噪声)\n\n**载荷字段**:\n```json\n{\n \"log_id\": 123,\n \"source_ip\": \"1.2.3.4\",\n \"attack_type\": \"SQL注入\",\n \"threat_level\": \"high\",\n \"protocol\": \"HTTP\",\n \"target_port\": 80,\n \"attack_time\": \"2026-03-27T10:30:00\",\n \"attack_description\": \"触发规则: SQL注入检测\"\n}\n```\n\n### 5. 后端重启说明\n\nWebSocket 需要使用 `socketio.run()` 替代 `app.run()`,已在 `app.py` 中完成更新。\n重启后端后 WebSocket 功能即生效,无需额外操作。\n\n---\n\n## 九、代码重载\n后端代码修改之后必须重新启动后端进程\n\n---\n\n## 十、多级恶意流量识别引擎\n\n### 1. 架构概述\n\n蜜罐捕获的原始流量经过**三级识别漏斗**,逐级过滤和分类:\n\n```\n蜜罐原始数据 → 第一级:正则规则匹配 → 第二级:暴力破解频次分析 → 第三级:AI深度分析\n```\n\n### 2. 蜜罐端设计原则(纯数据采集探针)\n\n蜜罐脚本**只负责捕获原始数据**,不做任何攻击分类。上报字段:\n- `attacker_ip` / `attacker_port` — 攻击来源\n- `honeypot_port` — 蜜罐端口\n- `protocol` — 协议类型 (SSH/FTP/HTTP/TCP 等)\n- `raw_log` — 原始请求/命令完整记录\n- `payload` — 载荷内容(认证类蜜罐统一格式:`\"Username: xxx, Password: xxx\"`)\n- `request_path` / `user_agent` — HTTP 蜜罐专用字段\n\n**禁止**在蜜罐脚本中包含 `attack_type`、`threat_level`、`attack_description` 等分类逻辑。\n\n### 3. 三级识别流水线(`log_service.py` · `create_log()`)\n\n#### 第一级:正则规则引擎匹配\n- 从 `match_rules` 表读取所有 `is_enabled=True` 的规则,按 `priority ASC` 排序(数字越小优先级越高)\n- 匹配字段由规则的 `match_field` 决定(目前全部为 `raw_log`)\n- 命中规则后立即设置 `attack_type`、`threat_level`、`attack_description`、`is_malicious`\n- **首条命中即停止**,不会继续匹配后续规则\n\n#### 第二级:暴力破解频次分析\n- **触发条件**:第一级未命中任何规则(`attack_type` 仍为 `'正常流量'`)\n- **检测方法**:`_check_brute_force(source_ip, protocol, current_payload)`\n - 查询同一 IP + 同一协议在最近 **1 分钟** 内的日志数量\n - HTTP 协议特殊处理:只有包含认证凭证(`Username:...Password:...`)的请求才计入暴力破解计数\n - 阈值:**20 次/分钟** (`BRUTE_FORCE_THRESHOLD = 20`)\n- **凭证检测**:`_is_credential_payload(payload)` 使用正则 `r'Username:\\s*.+,\\s*Password:\\s*.+'` 判断\n- 命中后设置 `attack_type='暴力破解'`、`threat_level='high'`、`is_malicious=True`\n\n#### 第三级:AI 深度分析\n- **触发条件**:所有日志均入 AI 分析队列(`Queue + Threading` 异步执行)\n- **AI 回写机制**(`ai_analysis_service.py` · `_process_single_log()`):\n - 当 AI 置信度 >= 0.7 且判定为恶意时,自动回写主记录的 `attack_type`、`threat_level`、`is_malicious`\n - AI 分析摘要追加到 `attack_description` 字段(带 `[AI分析]` 前缀)\n - AI 发现新恶意流量时同步调用 `MaliciousIPService.record_malicious_ip()`\n - 威胁等级映射:置信度 >= 0.9 → `high`,>= 0.7 → `medium`\n\n### 4. 匹配规则优先级说明\n\n规则按 `priority ASC` 排序匹配,关键优先级分布:\n\n| 优先级范围 | 规则类型 | 说明 |\n| :--- | :--- | :--- |\n| 1-3 | XSS、SQL注入(基础)、目录遍历 | 高频攻击,精确正则 |\n| 5 | Redis未授权访问 | 协议专用规则 |\n| 6-9 | WebShell、RCE、扫描探测 | 中等精度规则 |\n| 11-15 | SQL注入(盲注)、XXE、信息泄露 | 长正则、较复杂模式 |\n| 18 | 命令注入(宽泛匹配) | 匹配 `;` `|` `(` 等字符,优先级故意调低,避免误判 |\n| 20-50 | XSS/目录遍历/信息泄露/扫描探测(补充) | 低优先级兜底规则 |\n\n> **重要**:命令注入规则 (ID=8) 的正则包含 `(;|\\||&|\\$|\\(|\\)|...)` 极其宽泛,priority 已从 5 调整为 18,防止将 `sleep()`、`eval()`、Nmap UA 等载荷误判为命令注入。\n\n### 5. 自动化测试\n\n测试脚本:`backend/test_traffic_identification.py`\n\n- **51 个断言**,覆盖 22 个测试场景\n- 4 个正常流量测试(SSH/FTP/HTTP/ES)\n- 11 个正则规则匹配测试(SQL注入×2、XSS×2、命令注入、目录遍历、信息泄露、Redis×2、WebShell、扫描探测)\n- 5 个暴力破解测试(SSH低频/高频、HTTP纯GET不触发、HTTP凭证爆破、FTP爆破、MySQL爆破)\n- 2 个混合场景测试\n\n运行方式:\n```bash\n# 确保 Flask 后端运行在 5000 端口\ncd backend\npython run_server.py & # 或 python app.py\npython test_traffic_identification.py\n```\n\n测试脚本在 SETUP 阶段会自动:\n- 创建/复用测试账户 `testadmin01`\n- 动态发现蜜罐端口\n- 确保 Redis 匹配规则存在\n- 将命令注入规则优先级调至 18"}, "8591e3bdfea4923bb4af04b5cf890abae12924ba": {"t": 1785764220.3118956, "n": 15566, "h": "61a6c53bf8741f99", "c": "# 第一个规范 (必须遵守)\n 当每次大的修改和功能的新增,如果与CLAUDE.md文件内容不一致了,需要把新增的功能或者修改功能的逻辑重新写入CLAUDE.md,确保CLAUDE.md文件为最新的。\n \n# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n\n| 业务模块 | Route 文件 | Service 文件 | Model 文件 | 职责说明 |\n| :--- | :--- | :--- | :--- | :--- |\n| **User (用户权限)** | `user_route.py` | `user_service.py` | `user_model.py`, `user_info_model.py`, `permission_model.py`, `module_model.py` | 注册、登录、JWT鉴权、用户管理、模块权限分配 |\n| **Dashboard (数据大屏)** | `dashboard_route.py` | `dashboard_service.py` | `attack_stats_model.py` | 攻击趋势、类型分布、地图热力、总览统计(均需JWT) |\n| **Honeypot (蜜罐管理)** | `honeypot_route.py` | `honeypot_service.py` | `honeypot_model.py` | 蜜罐CRUD、进程启停、健康检查、PID持久化 |\n| **Log (日志审计)** | `log_route.py` | `log_service.py` | `log_model.py` | 日志查询、分页、导出CSV、内部上报(蜜罐使用) |\n| **Malicious IP (恶意拦截)** | `malicious_ip_route.py` | `malicious_ip_service.py` | `malicious_ip_model.py`, `block_history_model.py` | 恶意IP列表、封禁/解封、防火墙命令下发 |\n| **Match Rule (规则引擎)** | `match_rule_route.py` | `match_rule_service.py` | `match_rule_model.py` | 正则匹配规则管理、启停切换、自动封禁配置 |\n| **AI Config (大模型配置)** | `ai_config_route.py` | `ai_config_service.py`, `ai_analysis_service.py` | `ai_config_model.py` | LLM参数化配置、激活/禁用、连通性测试 |\n| **Test (测试接口)** | `test_route.py` | `test_service.py` | — | 内部功能测试,非生产接口 |\n\n### 2. 完整 API 端点清单\n\n#### /api/user — 用户管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| POST | `/api/user/register` | 无 | 用户注册 |\n| POST | `/api/user/login` | 无 | 用户登录,返回 JWT |\n| POST | `/api/user/create_admin` | 无 | 创建管理员(初始化用) |\n| GET | `/api/user/me` | JWT | 获取当前用户信息 |\n| PUT | `/api/user/me` | JWT | 更新当前用户信息(手机/邮箱/密码) |\n| GET | `/api/user/list` | JWT + 管理员 | 分页获取用户列表 |\n| POST | `/api/user/add` | JWT + 管理员 | 管理员新增用户 |\n| PUT | `/api/user/<user_id>` | JWT + 管理员 | 管理员修改用户 |\n| DELETE | `/api/user/<user_id>` | JWT + 管理员 | 管理员删除用户 |\n| GET | `/api/user/permissions` | JWT + 管理员 | 获取所有权限列表 |\n| GET | `/api/user/modules` | JWT | 获取所有模块列表 |\n\n#### /api/dashboard — 数据大屏\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/dashboard/trend` | JWT | 攻击趋势(支持 days/granularity 参数) |\n| GET | `/api/dashboard/types` | JWT | 攻击类型统计分布 |\n| GET | `/api/dashboard/map` | JWT | 攻击来源地图数据 |\n| GET | `/api/dashboard/summary` | JWT | 总览统计(总攻击数、封禁数等) |\n\n#### /api/honeypots — 蜜罐管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/honeypots` | JWT | 分页查询蜜罐列表(支持 type/status/keyword) |\n| POST | `/api/honeypots` | JWT | 创建新蜜罐 |\n| PUT | `/api/honeypots/<hp_id>` | JWT | 更新蜜罐配置 |\n| DELETE | `/api/honeypots/<hp_id>` | JWT | 删除蜜罐 |\n| POST | `/api/honeypots/<hp_id>/start` | JWT | 启动蜜罐进程 |\n| POST | `/api/honeypots/<hp_id>/stop` | JWT | 停止蜜罐进程 |\n| GET | `/api/honeypots/<hp_id>/health` | JWT | 蜜罐健康检查 |\n\n#### /api/logs — 日志审计\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/logs` | JWT | 分页查询日志(支持多字段过滤) |\n| GET | `/api/logs/export` | JWT | 导出日志为 CSV(含 BOM,支持 Excel) |\n| GET | `/api/logs/<log_id>` | JWT | 根据 ID 获取单条日志 |\n| GET | `/api/logs/attack-types` | JWT | 获取所有攻击类型枚举 |\n| GET | `/api/logs/threat-levels` | JWT | 获取所有威胁等级枚举 |\n| GET | `/api/logs/statistics` | JWT | 获取日志统计汇总 |\n| POST | `/api/logs/internal/upload` | 无 | **内部接口**:蜜罐进程上报攻击日志 |\n\n#### /api/malicious-ips — 恶意IP管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/malicious-ips` | JWT | 分页查询恶意IP(支持 is_blocked/threat_level/keyword) |\n| POST | `/api/malicious-ips/block` | JWT | 封禁指定IP(支持时长/截止时间) |\n| POST | `/api/malicious-ips/unblock` | JWT | 解封指定IP |\n\n#### /api/match-rules — 匹配规则引擎\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/match-rules` | JWT | 分页查询规则 |\n| GET | `/api/match-rules/<rule_id>` | JWT | 获取单条规则 |\n| POST | `/api/match-rules` | JWT | 创建规则(正则+威胁等级+自动封禁配置) |\n| PUT | `/api/match-rules/<rule_id>` | JWT | 更新规则 |\n| DELETE | `/api/match-rules/<rule_id>` | JWT | 删除规则 |\n| PUT | `/api/match-rules/<rule_id>/toggle` | JWT | 切换规则启用状态 |\n| GET | `/api/match-rules/attack-types` | JWT | 获取攻击类型枚举 |\n| GET | `/api/match-rules/threat-levels` | JWT | 获取威胁等级枚举 |\n\n#### /api/ai-config — AI大模型配置\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/ai-config/` | JWT | 获取所有AI配置 |\n| POST | `/api/ai-config/` | JWT | 创建AI配置(name/api_url/model_name必填) |\n| PUT | `/api/ai-config/<config_id>` | JWT | 更新AI配置 |\n| DELETE | `/api/ai-config/<config_id>` | JWT | 删除AI配置 |\n| POST | `/api/ai-config/<config_id>/activate` | JWT | 激活配置(设为当前使用) |\n| POST | `/api/ai-config/<config_id>/deactivate` | JWT | 禁用配置 |\n| POST | `/api/ai-config/<config_id>/test` | JWT | 测试AI配置连通性 |\n\n### 3. 数据库模型清单\n\n共 12 个 Model 文件,对应以下数据库表:\n\n| 模型文件 | 表名 | 说明 |\n| :--- | :--- | :--- |\n| `user_model.py` | `users` | 用户账号、密码哈希、角色(1管理员/2普通用户) |\n| `user_info_model.py` | `user_infos` | 用户扩展信息(手机号、邮箱、头像等) |\n| `permission_model.py` | `permissions` | 系统权限定义 |\n| `module_model.py` | `modules` / `user_modules` | 系统模块定义及用户-模块关联 |\n| `honeypot_model.py` | `honeypots` | 蜜罐配置(类型、端口、状态、`pid` 字段用于持久化进程) |\n| `log_model.py` | `logs` | 攻击日志记录(来源IP、载荷、威胁等级、协议等) |\n| `malicious_ip_model.py` | `malicious_ips` | 恶意IP列表(封禁状态、威胁等级、攻击次数) |\n| `block_history_model.py` | `block_history` | 封禁/解封操作历史记录 |\n| `attack_stats_model.py` | `attack_stats` | 攻击统计聚合数据(供 Dashboard 使用) |\n| `match_rule_model.py` | `match_rules` | 流量匹配规则(正则表达式、自动封禁、优先级) |\n| `ai_config_model.py` | `ai_configs` | AI大模型配置(API地址、模型名称、激活状态) |\n\n> **重要**:`honeypot_model.py` 中包含 `pid` 字段(Integer, nullable),用于在服务重启后通过 `psutil` 检查蜜罐子进程是否仍然存活。\n\n### 4. 蜜罐组件实现 (`backend/honeypots/`)\n\n| 文件 | 协议 | 默认端口 | 捕获目标 |\n| :--- | :--- | :--- | :--- |\n| `ftp_server.py` | FTP | 2121 | 爆破攻击、未授权访问、文件上传尝试 |\n| `ssh_server.py` | SSH | 2222 | 登录爆破、恶意命令执行(基于 Paramiko) |\n| `hikvision_http_server.py` | HTTP | 可配置(读取 `sys.argv[1]`) | IoT/摄像头设备漏洞探测、Web 攻击 |\n| `redis_server.py` | TCP/Redis | 6379 | Redis 未授权访问、SLAVEOF/CONFIG 命令利用 |\n| `mysql_server.py` | TCP/MySQL | 3306 | 数据库弱口令爆破(捕获用户名、客户端版本) |\n| `elasticsearch_server.py` | HTTP/ES | 9200 | 接口探测、数据查询、节点查询、恶意写入利用 |\n\n**蜜罐进程管理机制**:\n- 所有蜜罐以**独立子进程**方式启动(`subprocess.Popen`),与主 Flask 服务解耦。\n- 启动时将 PID 写入 `honeypots.pid` 数据库字段;停止时发送 `SIGTERM`/`taskkill`。\n- 服务重启后调用 `psutil.pid_exists()` 检查进程存活状态,自动修正数据库状态。\n- 蜜罐捕获到攻击后,通过 HTTP 调用 `/api/logs/internal/upload` 上报主服务。\n\n### 5. Agent 与智能响应模块 (`backend/agent/`)\n\n```\nagent/\n├── core.py # AI代理调度核心,支持多模型工作池、Queue+Threading异步队列\n├── llm_client.py # LLM客户端,封装 OpenAI 兼容 API 调用\n├── mcp/\n│ └── skill.py # MCP技能协议基类\n└── skills/\n ├── block_ip_skill.py # 自动封禁技能:先记录 malicious_ip 再调用防火墙封禁\n ├── decoder_skill.py # Base64/URL解码技能,辅助攻击载荷分析\n └── log_query_skill.py # 日志查询技能,供 AI Agent 检索历史攻击日志\n```\n\n**关键设计**:AI 分析通过 `Queue + Threading` 异步执行,不阻塞 HTTP 请求线程。\n\n### 6. 工具模块 (`backend/utils/`)\n\n| 文件 | 说明 |\n| :--- | :--- |\n| `api_response.py` | 统一 API 响应格式工具(`ApiResponse.success/error/bad_request` 等) |\n| `ip_utils.py` | **离线** IP 地理位置解析(MaxMind GeoLite2 MMDB),含 LRU 缓存 10000 条、私有 IP 判断 |\n| `time_utils.py` | 时间格式化工具函数 |\n| `download_geoip.py` | 自动下载/更新 GeoLite2 数据库脚本 |\n| `data/GeoLite2-City.mmdb` | 离线城市/国家地理数据库 |\n| `data/GeoLite2-ASN.mmdb` | 离线 ASN 自治系统数据库 |\n\n> **注意**:IP 溯源已从在线 `ip-api.com` 全面迁移至离线 MaxMind GeoLite2,无需外网访问。\n\n### 7. 前端视图清单 (`vueweb/vue-project/src/views/`)\n\n| 文件路径 | 功能说明 |\n| :--- | :--- |\n| `Dashboard.vue` | 仪表盘入口(路由容器) |\n| `dashboard/DashboardLayout.vue` | 数据大屏布局(导航 + 内容区) |\n| `dashboard/Overview.vue` | 攻击总览(总数、封禁数、实时告警) |\n| `dashboard/Trend.vue` | 攻击趋势折线图(按天/小时粒度) |\n| `dashboard/Types.vue` | 攻击类型饼图/柱状图分布 |\n| `dashboard/Map.vue` | 世界地图攻击来源热力图(ECharts) |\n| `HoneypotManagement.vue` | 蜜罐管理(CRUD、启停控制、健康状态监控) |\n| `LogQuery.vue` | 日志查询(多维度过滤、详情展示、CSV导出) |\n| `MaliciousIPManagement.vue` | 恶意IP管理(封禁/解封、威胁等级筛选) |\n| `MatchRuleManagement.vue` | 匹配规则管理(正则规则CRUD、启停切换) |\n| `AIConfigManagement.vue` | AI配置管理(多模型配置、激活/禁用、连通测试) |\n| `UserManagement.vue` | 用户管理(管理员):列表、增删改、模块权限分配 |\n| `UserProfile.vue` | 个人中心:查看/修改自己的手机、邮箱、密码 |\n\n**前端特性**:\n- 支持**暗黑/明亮**主题切换(持久化到 localStorage)。\n- 路由守卫:token 存在但 `user` 为空时,先 `await fetchCurrentUser()` 再放行,防止权限检查时序问题。\n- 所有 HTTP 请求通过 Axios 统一拦截器附加 `Authorization: Bearer <token>`。\n\n### 8. 后端初始化脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `init_database.py` | 创建所有数据库表(`db.create_all()`) |\n| `init_data.py` | 初始化基础数据(角色、权限) |\n| `init_modules.py` | 初始化系统功能模块数据 |\n| `init_permissions.py` | 初始化权限条目 |\n| `init_honeypot.py` | 初始化默认蜜罐配置 |\n| `config.py` | Flask 配置类(数据库URI、JWT密钥、CORS等) |\n| `app.py` | Flask 应用入口,注册所有蓝图 |\n\n### 9. 数据库迁移\n\n使用 Flask-Migrate(Alembic),迁移文件位于 `backend/migrations/versions/`。\n\n**已有迁移**:\n- `f1a2b3c4d5e6_add_pid_to_honeypots.py` — 为 `honeypots` 表新增 `pid` 字段,支持进程持久化重启检测。\n\n---\n\n## 八、WebSocket 实时推送架构\n\n### 1. 技术选型\n| 层 | 技术 | 版本 |\n| :--- | :--- | :--- |\n| 后端 | Flask-SocketIO | 5.3.6 |\n| 后端传输 | python-socketio + python-engineio | 5.10.0 / 4.8.2 |\n| 前端 | socket.io-client | 4.7.5 |\n\n### 2. 架构流程\n\n```\n蜜罐捕获攻击\n ↓ HTTP POST /api/logs/internal/upload\nlog_service.py · create_log()\n ├─ 规则匹配 (MatchRule)\n ├─ 写入 MySQL (Log)\n ├─ AI 分析任务入队\n ├─ 记录恶意 IP\n └─ [仅恶意流量] socketio.emit('new_attack', payload, namespace='/ws')\n ↓ WebSocket\n 前端 useSocket composable\n ↓\n ┌─────────────┼─────────────┐\n DashboardLayout.vue Overview.vue Map.vue\n (ElNotification弹窗 (数字跳动+ (地图红色\n + 高危横幅) 实时告警列表) 脉冲散点)\n```\n\n### 3. 关键文件\n\n| 文件 | 职责 |\n| :--- | :--- |\n| `backend/app.py` | 全局 `socketio = SocketIO()` 单例,`socketio.init_app(app, ...)` 初始化,`socketio.run()` 替代 `app.run()` |\n| `backend/service/log_service.py` | `create_log()` 末尾注入 `socketio.emit('new_attack', payload, namespace='/ws')` |\n| `frontend/src/composables/useSocket.ts` | 全局 Socket 单例管理,提供 `onAttack/offAttack` 订阅方法,引用计数自动管理连接生命周期 |\n| `frontend/src/views/dashboard/DashboardLayout.vue` | 订阅 `new_attack`,显示 `ElNotification` 弹窗 + 高危横幅(含滑入动画),菜单栏显示连接状态指示灯 |\n| `frontend/src/views/dashboard/Overview.vue` | 订阅 `new_attack`,数字跳动闪烁 + 实时告警列表(最多 10 条,列表滑入动画) |\n| `frontend/src/views/dashboard/Map.vue` | 订阅 `new_attack`,追加 `effectScatter` 脉冲散点到地图,5 秒后自动消失 |\n\n### 4. 推送事件规范\n\n**事件名**:`new_attack` \n**Namespace**:`/ws` \n**触发条件**:`is_malicious == True`(低危/正常流量不推送,减少噪声)\n\n**载荷字段**:\n```json\n{\n \"log_id\": 123,\n \"source_ip\": \"1.2.3.4\",\n \"attack_type\": \"SQL注入\",\n \"threat_level\": \"high\",\n \"protocol\": \"HTTP\",\n \"target_port\": 80,\n \"attack_time\": \"2026-03-27T10:30:00\",\n \"attack_description\": \"触发规则: SQL注入检测\"\n}\n```\n\n### 5. 后端重启说明\n\nWebSocket 需要使用 `socketio.run()` 替代 `app.run()`,已在 `app.py` 中完成更新。\n重启后端后 WebSocket 功能即生效,无需额外操作。\n\n---\n\n## 九、代码重载\n后端代码修改之后必须重新启动后端进程"}, "349587ccb49ff031672560df587671f763b99d78": {"t": 1785764223.8727663, "n": 15461, "h": "28c3ef7c6bf31862", "c": "# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n\n| 业务模块 | Route 文件 | Service 文件 | Model 文件 | 职责说明 |\n| :--- | :--- | :--- | :--- | :--- |\n| **User (用户权限)** | `user_route.py` | `user_service.py` | `user_model.py`, `user_info_model.py`, `permission_model.py`, `module_model.py` | 注册、登录、JWT鉴权、用户管理、模块权限分配 |\n| **Dashboard (数据大屏)** | `dashboard_route.py` | `dashboard_service.py` | `attack_stats_model.py` | 攻击趋势、类型分布、地图热力、总览统计(均需JWT) |\n| **Honeypot (蜜罐管理)** | `honeypot_route.py` | `honeypot_service.py` | `honeypot_model.py` | 蜜罐CRUD、进程启停、健康检查、PID持久化 |\n| **Log (日志审计)** | `log_route.py` | `log_service.py` | `log_model.py` | 日志查询、分页、导出CSV、内部上报(蜜罐使用) |\n| **Malicious IP (恶意拦截)** | `malicious_ip_route.py` | `malicious_ip_service.py` | `malicious_ip_model.py`, `block_history_model.py` | 恶意IP列表、封禁/解封、防火墙命令下发 |\n| **Match Rule (规则引擎)** | `match_rule_route.py` | `match_rule_service.py` | `match_rule_model.py` | 正则匹配规则管理、启停切换、自动封禁配置 |\n| **AI Config (大模型配置)** | `ai_config_route.py` | `ai_config_service.py`, `ai_analysis_service.py` | `ai_config_model.py` | LLM参数化配置、激活/禁用、连通性测试 |\n| **Test (测试接口)** | `test_route.py` | `test_service.py` | — | 内部功能测试,非生产接口 |\n\n### 2. 完整 API 端点清单\n\n#### /api/user — 用户管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| POST | `/api/user/register` | 无 | 用户注册 |\n| POST | `/api/user/login` | 无 | 用户登录,返回 JWT |\n| POST | `/api/user/create_admin` | 无 | 创建管理员(初始化用) |\n| GET | `/api/user/me` | JWT | 获取当前用户信息 |\n| PUT | `/api/user/me` | JWT | 更新当前用户信息(手机/邮箱/密码) |\n| GET | `/api/user/list` | JWT + 管理员 | 分页获取用户列表 |\n| POST | `/api/user/add` | JWT + 管理员 | 管理员新增用户 |\n| PUT | `/api/user/<user_id>` | JWT + 管理员 | 管理员修改用户 |\n| DELETE | `/api/user/<user_id>` | JWT + 管理员 | 管理员删除用户 |\n| GET | `/api/user/permissions` | JWT + 管理员 | 获取所有权限列表 |\n| GET | `/api/user/modules` | JWT | 获取所有模块列表 |\n\n#### /api/dashboard — 数据大屏\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/dashboard/trend` | JWT | 攻击趋势(支持 days/granularity 参数) |\n| GET | `/api/dashboard/types` | JWT | 攻击类型统计分布 |\n| GET | `/api/dashboard/map` | JWT | 攻击来源地图数据 |\n| GET | `/api/dashboard/summary` | JWT | 总览统计(总攻击数、封禁数等) |\n\n#### /api/honeypots — 蜜罐管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/honeypots` | JWT | 分页查询蜜罐列表(支持 type/status/keyword) |\n| POST | `/api/honeypots` | JWT | 创建新蜜罐 |\n| PUT | `/api/honeypots/<hp_id>` | JWT | 更新蜜罐配置 |\n| DELETE | `/api/honeypots/<hp_id>` | JWT | 删除蜜罐 |\n| POST | `/api/honeypots/<hp_id>/start` | JWT | 启动蜜罐进程 |\n| POST | `/api/honeypots/<hp_id>/stop` | JWT | 停止蜜罐进程 |\n| GET | `/api/honeypots/<hp_id>/health` | JWT | 蜜罐健康检查 |\n\n#### /api/logs — 日志审计\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/logs` | JWT | 分页查询日志(支持多字段过滤) |\n| GET | `/api/logs/export` | JWT | 导出日志为 CSV(含 BOM,支持 Excel) |\n| GET | `/api/logs/<log_id>` | JWT | 根据 ID 获取单条日志 |\n| GET | `/api/logs/attack-types` | JWT | 获取所有攻击类型枚举 |\n| GET | `/api/logs/threat-levels` | JWT | 获取所有威胁等级枚举 |\n| GET | `/api/logs/statistics` | JWT | 获取日志统计汇总 |\n| POST | `/api/logs/internal/upload` | 无 | **内部接口**:蜜罐进程上报攻击日志 |\n\n#### /api/malicious-ips — 恶意IP管理\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/malicious-ips` | JWT | 分页查询恶意IP(支持 is_blocked/threat_level/keyword) |\n| POST | `/api/malicious-ips/block` | JWT | 封禁指定IP(支持时长/截止时间) |\n| POST | `/api/malicious-ips/unblock` | JWT | 解封指定IP |\n\n#### /api/match-rules — 匹配规则引擎\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/match-rules` | JWT | 分页查询规则 |\n| GET | `/api/match-rules/<rule_id>` | JWT | 获取单条规则 |\n| POST | `/api/match-rules` | JWT | 创建规则(正则+威胁等级+自动封禁配置) |\n| PUT | `/api/match-rules/<rule_id>` | JWT | 更新规则 |\n| DELETE | `/api/match-rules/<rule_id>` | JWT | 删除规则 |\n| PUT | `/api/match-rules/<rule_id>/toggle` | JWT | 切换规则启用状态 |\n| GET | `/api/match-rules/attack-types` | JWT | 获取攻击类型枚举 |\n| GET | `/api/match-rules/threat-levels` | JWT | 获取威胁等级枚举 |\n\n#### /api/ai-config — AI大模型配置\n| 方法 | 路径 | 认证 | 说明 |\n| :--- | :--- | :--- | :--- |\n| GET | `/api/ai-config/` | JWT | 获取所有AI配置 |\n| POST | `/api/ai-config/` | JWT | 创建AI配置(name/api_url/model_name必填) |\n| PUT | `/api/ai-config/<config_id>` | JWT | 更新AI配置 |\n| DELETE | `/api/ai-config/<config_id>` | JWT | 删除AI配置 |\n| POST | `/api/ai-config/<config_id>/activate` | JWT | 激活配置(设为当前使用) |\n| POST | `/api/ai-config/<config_id>/deactivate` | JWT | 禁用配置 |\n| POST | `/api/ai-config/<config_id>/test` | JWT | 测试AI配置连通性 |\n\n### 3. 数据库模型清单\n\n共 12 个 Model 文件,对应以下数据库表:\n\n| 模型文件 | 表名 | 说明 |\n| :--- | :--- | :--- |\n| `user_model.py` | `users` | 用户账号、密码哈希、角色(1管理员/2普通用户) |\n| `user_info_model.py` | `user_infos` | 用户扩展信息(手机号、邮箱、头像等) |\n| `permission_model.py` | `permissions` | 系统权限定义 |\n| `module_model.py` | `modules` / `user_modules` | 系统模块定义及用户-模块关联 |\n| `honeypot_model.py` | `honeypots` | 蜜罐配置(类型、端口、状态、`pid` 字段用于持久化进程) |\n| `log_model.py` | `logs` | 攻击日志记录(来源IP、载荷、威胁等级、协议等) |\n| `malicious_ip_model.py` | `malicious_ips` | 恶意IP列表(封禁状态、威胁等级、攻击次数) |\n| `block_history_model.py` | `block_history` | 封禁/解封操作历史记录 |\n| `attack_stats_model.py` | `attack_stats` | 攻击统计聚合数据(供 Dashboard 使用) |\n| `match_rule_model.py` | `match_rules` | 流量匹配规则(正则表达式、自动封禁、优先级) |\n| `ai_config_model.py` | `ai_configs` | AI大模型配置(API地址、模型名称、激活状态) |\n\n> **重要**:`honeypot_model.py` 中包含 `pid` 字段(Integer, nullable),用于在服务重启后通过 `psutil` 检查蜜罐子进程是否仍然存活。\n\n### 4. 蜜罐组件实现 (`backend/honeypots/`)\n\n| 文件 | 协议 | 默认端口 | 捕获目标 |\n| :--- | :--- | :--- | :--- |\n| `ftp_server.py` | FTP | 2121 | 爆破攻击、未授权访问、文件上传尝试 |\n| `ssh_server.py` | SSH | 2222 | 登录爆破、恶意命令执行(基于 Paramiko) |\n| `hikvision_http_server.py` | HTTP | 可配置(读取 `sys.argv[1]`) | IoT/摄像头设备漏洞探测、Web 攻击 |\n| `redis_server.py` | TCP/Redis | 6379 | Redis 未授权访问、SLAVEOF/CONFIG 命令利用 |\n| `mysql_server.py` | TCP/MySQL | 3306 | 数据库弱口令爆破(捕获用户名、客户端版本) |\n| `elasticsearch_server.py` | HTTP/ES | 9200 | 接口探测、数据查询、节点查询、恶意写入利用 |\n\n**蜜罐进程管理机制**:\n- 所有蜜罐以**独立子进程**方式启动(`subprocess.Popen`),与主 Flask 服务解耦。\n- 启动时将 PID 写入 `honeypots.pid` 数据库字段;停止时发送 `SIGTERM`/`taskkill`。\n- 服务重启后调用 `psutil.pid_exists()` 检查进程存活状态,自动修正数据库状态。\n- 蜜罐捕获到攻击后,通过 HTTP 调用 `/api/logs/internal/upload` 上报主服务。\n\n### 5. Agent 与智能响应模块 (`backend/agent/`)\n\n```\nagent/\n├── core.py # AI代理调度核心,支持多模型工作池、Queue+Threading异步队列\n├── llm_client.py # LLM客户端,封装 OpenAI 兼容 API 调用\n├── mcp/\n│ └── skill.py # MCP技能协议基类\n└── skills/\n ├── block_ip_skill.py # 自动封禁技能:先记录 malicious_ip 再调用防火墙封禁\n ├── decoder_skill.py # Base64/URL解码技能,辅助攻击载荷分析\n └── log_query_skill.py # 日志查询技能,供 AI Agent 检索历史攻击日志\n```\n\n**关键设计**:AI 分析通过 `Queue + Threading` 异步执行,不阻塞 HTTP 请求线程。\n\n### 6. 工具模块 (`backend/utils/`)\n\n| 文件 | 说明 |\n| :--- | :--- |\n| `api_response.py` | 统一 API 响应格式工具(`ApiResponse.success/error/bad_request` 等) |\n| `ip_utils.py` | **离线** IP 地理位置解析(MaxMind GeoLite2 MMDB),含 LRU 缓存 10000 条、私有 IP 判断 |\n| `time_utils.py` | 时间格式化工具函数 |\n| `download_geoip.py` | 自动下载/更新 GeoLite2 数据库脚本 |\n| `data/GeoLite2-City.mmdb` | 离线城市/国家地理数据库 |\n| `data/GeoLite2-ASN.mmdb` | 离线 ASN 自治系统数据库 |\n\n> **注意**:IP 溯源已从在线 `ip-api.com` 全面迁移至离线 MaxMind GeoLite2,无需外网访问。\n\n### 7. 前端视图清单 (`vueweb/vue-project/src/views/`)\n\n| 文件路径 | 功能说明 |\n| :--- | :--- |\n| `Dashboard.vue` | 仪表盘入口(路由容器) |\n| `dashboard/DashboardLayout.vue` | 数据大屏布局(导航 + 内容区) |\n| `dashboard/Overview.vue` | 攻击总览(总数、封禁数、实时告警) |\n| `dashboard/Trend.vue` | 攻击趋势折线图(按天/小时粒度) |\n| `dashboard/Types.vue` | 攻击类型饼图/柱状图分布 |\n| `dashboard/Map.vue` | 世界地图攻击来源热力图(ECharts) |\n| `HoneypotManagement.vue` | 蜜罐管理(CRUD、启停控制、健康状态监控) |\n| `LogQuery.vue` | 日志查询(多维度过滤、详情展示、CSV导出) |\n| `MaliciousIPManagement.vue` | 恶意IP管理(封禁/解封、威胁等级筛选) |\n| `MatchRuleManagement.vue` | 匹配规则管理(正则规则CRUD、启停切换) |\n| `AIConfigManagement.vue` | AI配置管理(多模型配置、激活/禁用、连通测试) |\n| `UserManagement.vue` | 用户管理(管理员):列表、增删改、模块权限分配 |\n| `UserProfile.vue` | 个人中心:查看/修改自己的手机、邮箱、密码 |\n\n**前端特性**:\n- 支持**暗黑/明亮**主题切换(持久化到 localStorage)。\n- 路由守卫:token 存在但 `user` 为空时,先 `await fetchCurrentUser()` 再放行,防止权限检查时序问题。\n- 所有 HTTP 请求通过 Axios 统一拦截器附加 `Authorization: Bearer <token>`。\n\n### 8. 后端初始化脚本\n\n| 文件 | 用途 |\n| :--- | :--- |\n| `init_database.py` | 创建所有数据库表(`db.create_all()`) |\n| `init_data.py` | 初始化基础数据(角色、权限) |\n| `init_modules.py` | 初始化系统功能模块数据 |\n| `init_permissions.py` | 初始化权限条目 |\n| `init_honeypot.py` | 初始化默认蜜罐配置 |\n| `config.py` | Flask 配置类(数据库URI、JWT密钥、CORS等) |\n| `app.py` | Flask 应用入口,注册所有蓝图 |\n\n### 9. 数据库迁移\n\n使用 Flask-Migrate(Alembic),迁移文件位于 `backend/migrations/versions/`。\n\n**已有迁移**:\n- `f1a2b3c4d5e6_add_pid_to_honeypots.py` — 为 `honeypots` 表新增 `pid` 字段,支持进程持久化重启检测。\n\n---\n\n## 八、WebSocket 实时推送架构\n\n### 1. 技术选型\n| 层 | 技术 | 版本 |\n| :--- | :--- | :--- |\n| 后端 | Flask-SocketIO | 5.3.6 |\n| 后端传输 | python-socketio + python-engineio | 5.10.0 / 4.8.2 |\n| 前端 | socket.io-client | 4.7.5 |\n\n### 2. 架构流程\n\n```\n蜜罐捕获攻击\n ↓ HTTP POST /api/logs/internal/upload\nlog_service.py · create_log()\n ├─ 规则匹配 (MatchRule)\n ├─ 写入 MySQL (Log)\n ├─ AI 分析任务入队\n ├─ 记录恶意 IP\n └─ [仅恶意流量] socketio.emit('new_attack', payload, namespace='/ws')\n ↓ WebSocket\n 前端 useSocket composable\n ↓\n ┌─────────────┼─────────────┐\n DashboardLayout.vue Overview.vue Map.vue\n (ElNotification弹窗 (数字跳动+ (地图红色\n + 高危横幅) 实时告警列表) 脉冲散点)\n```\n\n### 3. 关键文件\n\n| 文件 | 职责 |\n| :--- | :--- |\n| `backend/app.py` | 全局 `socketio = SocketIO()` 单例,`socketio.init_app(app, ...)` 初始化,`socketio.run()` 替代 `app.run()` |\n| `backend/service/log_service.py` | `create_log()` 末尾注入 `socketio.emit('new_attack', payload, namespace='/ws')` |\n| `frontend/src/composables/useSocket.ts` | 全局 Socket 单例管理,提供 `onAttack/offAttack` 订阅方法,引用计数自动管理连接生命周期 |\n| `frontend/src/views/dashboard/DashboardLayout.vue` | 订阅 `new_attack`,显示 `ElNotification` 弹窗 + 高危横幅(含滑入动画),菜单栏显示连接状态指示灯 |\n| `frontend/src/views/dashboard/Overview.vue` | 订阅 `new_attack`,数字跳动闪烁 + 实时告警列表(最多 10 条,列表滑入动画) |\n| `frontend/src/views/dashboard/Map.vue` | 订阅 `new_attack`,追加 `effectScatter` 脉冲散点到地图,5 秒后自动消失 |\n\n### 4. 推送事件规范\n\n**事件名**:`new_attack` \n**Namespace**:`/ws` \n**触发条件**:`is_malicious == True`(低危/正常流量不推送,减少噪声)\n\n**载荷字段**:\n```json\n{\n \"log_id\": 123,\n \"source_ip\": \"1.2.3.4\",\n \"attack_type\": \"SQL注入\",\n \"threat_level\": \"high\",\n \"protocol\": \"HTTP\",\n \"target_port\": 80,\n \"attack_time\": \"2026-03-27T10:30:00\",\n \"attack_description\": \"触发规则: SQL注入检测\"\n}\n```\n\n### 5. 后端重启说明\n\nWebSocket 需要使用 `socketio.run()` 替代 `app.run()`,已在 `app.py` 中完成更新。\n重启后端后 WebSocket 功能即生效,无需额外操作。\n\n---\n\n## 九、代码重载\n后端代码修改之后必须重新启动后端进程"}, "81d093dbfc304a5df1cff16d74b7bfb5c9ae9ec8": {"t": 1785764228.2543685, "n": 6377, "h": "cd5a8087ad3be3ea", "c": "# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n\n## 七、现有模块与系统架构\n当前的后端服务架构已分为以下主要模块:\n\n### 1. 核心业务 API 模块 (Routes / Services / Models)\n- **User (用户权限)**:处理用户登录、认证与权限校验 (`user_route`, `user_service`, `user_model`, `user_info_model`, `permission_model`, `module_model`)\n- **Dashboard (数据大屏)**:展示实时攻击概览及统计数据 (`dashboard_route`, `dashboard_service`, `attack_stats_model`)\n- **Honeypot (蜜罐后台)**:管理蜜罐部署状态及节点信息 (`honeypot_route`, `honeypot_service`, `honeypot_model`)\n- **Log (日志审计)**:系统交互日志与攻击日志记录 (`log_route`, `log_service`, `log_model`)\n- **Malicious IP (恶意拦截)**:记录攻击源与下发封禁指令 (`malicious_ip_route`, `malicious_ip_service`, `malicious_ip_model`, `block_history_model`)\n- **Match Rule (规则引擎)**:管理预期的流量与攻击匹配特征 (`match_rule_route`, `match_rule_service`, `match_rule_model`)\n- **AI Config (大模型配置)**:LLM 接口的参数化配置与状态调用 (`ai_config_route`, `ai_config_service`, `ai_config_model`)\n\n### 2. 蜜罐组件实现 (`src/backend/honeypots/`)\n- `ftp_server.py`: 低交互 FTP 模拟器,主要针对爆破和未授权访问。\n- `ssh_server.py`: 低交互 SSH 模拟器,捕获登录尝试与恶意命令。\n- `hikvision_http_server.py`: 模拟海康威视等 IoT 设备的 Web 服务漏洞环境。\n\n### 3. Agent 与智能响应模块 (`src/backend/agent/`)\n- **Core Agent**: AI 代理调度核心。\n- **Skills**: 下游执行功能组件 (如 `block_ip_skill`, `decoder_skill`, `log_query_skill`)。\n\n\n## 八、代码重载\n后端代码修改之后必须重新启动后端进程"}, "6d43f0bba0c2d279c7e7a95177ba1ef6f9927415": {"t": 1785764230.4275913, "n": 5184, "h": "301b2cce31c301e3", "c": "# 项目开发规范 (Project Rules)\n\n你是一个资深的 Python 全栈专家,请在开发本 **基于低交互蜜罐的恶意流量检测和防御系统** 时严格遵循如下规则:\n\n## 一、核心开发原则\n- **代码质量**:严格遵循 **SOLID、DRY (Don't Repeat Yourself)、KISS (Keep It Simple, Stupid)** 原则。\n- **安全优先**:遵循 **OWASP Top 10** 安全最佳实践(特别是 SQL 注入防护、XSS 防护、敏感数据加密)。\n- **架构分层**:严格遵守 **Controller-Service-Model** 分层架构,禁止跨层调用。\n- **注释规范**:所有关键逻辑、类、方法必须包含 **中文注释** 和 **Docstrings**。\n- **类型安全**:Python 代码必须使用 Type Hints (`typing`),前端使用 TypeScript。\n\n---\n\n## 二、技术栈规范\n### 1. 后端 (Backend)\n- **语言**:Python 3.8+\n- **Web 框架**:Flask\n- **ORM**:SQLAlchemy\n- **数据库**:MySQL\n- **AI 模型**:Ollama (DeepSeek-R1) / OpenAI (远程调用) (也可通过 API 方式接入 OpenAI 等主流模型)\n- **依赖管理**:`requirements.txt` + `venv`\n\n### 2. 前端 (Frontend)\n- **框架**:Vue 3 (Composition API)\n- **语言**:TypeScript\n- **构建工具**:Vite\n- **UI 组件库**:Element Plus\n- **HTTP 客户端**:Axios\n\n---\n\n## 三、后端架构设计规范\n### 1. 分层职责\n| 层级 | 目录 | 职责 | 约束条件 |\n| :--- | :--- | :--- | :--- |\n| **Route (Controller)** | `src/route/` | 处理 HTTP 请求/响应,参数解析,权限校验 | - **禁止**包含复杂业务逻辑<br>- 仅调用 Service 层<br>- 返回统一的 JSON 格式 |\n| **Service** | `src/service/` | 核心业务逻辑,事务管理,第三方服务调用 | - **禁止**直接操作 SQL(需通过 Model/ORM)<br>- 处理异常并返回明确结果 |\n| **Model** | `src/model/` | 数据库模型定义,基础数据操作 | - 继承 `db.Model`<br>- 定义表结构、关系及基础 CRUD 方法 |\n| **Utils** | `src/utils/` | 通用工具函数 | - 无状态,纯函数为主 |\n\n### 2. 代码示例规范\n\n#### (1) Model 层 (`src/model/user_model.py`)\n```python\nfrom database import db\nfrom datetime import datetime\n\nclass User(db.Model):\n \"\"\"\n 用户模型类\n \"\"\"\n __tablename__ = 'users'\n \n id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')\n # 密码必须存储哈希值,禁止明文\n password_hash = db.Column(db.String(128), nullable=False, comment='密码哈希')\n created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')\n\n def to_dict(self):\n return {\n 'id': self.id,\n 'username': self.username,\n 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')\n }\n```\n\n#### (2) Service 层 (`src/service/user_service.py`)\n```python\nfrom model.user_model import User\nfrom database import db\nfrom typing import Dict, Optional\n\nclass UserService:\n \"\"\"\n 用户服务类:处理用户注册、登录等逻辑\n \"\"\"\n \n @staticmethod\n def create_user(username: str, password_plain: str) -> Dict:\n \"\"\"\n 创建新用户\n \n Args:\n username (str): 用户名\n password_plain (str): 明文密码\n \n Returns:\n Dict: 操作结果\n \"\"\"\n # 1. 校验是否存在\n if User.query.filter_by(username=username).first():\n return {'success': False, 'message': '用户已存在'}\n \n # 2. 密码加密 (示例,实际应使用加盐哈希)\n # password_hash = generate_password_hash(password_plain) \n \n # 3. 入库\n new_user = User(username=username, password_hash='hashed_value')\n try:\n db.session.add(new_user)\n db.session.commit()\n return {'success': True, 'message': '注册成功', 'data': new_user.to_dict()}\n except Exception as e:\n db.session.rollback()\n return {'success': False, 'message': str(e)}\n```\n\n#### (3) Route 层 (`src/route/user_route.py`)\n```python\nfrom flask import Blueprint, request, jsonify\nfrom service.user_service import UserService\n\nuser_bp = Blueprint('user', __name__, url_prefix='/api/user')\n\n@user_bp.route('/register', methods=['POST'])\ndef register():\n data = request.json\n username = data.get('username')\n password = data.get('password')\n \n if not username or not password:\n return jsonify({'code': 400, 'msg': '参数缺失'}), 400\n \n result = UserService.create_user(username, password)\n \n if result['success']:\n return jsonify({'code': 200, 'msg': '成功', 'data': result['data']})\n else:\n return jsonify({'code': 500, 'msg': result['message']}), 500\n```\n\n---\n\n## 四、前端开发规范\n### 1. 组件风格\n- 使用 **Vue 3 Composition API** (`<script setup lang=\"ts\">`)。\n- 严格遵循 **ESLint** 和 **Prettier** 格式化规则。\n\n### 2. 代码示例 (`src/views/Login.vue`)\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage } from 'element-plus'\n\nconst username = ref('')\nconst password = ref('')\nconst userStore = useUserStore()\n\nconst handleLogin = async () => {\n if (!username.value || !password.value) {\n ElMessage.warning('请输入用户名和密码')\n return\n }\n \n try {\n await userStore.login(username.value, password.value)\n ElMessage.success('登录成功')\n } catch (error) {\n ElMessage.error('登录失败: ' + error.message)\n }\n}\n</script>\n\n<template>\n <div class=\"login-container\">\n <el-input v-model=\"username\" placeholder=\"用户名\" />\n <el-input v-model=\"password\" type=\"password\" placeholder=\"密码\" />\n <el-button type=\"primary\" @click=\"handleLogin\">登录</el-button>\n </div>\n</template>\n```\n\n---\n\n## 五、通用规范\n1. **异常处理**:后端必须捕获所有未处理异常,防止服务崩溃,并记录错误日志。\n2. **日志记录**:关键操作(登录、攻击检测、封禁)必须写入日志文件或数据库。\n3. **环境配置**:敏感信息(数据库密码、API Key)禁止硬编码,需使用环境变量或配置文件。\n4. **Git 提交**:Commit Message 需清晰描述变更内容(如 `feat: 添加恶意IP自动封禁功能`)。\n\n## 六、特殊业务规则\n1. **蜜罐管理**:蜜罐进程需独立管理,确保主服务崩溃不影响蜜罐运行。\n2. **AI 分析**:大模型调用需使用异步队列(如 Queue + Threading),避免阻塞 HTTP 请求。\n3. **IP 封禁**:调用底层防火墙命令(iptables/netsh)时需进行操作系统判断和权限校验。\n"}}}}