---
name: security-rules
description: "团队强制性安全红线规则。适用于所有开发语言、所有文件的修改任务，拦截高风险安全隐患。"
globs: ["*"]
alwaysApply: true
updated: 2026-05-22
---

# 团队强制性安全红线规则

> [!IMPORTANT]
> 本规则为团队最高级别安全红线。无论您是在进行前端、后端还是运维脚本的编写与修改，AI 助手在提出代码变更建议时必须无条件严格遵循以下条款。

## 1. 凭据与敏感信息防泄漏 (Secret Leakage Prevention)

- **严禁硬编码**：绝对禁止在任何代码、配置文件、临时脚本或注释中硬编码 API Key、密匙、Token、数据库连接串、私钥（如 SSH Key）等敏感凭证。
- **配置外置**：所有外部服务凭据必须通过环境变量（例如 `process.env.*`、`os.environ.get()`）、保密管理系统（如 Vault、AWS Secrets Manager）或安全的配置文件（且该配置文件已加入 `.gitignore`）进行读取。
- **防呆拦截**：如果您（AI 助手）在修改的代码行中发现疑似高风险的硬编码明文密钥（例如匹配到类似 `api_key = "AIzaSy..."`、`password = "123456"` ），**必须立即中断生成**，并在回复中以显眼警告提醒人类开发者进行人工安全脱敏。

---

## 2. 生产高危操作防御 (Dangerous Operations Prevention)

- **危险系统指令防御**：
  - 严禁在脚本或代码中引入未经人工确认的具有破坏性的系统命令，如无保护的 `rm -rf`、`dd`、`mkfs`。
  - 在生成包含 Shell 执行的命令时，必须默认进行安全防御性参数配置（如 `rm` 时必须配合特定的安全路径校验，防止拼接空字符串导致根目录被删）。
- **高危 SQL/DDL 变更**：
  - 在生成涉及数据库 Schema 变更（DDL，如 `DROP TABLE`、`ALTER TABLE`）或大规模数据更新（DML）的迁移脚本时，必须主动附带备份和分批执行建议。
  - 严禁拼接不安全的 SQL 语句。所有数据库交互必须默认使用**参数化查询**或团队指定的 ORM 防御 SQL 注入。

---

## 3. 数据隐私与脱敏红线 (Data Privacy & Desensitization)

- **用户敏感数据脱敏**：
  - 绝对禁止在日志（Log）中打印或向第三方服务发送未脱敏的用户个人身份信息（PII，如身份证号、真实姓名、手机号、密码哈希、交易凭证、邮箱地址等）。
  - 所有面向用户的错误提示（Error Messages）必须进行友好化处理，**严禁向前端或客户端暴露敏感的系统底层调用栈（Stack Trace）、数据库表结构、或云服务内网 IP**。

---

## 4. 安全对比示例

### ❌ 错误示例（硬编码凭据与不安全日志）

```python
# 违反规则 1：明文暴露 API Key
client = ThirdPartyAPI(api_key="sk-live-5a2e9b8c7f3d")

# 违反规则 3：裸打印异常调用栈，且在日志中直接打印了明文的用户手机号
try:
    process_payment(user_phone="13800138000")
except Exception as e:
    logger.error(f"Payment failed for 13800138000: {e}", exc_info=True)
    raise e
```

###  正确方向（配置外置与安全脱敏）

```python
import os

# 遵循规则 1：从环境变量中安全读取 API Key，防泄漏
api_key = os.environ.get("THIRD_PARTY_API_KEY")
if not api_key:
    raise ValueError("Missing critical configuration: THIRD_PARTY_API_KEY")
client = ThirdPartyAPI(api_key=api_key)

# 遵循规则 3：对日志中的敏感字段进行脱敏，避免暴露系统调用细节给终端用户
try:
    # 手机号脱敏处理后再写入日志
    masked_phone = "138****8000"
    process_payment(user_phone="13800138000")
except Exception as exc:
    logger.error("Payment transaction failed for phone %s. Please check billing dashboard.", masked_phone)
    # 不向终端用户抛出内部具体调用栈
    raise PaymentProcessingError("支付交易失败，请稍后重试或联系客服。") from exc
```
