gptupcn.com

安全审查是 GPT‑6 Astra 很适合参与、但绝不能“完全交给模型”的领域。原因很简单:安全问题通常需要跨文件理解数据流、权限、输入边界和状态,这正是强推理模型的优势;但安全又属于高风险工程,最终结论必须依靠代码、配置、测试和专业验证。

所以这篇文章讲的是一种更稳妥的模式:用 ChatGPT Pro + GPT‑6 Astra + Codex 扩大安全审查覆盖面,而不是把模型当自动安全认证工具。

一、第一步永远是画攻击面

假设一个 Web API 有:

/login
/users/{id}
/files/upload
/admin/export
/webhooks/payment

不要马上让模型“找漏洞”,先问:谁可以调用?输入来自哪里?数据流到哪里?是否访问文件系统?是否调用外部 URL?是否修改权限?是否处理秘密?

可以先建立表:

EndpointAuthHigh-risk inputSide effect
/loginnocredentialssession
/files/uploaduserfilestorage
/admin/exportadminfilterssensitive data
/webhooks/paymentsignatureJSONbilling state

这一步的意义是把安全审查从“凭感觉扫代码”变成“按攻击面逐层验证”。

二、认证和授权必须分开

系统确认“你是谁”是认证,确认“你能做什么”是授权。

危险代码:

@app.get("/admin/export")
def export(user):
    if user.email.endswith("@company.com"):
        return export_all()

更合理的是统一权限模型:

def require_permission(user, permission: str) -> None:
    if permission not in user.permissions:
        raise PermissionDenied()

路由层:

require_permission(
    current_user,
    "admin.export",
)

这样权限规则可测试、可审计,也更方便 Codex 搜索所有授权入口。

三、对象级授权最容易被漏掉

GET /api/orders/1001

用户登录了,不代表他有权访问 1001。

order = repo.get(order_id)

if order.user_id != current_user.id:
    raise PermissionDenied()

测试:

def test_user_cannot_read_other_order(client):
    response = client.get(
        "/api/orders/other-users-order"
    )

    assert response.status_code in {403, 404}

让 Codex 审查权限时,可以明确要求:不仅检查“是否登录”,还要检查“对象是否属于当前主体”“主体是否属于当前 Workspace”“管理员权限是否跨租户”。

四、让 GPT‑6 Astra 按数据流审查

泛化提示:

帮我看看有没有安全问题。

通常会得到很多通用建议。

更好的提示:

审查当前认证模块。
不要做泛化安全建议。

跟踪以下数据:
- password
- access token
- refresh token
- user_id

对每种数据回答:
1. 从哪里进入;
2. 在哪里存储;
3. 经过哪些函数;
4. 是否进入日志;
5. 是否可能返回客户端;
6. 权限在哪里验证。

每个结论给文件路径。

这种数据流提示更容易让 Astra 发挥跨文件推理能力。

五、文件上传是典型高风险边界

不要只检查后缀:

if filename.endswith(".png"):
    save(file)

至少要考虑:文件大小、MIME、真实内容、文件名、路径穿越、存储位置、后续解析器、公开访问策略。

路径最好由服务器生成:

from uuid import uuid4

safe_name = uuid4().hex
target = upload_root / safe_name

而不是:

target = upload_root / user_filename

如果业务必须保留原文件名,可以把原名当元数据保存,而不是直接作为磁盘路径。

六、SSRF 风险需要特别检查外部 URL

如果系统允许:

requests.get(user_url)

就应该把它视为高风险位置。需要考虑 localhost、内网地址、云 metadata、重定向、DNS 解析和协议限制。

不要依赖这种判断:

if "localhost" not in url:
    fetch(url)

这不是可靠防护。生产方案通常需要严格 allowlist、受控代理或网络层限制。

GPT‑6 Astra 可以帮助枚举绕过方式,但最终边界应该由确定性代码和网络策略控制。

七、SQL 注入审查不能只看字符串拼接

危险:

sql = f"SELECT * FROM users WHERE email = '{email}'"

更适合:

cursor.execute(
    "SELECT * FROM users WHERE email = %s",
    (email,),
)

但安全 Review 不能止步于“值参数化”。还要检查:排序字段是否动态拼接?表名是否用户可控?LIMIT 是否受限?批量查询是否可能导致资源耗尽?查询结果是否存在越权?

八、秘密管理:不要让秘密进入不必要的上下文

仓库至少忽略:

.env
*.pem
secrets/

Codex 任务中可以明确:

不要读取或输出 .env、密钥文件、token。
如果测试需要凭据,使用 mock。

同时要真正限制运行权限。Prompt 里的“不要读秘密”不是安全边界,文件系统权限、沙箱和凭据隔离才是。

九、日志也可能泄露敏感信息

危险:

logger.info("headers=%s", request.headers)
logger.info("payload=%s", payload)

可能包含 Authorization、Cookie、email、phone、token、支付元数据。

