feat: 初始化 ProStock 项目基础结构和配置
- 添加项目规则文档(开发规范、安全规则、配置管理) - 实现数据模块核心功能(API 客户端、限流器、存储管理、配置加载) - 添加 .gitignore 和 .kilocodeignore 配置 - 配置环境变量模板 - 编写 daily 模块单元测试
This commit is contained in:
72
.kilocode/rules/project_rules.md
Normal file
72
.kilocode/rules/project_rules.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# ProStock 项目规则
|
||||
|
||||
本项目使用 Kilo Code 规则系统来确保代码质量和一致性。
|
||||
|
||||
## 项目概述
|
||||
|
||||
- **项目名称**: ProStock
|
||||
- **主要语言**: Python
|
||||
- **框架**: 待定
|
||||
- **代码目录**: `src/`
|
||||
- **配置目录**: `config/`
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. **代码质量**: 所有代码必须符合 Python PEP 8 编码规范
|
||||
2. **类型提示**: 建议为公共函数和类添加类型注解
|
||||
3. **文档字符串**: 使用 Google 风格的 docstring
|
||||
4. **测试覆盖**: 关键业务逻辑应有对应的单元测试
|
||||
|
||||
## 目录结构规范
|
||||
|
||||
```
|
||||
project/
|
||||
├── src/ # 源代码主目录
|
||||
├── config/ # 配置文件目录(禁止直接读取)
|
||||
├── docs/ # 文档目录
|
||||
├── tests/ # 测试目录
|
||||
├── .kilocode/ # Kilo Code 配置
|
||||
│ └── rules/ # 规则文件
|
||||
├── requirements.txt # 依赖管理
|
||||
└── README.md # 项目说明
|
||||
```
|
||||
|
||||
## 文件命名规范
|
||||
|
||||
- **Python 文件**: 使用小写下划线命名法 (`snake_case.py`)
|
||||
- **配置文件**: 使用小写下划线命名法 (`config_settings.py`)
|
||||
- **测试文件**: 使用 `test_` 前缀 (`test_example.py`)
|
||||
- **常量文件**: 使用 `constants_` 前缀 (`constants_sizes.py`)
|
||||
|
||||
## 代码组织
|
||||
|
||||
- 每个 Python 模块应尽可能保持简洁,职责单一
|
||||
- 避免在 `__init__.py` 中放置过多逻辑
|
||||
- 使用相对导入 (`from .module import ...`) 而非绝对导入
|
||||
- 配置应集中管理,避免硬编码
|
||||
|
||||
## 导入顺序规范
|
||||
|
||||
```python
|
||||
# 1. 标准库导入
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
# 2. 第三方库导入
|
||||
import pandas as pd
|
||||
from flask import Flask
|
||||
|
||||
# 3. 本地应用导入
|
||||
from src.config.settings import Settings
|
||||
from src.models.user import User
|
||||
```
|
||||
|
||||
## 提交前检查
|
||||
|
||||
在提交代码前,请确保:
|
||||
- [ ] 所有代码通过类型检查(如使用 mypy)
|
||||
- [ ] 代码格式符合规范(使用 black/isort)
|
||||
- [ ] 没有未使用的导入或变量
|
||||
- [ ] 关键功能有对应的测试
|
||||
- [ ] 文档已更新(如需要)
|
||||
325
.kilocode/rules/python-development-guidelines.md
Normal file
325
.kilocode/rules/python-development-guidelines.md
Normal file
@@ -0,0 +1,325 @@
|
||||
# Python 开发规范
|
||||
|
||||
## 1 代码风格规范
|
||||
|
||||
### 1.1 缩进与空格
|
||||
- 使用 **4个空格** 进行缩进(禁止使用Tab)
|
||||
- 每行代码最大长度限制为 **120字符**
|
||||
- 二元运算符前后使用空格(链式赋值除外)
|
||||
- 函数参数周围空格一致
|
||||
|
||||
```python
|
||||
# 正确示例
|
||||
def calculate_total_price(price: float, tax_rate: float) -> float:
|
||||
total = price * (1 + tax_rate)
|
||||
return round(total, 2)
|
||||
|
||||
# 错误示例
|
||||
def calculate_total_price(price:float,tax_rate:float)->float:
|
||||
total=price*(1+tax_rate)
|
||||
return round(total,2)
|
||||
```
|
||||
|
||||
### 1.2 导入规范
|
||||
- 导入位于文件顶部,位于模块注释和文档字符串之后
|
||||
- 标准库导入放在最前面,其次是第三方库,最后是本地应用模块
|
||||
- 使用绝对导入,禁止使用通配符导入(`from module import *`)
|
||||
- 每组导入之间保留一个空行
|
||||
|
||||
```python
|
||||
# 标准库
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
# 第三方库
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from pydantic import BaseModel
|
||||
|
||||
# 本地模块
|
||||
from src.config import settings
|
||||
from src.utils.logger import get_logger
|
||||
```
|
||||
|
||||
### 1.3 命名规范
|
||||
|
||||
| 类型 | 规范 | 示例 |
|
||||
|------|------|------|
|
||||
| 模块 | 全小写,下划线分隔 | `data_processor.py` |
|
||||
| 包 | 全小写,禁止下划线 | `src/utils` |
|
||||
| 类 | PascalCase,首字母大写 | `UserAccount`, `DataValidator` |
|
||||
| 函数 | snake_case,全小写 | `get_user_data()`, `calculate_total()` |
|
||||
| 变量 | snake_case,全小写 | `user_name`, `total_count` |
|
||||
| 常量 | UPPER_SNAKE_CASE | `MAX_RETRY_COUNT`, `DEFAULT_TIMEOUT` |
|
||||
| 私有方法/变量 | 单下划线前缀 | `_internal_method()`, `_private_var` |
|
||||
| 类型变量 | PascalCase | `UserType`, `T = TypeVar('T')` |
|
||||
|
||||
### 1.4 注释规范
|
||||
- 使用英文注释,禁止使用中文注释
|
||||
- 复杂逻辑必须添加注释说明意图
|
||||
- 注释与代码同步更新,禁止过时注释
|
||||
|
||||
```python
|
||||
# 单行注释(与代码同行时,注释前保留2个空格)
|
||||
def process_data(data: list) -> dict: # Process input data and return statistics
|
||||
pass
|
||||
|
||||
# 多行文档字符串(Google风格)
|
||||
def calculate_metrics(values: list[float]) -> dict[str, float]:
|
||||
"""Calculate statistical metrics for a list of values.
|
||||
|
||||
Args:
|
||||
values: List of numeric values to analyze
|
||||
|
||||
Returns:
|
||||
Dictionary containing mean, median, and standard deviation
|
||||
|
||||
Raises:
|
||||
ValueError: If input list is empty
|
||||
"""
|
||||
pass
|
||||
```
|
||||
|
||||
## 2 架构设计规范
|
||||
|
||||
### 2.1 模块结构
|
||||
```
|
||||
src/
|
||||
├── core/ # 核心业务逻辑
|
||||
├── modules/ # 功能模块
|
||||
├── utils/ # 工具函数
|
||||
├── config/ # 配置管理
|
||||
├── services/ # 服务层
|
||||
├── models/ # 数据模型
|
||||
├── repositories/ # 数据访问层
|
||||
└── schemas/ # Pydantic模型
|
||||
```
|
||||
|
||||
### 2.2 依赖原则
|
||||
- **依赖倒置**:高层模块不依赖低层模块,两者都依赖抽象
|
||||
- **禁止循环依赖**:模块间引用必须形成有向无环图
|
||||
- **单一职责**:每个类/模块只负责一项职责
|
||||
|
||||
```python
|
||||
# 错误示例:高内聚低耦合违反
|
||||
class UserService:
|
||||
def __init__(self, db_connection, email_sender, cache_manager):
|
||||
pass
|
||||
|
||||
# 正确示例:通过抽象接口解耦
|
||||
class UserService:
|
||||
def __init__(self, user_repository: IUserRepository):
|
||||
self.repository = user_repository
|
||||
```
|
||||
|
||||
### 2.3 函数设计
|
||||
- **单一职责**:每个函数只做一件事
|
||||
- **参数控制**:函数参数不超过5个,超过则使用对象封装
|
||||
- **返回值明确**:返回类型必须注解
|
||||
|
||||
```python
|
||||
# 错误示例:函数职责过多
|
||||
def process_user_registration(name, email, password, send_email, create_session):
|
||||
if send_email:
|
||||
send_verification_email(email)
|
||||
if create_session:
|
||||
create_user_session(email)
|
||||
return save_user(name, email, password)
|
||||
|
||||
# 正确示例:单一职责拆分
|
||||
class UserRegistrationService:
|
||||
def register(self, user_data: UserCreateDto) -> User:
|
||||
user = self._validate_and_create_user(user_data)
|
||||
self._send_verification_email(user)
|
||||
self._create_session(user)
|
||||
return user
|
||||
|
||||
def _validate_and_create_user(self, data: UserCreateDto) -> User:
|
||||
pass
|
||||
|
||||
def _send_verification_email(self, user: User) -> None:
|
||||
pass
|
||||
```
|
||||
|
||||
## 3 配置管理规范
|
||||
|
||||
### 3.1 禁止硬编码
|
||||
**所有关键配置必须外置,禁止在代码中硬编码**
|
||||
|
||||
| 类型 | 必须外置的配置 |
|
||||
|------|----------------|
|
||||
| 数据库连接 | HOST, PORT, USER, PASSWORD, DATABASE |
|
||||
| API密钥 | SECRET_KEY, API_KEY |
|
||||
| 外部服务 | ENDPOINT, TIMEOUT, RETRY_COUNT |
|
||||
| 业务参数 | MAX_RETRIES, CACHE_TTL, RATE_LIMIT |
|
||||
|
||||
### 3.2 配置目录结构
|
||||
```
|
||||
config/
|
||||
├── .env.example # 环境变量模板(不包含敏感信息)
|
||||
├── .env.local # 本地环境配置(被.gitignore忽略)
|
||||
├── config.yaml # 通用配置
|
||||
├── config.development.yaml # 开发环境配置
|
||||
├── config.production.yaml # 生产环境配置
|
||||
└── config.test.yaml # 测试环境配置
|
||||
```
|
||||
|
||||
### 3.3 配置加载示例
|
||||
```python
|
||||
# src/config/settings.py
|
||||
from pydantic_settings import BaseSettings
|
||||
from functools import lru_cache
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
"""应用配置类,从环境变量加载"""
|
||||
|
||||
# 数据库配置
|
||||
database_host: str = "localhost"
|
||||
database_port: int = 5432
|
||||
database_name: str = "prostock"
|
||||
database_user: str
|
||||
database_password: str
|
||||
|
||||
# API配置
|
||||
api_key: str
|
||||
secret_key: str
|
||||
jwt_algorithm: str = "HS256"
|
||||
access_token_expire_minutes: int = 30
|
||||
|
||||
# Redis配置
|
||||
redis_host: str = "localhost"
|
||||
redis_port: int = 6379
|
||||
|
||||
class Config:
|
||||
env_file = ".env.local"
|
||||
env_file_encoding = "utf-8"
|
||||
|
||||
|
||||
@lru_cache()
|
||||
def get_settings() -> Settings:
|
||||
"""获取配置单例"""
|
||||
return Settings()
|
||||
```
|
||||
|
||||
### 3.4 .env.example 模板
|
||||
```bash
|
||||
# ===========================================
|
||||
# ProStock 环境变量配置模板
|
||||
# 复制此文件为 .env.local 并填入实际值
|
||||
# ===========================================
|
||||
|
||||
# 数据库配置
|
||||
DATABASE_HOST=localhost
|
||||
DATABASE_PORT=5432
|
||||
DATABASE_NAME=prostock
|
||||
DATABASE_USER=your_username
|
||||
DATABASE_PASSWORD=your_password
|
||||
|
||||
# API密钥配置
|
||||
API_KEY=your_api_key
|
||||
SECRET_KEY=your_secret_key_here
|
||||
|
||||
# Redis配置(可选)
|
||||
REDIS_HOST=localhost
|
||||
REDIS_PORT=6379
|
||||
```
|
||||
|
||||
## 4 错误处理规范
|
||||
|
||||
### 4.1 异常分类
|
||||
```python
|
||||
# src/core/exceptions.py
|
||||
class BaseCustomException(Exception):
|
||||
"""基础异常类"""
|
||||
status_code: int = 500
|
||||
detail: str = "An unexpected error occurred"
|
||||
|
||||
def __init__(self, detail: str = None):
|
||||
self.detail = detail or self.detail
|
||||
super().__init__(self.detail)
|
||||
|
||||
|
||||
class ValidationError(BaseCustomException):
|
||||
"""数据验证异常"""
|
||||
status_code = 422
|
||||
detail = "Validation error"
|
||||
|
||||
|
||||
class AuthenticationError(BaseCustomException):
|
||||
"""认证异常"""
|
||||
status_code = 401
|
||||
detail = "Authentication required"
|
||||
|
||||
|
||||
class AuthorizationError(BaseCustomException):
|
||||
"""授权异常"""
|
||||
status_code = 403
|
||||
detail = "Permission denied"
|
||||
|
||||
|
||||
class NotFoundError(BaseCustomException):
|
||||
"""资源不存在"""
|
||||
status_code = 404
|
||||
detail = "Resource not found"
|
||||
```
|
||||
|
||||
### 4.2 错误处理原则
|
||||
- 向上层传递有意义的信息
|
||||
- 记录详细日志(不含敏感信息)
|
||||
- 区分可恢复和不可恢复错误
|
||||
|
||||
## 5 测试规范
|
||||
|
||||
### 5.1 测试要求
|
||||
- 所有核心功能必须有单元测试
|
||||
- 关键业务逻辑测试覆盖率不低于80%
|
||||
- 使用 `pytest` 作为测试框架
|
||||
- 使用 `pytest-cov` 生成覆盖率报告
|
||||
|
||||
### 5.2 测试文件结构
|
||||
```
|
||||
tests/
|
||||
├── conftest.py # 共享fixtures
|
||||
├── unit/ # 单元测试
|
||||
│ ├── test_models.py
|
||||
│ ├── test_services.py
|
||||
│ └── test_utils.py
|
||||
├── integration/ # 集成测试
|
||||
│ └── test_api.py
|
||||
└── fixtures/ # 测试数据
|
||||
```
|
||||
|
||||
## 6 Git提交规范
|
||||
|
||||
### 6.1 提交信息格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
<body>
|
||||
|
||||
<footer>
|
||||
```
|
||||
|
||||
### 6.2 类型标识
|
||||
| 类型 | 说明 |
|
||||
|------|------|
|
||||
| feat | 新功能 |
|
||||
| fix | Bug修复 |
|
||||
| docs | 文档更新 |
|
||||
| style | 代码格式调整 |
|
||||
| refactor | 重构 |
|
||||
| test | 测试相关 |
|
||||
| chore | 构建/辅助工具 |
|
||||
|
||||
## 7 代码审查清单
|
||||
|
||||
- [ ] 代码符合PEP 8规范
|
||||
- [ ] 关键配置未硬编码
|
||||
- [ ] 函数/类添加了类型注解
|
||||
- [ ] 复杂逻辑有注释说明
|
||||
- [ ] 单元测试覆盖关键逻辑
|
||||
- [ ] 无循环依赖
|
||||
- [ ] 命名符合规范
|
||||
- [ ] 日志不包含敏感信息
|
||||
271
.kilocode/rules/security_rules.md
Normal file
271
.kilocode/rules/security_rules.md
Normal file
@@ -0,0 +1,271 @@
|
||||
# 安全与访问控制规则
|
||||
|
||||
本文件定义了项目的安全约束和访问控制规则。
|
||||
|
||||
## 🔒 禁止访问配置文件
|
||||
|
||||
### 核心约束
|
||||
|
||||
**严禁在编码过程中访问根目录下的 `config` 目录下的任何文件**。这包括:
|
||||
|
||||
1. **禁止读取** - 不得使用任何方式读取 `config/` 目录下的文件
|
||||
2. **禁止编辑** - 不得修改 `config/` 目录下的配置文件
|
||||
3. **禁止查看** - 不得阅读 `config/` 目录下的文件内容
|
||||
4. **禁止搜索** - 不得在 `config/` 目录下进行任何搜索操作
|
||||
5. **禁止执行** - 不得在 `config/` 目录下执行任何命令
|
||||
|
||||
所有配置读取必须通过集中管理的配置模块(`src/config/`)进行。**`config/` 与 `src/config/` 是完全不同的目录,前者受保护,后者是配置模块代码目录**。
|
||||
|
||||
### 目录结构说明
|
||||
|
||||
```
|
||||
ProStock/
|
||||
├── config/ # 受保护的配置文件目录(禁止任何访问)
|
||||
│ ├── .env.example # 环境变量模板
|
||||
│ ├── .env.local # 本地环境配置(敏感)
|
||||
│ ├── config.yaml # 通用配置
|
||||
│ └── ...
|
||||
├── src/config/ # 配置模块代码目录(仅限模块内部访问)
|
||||
│ ├── __init__.py
|
||||
│ ├── settings.py # 配置加载逻辑
|
||||
│ └── ...
|
||||
└── ...
|
||||
```
|
||||
|
||||
### 受限制工具完整列表
|
||||
|
||||
所有以下工具均**严格禁止**访问 `config/` 目录:
|
||||
|
||||
| 工具类别 | 受限制工具 | 禁止操作 |
|
||||
|---------|-----------|---------|
|
||||
| 文件读取 | `read_file` | 读取 `config/` 目录下任何文件 |
|
||||
| 文件读取 | `list_files` | 列出 `config/` 目录内容 |
|
||||
| 文件编辑 | `edit_file` | 编辑 `config/` 目录下任何文件 |
|
||||
| 文件编辑 | `search_and_replace` | 替换 `config/` 目录下文件内容 |
|
||||
| 文件编辑 | `write_to_file` | 写入 `config/` 目录(新建或覆盖) |
|
||||
| 文件编辑 | `delete_file` | 删除 `config/` 目录下任何文件 |
|
||||
| 搜索工具 | `search_files` | 在 `config/` 目录下进行正则搜索 |
|
||||
| 命令执行 | `execute_command` | 执行任何涉及 `config/` 目录的命令 |
|
||||
| 代码模式 | 所有代码写入操作 | 向 `config/` 目录写入代码或配置 |
|
||||
|
||||
### 违禁行为完整列表 ❌
|
||||
|
||||
```python
|
||||
# 禁止:直接读取 .env 文件
|
||||
import dotenv
|
||||
dotenv.load_dotenv('config/.env') # 禁止!
|
||||
|
||||
# 禁止:直接读取配置文件
|
||||
with open('config/settings.json', 'r') as f: # 禁止!
|
||||
config = json.load(f)
|
||||
|
||||
# 禁止:硬编码配置路径
|
||||
config_path = os.path.join('config', 'database.yml') # 禁止!
|
||||
|
||||
# 禁止:使用 read_file 工具查看 config 文件
|
||||
read_file(path='config/.env') # 禁止!
|
||||
|
||||
# 禁止:使用 edit_file/search_and_replace 编辑 config 文件
|
||||
edit_file(path='config/settings.py', ...) # 禁止!
|
||||
|
||||
# 禁止:使用 search_files 搜索 config 目录
|
||||
search_files(path='config', regex='.*') # 禁止!
|
||||
|
||||
# 禁止:使用 list_files 列出 config 目录
|
||||
list_files(path='config', recursive=True) # 禁止!
|
||||
|
||||
# 禁止:使用 write_to_file 创建或修改 config 文件
|
||||
write_to_file(path='config/custom.py', ...) # 禁止!
|
||||
|
||||
# 禁止:使用 delete_file 删除 config 文件
|
||||
delete_file(path='config/old.env') # 禁止!
|
||||
|
||||
# 禁止:Python 文件系统操作
|
||||
import os
|
||||
os.listdir('config') # 禁止!
|
||||
os.path.exists('config/.env') # 禁止!
|
||||
os.path.isfile('config/settings.yaml') # 禁止!
|
||||
os.walk('config') # 禁止!
|
||||
|
||||
# 禁止:pathlib 操作
|
||||
from pathlib import Path
|
||||
Path('config/.env').read_text() # 禁止!
|
||||
Path('config').iterdir() # 禁止!
|
||||
|
||||
# 禁止:glob 模式匹配
|
||||
import glob
|
||||
glob.glob('config/**/*') # 禁止!
|
||||
glob.iglob('config/*.yaml') # 禁止!
|
||||
|
||||
# 禁止:shutil 操作
|
||||
import shutil
|
||||
shutil.copy('config/.env', 'backup/') # 禁止!
|
||||
```
|
||||
|
||||
### 违禁命令执行 ❌
|
||||
|
||||
```bash
|
||||
# 禁止:进入 config 目录
|
||||
cd config # 禁止!
|
||||
|
||||
# 禁止:列出 config 目录
|
||||
ls config/ # 禁止!
|
||||
dir config # 禁止!
|
||||
|
||||
# 禁止:读取 config 文件
|
||||
cat config/.env # 禁止!
|
||||
type config\.env # 禁止!
|
||||
|
||||
# 禁止:搜索 config 目录
|
||||
grep -r "SECRET" config/ # 禁止!
|
||||
|
||||
# 禁止:任何 config 目录相关命令
|
||||
find config -name "*.py" # 禁止!
|
||||
```
|
||||
|
||||
### 合规行为 ✅
|
||||
|
||||
```python
|
||||
# 正确:使用配置管理模块
|
||||
from src.config.settings import Settings
|
||||
settings = Settings()
|
||||
db_config = settings.database
|
||||
|
||||
# 正确:配置模块内部处理
|
||||
from src.config import get_config
|
||||
config = get_config()
|
||||
```
|
||||
|
||||
### 配置文件保护规则
|
||||
|
||||
1. **`config` 目录**:根目录下的 `config/` 目录**完全受保护**,禁止任何工具访问
|
||||
2. **`src/config` 目录**:配置模块代码目录,仅限 `src/config/` 内部代码访问
|
||||
3. **敏感文件**:`.env` 文件必须添加到 `.gitignore`
|
||||
4. **配置加载**:必须在应用启动时一次性加载,而非在运行时多次读取
|
||||
5. **工具调用限制**:所有工具调用必须验证目标路径不包含 `config/` 前缀
|
||||
|
||||
## 🔐 敏感信息处理
|
||||
|
||||
### 禁止的行为
|
||||
|
||||
```python
|
||||
# 禁止:在代码中硬编码密钥
|
||||
API_KEY = "sk-1234567890abcdef" # 禁止!
|
||||
|
||||
# 禁止:打印敏感信息
|
||||
print(f"Password: {password}") # 禁止!
|
||||
|
||||
# 禁止:将密钥写入日志
|
||||
logger.debug(f"API Key: {api_key}") # 禁止!
|
||||
```
|
||||
|
||||
### 合规做法
|
||||
|
||||
```python
|
||||
# 正确:从环境变量获取
|
||||
import os
|
||||
API_KEY = os.environ.get('API_KEY')
|
||||
|
||||
# 正确:使用配置管理
|
||||
from src.config.settings import Settings
|
||||
settings = Settings()
|
||||
api_key = settings.api_key
|
||||
```
|
||||
|
||||
## 🛡️ 安全最佳实践
|
||||
|
||||
### 输入验证
|
||||
|
||||
- 所有外部输入必须经过验证和清理
|
||||
- 使用参数化查询防止 SQL 注入
|
||||
- 对用户输入进行适当的转义和过滤
|
||||
|
||||
### 依赖安全
|
||||
|
||||
- 定期更新依赖包以修复安全漏洞
|
||||
- 使用 `pip audit` 或 `safety` 检查依赖
|
||||
- 避免使用已知存在安全问题的包
|
||||
|
||||
### 日志规范
|
||||
|
||||
- **禁止** 记录敏感信息(密码、密钥、令牌等)
|
||||
- **禁止** 记录完整的用户数据(考虑脱敏)
|
||||
- **建议** 记录操作类型、用户ID(不含敏感字段)、时间戳
|
||||
|
||||
### 错误处理
|
||||
|
||||
- 禁止向用户暴露详细的错误堆栈
|
||||
- 敏感错误应记录到安全日志,而非返回给客户端
|
||||
- 使用通用的错误消息对外展示
|
||||
|
||||
## ⚠️ 违规处理
|
||||
|
||||
### 自动检测机制
|
||||
|
||||
1. **提交前扫描**:使用 Git hooks 自动扫描提交内容
|
||||
2. **CI/CD 流水线检测**:在持续集成流程中运行安全扫描
|
||||
3. **静态代码分析**:集成静态分析工具检测违规模式
|
||||
4. **工具调用监控**:监控所有工具调用是否涉及 `config/` 目录
|
||||
|
||||
### 惩罚机制
|
||||
|
||||
违反上述规则将导致:
|
||||
|
||||
1. **代码审查不通过**:提交将被自动拒绝
|
||||
2. **安全扫描工具报警**:触发安全警报通知
|
||||
3. **安全漏洞评级**:标记为高优先级安全漏洞
|
||||
4. **构建阻断**:CI/CD 流水线自动失败
|
||||
5. **审计日志记录**:记录违规行为用于审计追踪
|
||||
|
||||
### 违规严重程度分类
|
||||
|
||||
| 等级 | 违规类型 | 处罚措施 |
|
||||
|------|---------|---------|
|
||||
| 严重 | 故意读取敏感配置文件(如 `.env`) | 代码审查拒绝、团队通知 |
|
||||
| 高 | 使用工具访问 `config/` 目录 | 代码审查拒绝、要求整改 |
|
||||
| 中 | 在代码中硬编码配置路径 | 要求修改、代码审查标记 |
|
||||
| 低 | 潜在风险操作(需人工审核) | 代码审查提醒 |
|
||||
|
||||
## 📋 规则检查清单
|
||||
|
||||
### 提交前检查
|
||||
|
||||
- [ ] 没有使用任何工具访问 `config/` 目录
|
||||
- [ ] 没有硬编码的 `config/` 目录路径
|
||||
- [ ] 配置文件仅通过配置模块访问
|
||||
- [ ] 没有硬编码的敏感信息
|
||||
- [ ] 敏感信息从环境变量或安全存储获取
|
||||
- [ ] 日志不包含敏感数据
|
||||
- [ ] 错误处理不暴露敏感信息
|
||||
|
||||
### 工具调用检查
|
||||
|
||||
- [ ] `read_file` 未调用 `config/` 目录
|
||||
- [ ] `edit_file` 未指向 `config/` 目录
|
||||
- [ ] `write_to_file` 未写入 `config/` 目录
|
||||
- [ ] `delete_file` 未删除 `config/` 目录
|
||||
- [ ] `search_files` 未搜索 `config/` 目录
|
||||
- [ ] `list_files` 未列出 `config/` 目录
|
||||
- [ ] `execute_command` 未涉及 `config/` 路径
|
||||
|
||||
## 🔧 合规验证脚本
|
||||
|
||||
为确保规则得到遵守,可使用以下验证方法:
|
||||
|
||||
```bash
|
||||
# 检查是否有访问 config 目录的代码
|
||||
grep -r "config/\." --include="*.py" src/ tests/ docs/
|
||||
|
||||
# 检查工具调用中的 config 路径
|
||||
grep -rn "path='config" --include="*.py"
|
||||
|
||||
# 检查是否有 .env 文件被提交
|
||||
git ls-files | grep "^config/.env"
|
||||
```
|
||||
|
||||
## 📝 培训与文档
|
||||
|
||||
1. **新成员培训**:入职时必须学习本安全规则
|
||||
2. **定期审计**:每月进行一次安全规则执行情况审计
|
||||
3. **规则更新**:安全规则随项目演进定期更新
|
||||
4. **违规通报**:定期通报违规案例以提高安全意识
|
||||
Reference in New Issue
Block a user