更适合:

logger.info(
    "request_failed",
    extra={
        "request_id": request_id,
        "route": route,
        "status": status,
    },
)

日志只记录诊断所需信息。对 AI 工具也是一样:只提供任务需要的字段。

十、Webhook 要验证“谁发送的”以及“是否重复”

支付 Webhook 常见两个问题:签名验证和幂等。

def handle_event(event):
    if processed_repo.exists(event.id):
        return

    with transaction():
        apply_event(event)
        processed_repo.insert(event.id)

即使签名合法,同一个事件也可能被多次投递。Codex 做 Review 时,不仅要找“有没有验签”,也要找“重试时会不会重复执行副作用”。

十一、权限安全要大量写负向测试

不仅测试:

管理员可以导出。

还要测试:普通用户不能导出、未登录不能导出、被禁用管理员不能导出、跨 Workspace 管理员不能导出。

def test_workspace_admin_cannot_export_other_workspace(
    client,
    admin_a,
    workspace_b,
):
    response = client.get(
        f"/workspaces/{workspace_b.id}/export",
        headers=auth(admin_a),
    )

    assert response.status_code == 403

权限安全往往就是由这些“不能做什么”的测试保证。

十二、依赖风险要结合项目真实使用

扫描工具可能报告:

package X 存在 high severity vulnerability

接下来要判断:版本是否受影响?项目是否调用受影响功能?漏洞是否可从外部触发?是否已有补丁?升级是否 breaking?

可以让 Codex 先找真实 import 和调用位置,再让 GPT‑6 Astra 分析上下文。这样比只复制扫描报告更有价值。

十三、不要让 AI 自动“修所有安全问题”

安全修复经常改变行为,例如缩紧 CORS、改变 Cookie 属性、修改 Token 生命周期、关闭旧 API、提高密码要求。

更合理的流程:

第一轮只审查
→ 第二轮分类
→ 第三轮逐项修复
→ 每项单独测试

高风险修改保留人工批准。

十四、把安全规则写进 AGENTS.md

# Security Rules

- never print secrets
- never weaken auth tests
- object-level authorization is required
- user-controlled URLs are high risk
- file paths must not be directly derived from user input
- SQL values must use parameters
- production security changes require approval

Review priority:
1. auth
2. authorization
3. data exposure
4. injection
5. SSRF
6. file handling
7. secrets

这会让 Codex 的日常修改更持续地关注安全边界。

十五、发现问题后先证明,再修复

如果发现“普通用户可能访问管理员导出”,第一步先写失败测试:

def test_normal_user_cannot_export(client):
    response = client.get(
        "/admin/export",
        headers=normal_user_headers(),
    )

    assert response.status_code == 403

确认当前测试失败,再修实现,最后测试变绿。这比模型说“权限漏洞已修复”更有意义。

十六、安全结论最好分级

可以分成:

Confirmed:已有代码路径和可复现证据
Likely:有明确危险模式,但还需要验证触发条件
Check:值得检查,但证据不足

只有第一类适合直接进入“已确认漏洞”列表,其余必须保留不确定性。这能减少模型因为语言自信而造成的误导。

十七、为什么安全审查型工作更适合 Pro 重度使用

安全 Review 通常要同时阅读路由、中间件、权限、数据库、配置、部署、依赖、测试和日志,是典型的大上下文、跨文件任务。

GPT‑6 Astra 可以帮助做复杂关联,Codex 可以在仓库中查找真实调用,Pro 则更适合高频重复这种工作。Plus 也能完成不少安全学习与单次审查,但如果安全 Review 已经成为每天的开发流程,Pro 的完整 Work/Codex Astra allowance 更容易产生实际价值。

需要强调:Pro 或 Astra 都不会把代码自动变成“安全认证通过”。它们是工程辅助工具,不是第三方安全审计证明。

十八、一个可复用的安全 Review Prompt

审查当前 PR 的安全影响。

只基于仓库证据,重点检查:
1. authentication
2. object-level authorization
3. data exposure
4. secrets
5. SQL/query construction
6. file paths and uploads
7. user-controlled URLs
8. webhook idempotency
9. missing negative tests

每个问题给:
- 文件位置
- 可触发条件
- 影响
- 证据等级
- 最小验证方法

不要把通用最佳实践直接写成已确认漏洞。

结语

GPT‑6 Astra + Codex 在安全工程里最有价值的地方,是帮助开发者更快地看到复杂数据流与跨文件风险,而不是给系统盖一个“AI 检查通过”的章。

更成熟的工作方式是:Astra 扩大推理覆盖,Codex 搜集仓库证据并修改,扫描工具做确定性检测,测试证明边界,人工批准高风险改动。

对于每天都维护生产代码、需要频繁安全 Review 的开发者,这类长期工作流也更容易体现 ChatGPT Pro 的价值。

官方参考资料

  • OpenAI Help:ChatGPT Work and Codex
    https://help.openai.com/en/articles/20001275
  • OpenAI Help:GPT‑5.6 and GPT‑6 Pro in ChatGPT
    https://help.openai.com/en/articles/20001354-gpt-56-and-gpt-6-pro-in-chatgpt
  • OpenAI Release Notes:Introducing GPT‑6 Astra
    https://openai.com/products/release-notes/
  • OpenAI Developers:GPT‑6 Astra
    https://developers.openai.com/api/docs/models/gpt-6-astra

十九、进阶实践:把权限模型做成测试矩阵

复杂系统中,权限不是一个 is_admin 就能表达。可以把主体、资源和操作做成矩阵:

role: owner / admin / member / guest
resource: own_workspace / other_workspace
operation: read / update / delete / export

然后生成明确的允许表。GPT‑6 Astra 可以帮助识别缺少的组合,Codex 再把关键组合写成参数化测试:

@pytest.mark.parametrize(
    "role,operation,allowed",
    [
        ("owner", "export", True),
        ("admin", "export", True),
        ("member", "export", False),
        ("guest", "export", False),
    ],
)
def test_export_permission(role, operation, allowed):
    ...

权限规则一旦进入测试,就比散落在自然语言文档里更不容易被后续 AI 修改破坏。

二十、安全 Review 要检查“默认失败方式”

安全系统更适合 fail closed。比如权限服务异常时:

try:
    allowed = permission_service.check(user, resource)
except PermissionServiceError:
    allowed = True

这是非常危险的默认。更合理通常是拒绝请求并记录故障,除非业务有明确的降级模型。

同样,签名验证失败、Token 解析异常、策略服务超时,都不应该因为“为了可用性”自动放行。可以让 Astra 单独搜索 fallback、except 和默认值,找出是否存在意外的 fail open 路径。

二十一、AI 安全审查输出本身也要最小化敏感信息

如果模型发现某个日志里包含完整 Token,最终报告不应该把 Token 原样复制出来。可以只记录字段名、文件路径和掩码示例:

发现 Authorization header 被记录:src/middleware/logging.py:42
示例值:Bearer ****

安全报告本身也可能成为新的敏感数据载体。Codex 和团队在保存 Review 结果时,同样要遵守最小披露原则。

二十二、会话与 Token 生命周期要单独画出来

很多认证 Bug 不是登录接口本身,而是刷新、撤销和多设备场景。可以画:

login → access token → refresh → rotate → revoke → logout

然后逐步问:Access Token 多久过期?Refresh Token 是否轮换?旧 Refresh Token 被再次使用时怎么处理?用户修改密码后现有会话是否失效?管理员封禁用户后 Token 是否还能继续访问?

GPT‑6 Astra 很适合把这些状态组合列出来,Codex 可以去仓库中找真实实现和缺失测试。最终应把关键生命周期行为写成测试,而不是相信一张流程图已经代表代码。

二十三、速率限制和资源滥用也属于安全边界

接口没有注入漏洞,不代表没有安全风险。登录、验证码、密码重置、导出、文件处理和昂贵搜索都可能被高频调用。需要根据业务设计:单用户限制、单 IP 限制、并发限制、队列、最大返回量和超时。

例如导出接口如果允许任意 limit:

GET /export?limit=999999999

即使权限正确,也可能导致内存或数据库压力。程序应该有硬上限:

limit = min(requested_limit, 10_000)

并且大任务最好转异步。让 Astra 做安全 Review 时,可以增加“资源消耗与滥用”维度,而不只盯着传统 OWASP 漏洞名称。

二十四、错误信息要兼顾调试与最小披露

对客户端返回:

SQLSTATE 23505: users_email_key ...

可能泄露数据库结构。更适合对外返回稳定错误码,对内日志使用 request id 关联详细异常:

{"code":"conflict","request_id":"req_123"}

安全审查时要找“异常对象是否直接序列化给用户”“堆栈是否暴露”“内部文件路径是否返回”。Codex 可以批量定位这些模式,GPT‑6 Astra 再帮助区分真正外部可见的路径和只在开发环境使用的日志。

二十五、补充:安全修复也要考虑兼容与回滚

安全问题通常希望尽快修,但“快”不等于不做发布设计。例如突然缩短 Token 生命周期,可能让大量用户同时重新登录;立刻收紧上传规则,可能阻断合法业务文件;修改 CORS 或 Cookie SameSite,也可能影响已有前端流程。

因此安全修复可以同时准备:复现测试、修复测试、影响范围、灰度方式、监控指标和必要的回滚条件。GPT‑6 Astra 可以帮助列出兼容风险,Codex 可以实现最小修改并运行测试,但是否立即全量发布仍应由负责人结合漏洞严重程度和业务影响决定。这种“安全性与可用性一起评估”的方式,比让模型看到漏洞后直接大改整个认证模块更可靠。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