跳转到主要内容
当你的应用把代码送进一个模型——审查它、补全它,或通过智能体 运行它——时,你希望模型被警告高风险部分,并在同一遍中阻止 工作区泄露密钥。代码安全防护栏正是这样做:它在上游模型看到 一个 token 之前,对请求运行你的代码安全规则。 这是一个专注的落地页。完整的防护栏引擎——规则类型、阶段、解析、 测试沙箱——请见防护栏参考防护栏概览

1. 代码安全防护栏实际做什么

OrcaRouter 提供了一个你从模板选择器应用的 code_security 预设家族。每一个都是一条普通的防护栏 规则——工作区级别、有序、可绑定到任意密钥——针对代码做了调优:

.env / Secret-File Block

.env 风格的密钥赋值(DATABASE_URL=AWS_SECRET_ACCESS_KEY=API_TOKEN=…)和粘贴的多行配置转储 到达提供商之前拦截它们。依据赋值语法,而不是值。

License Compliance (copyleft)

Flag 携带强 copyleft 头的请求——GPL / AGPL / LGPL / SSPL SPDX 标签或完整许可证名称——以便审查者可以确认该代码可以安全地 混入一个宽松许可的代码库。仅 flag。

GPL/AGPL Provenance (output)

在携带 copyleft 来源签名的模型建议上的输出阶段 flag——一个 标记,表明模型可能把 copyleft 训练数据回吐进了生成的代码。

Insecure-API Advisory

当提示词引用一个高风险 sink——eval( / exec( / os.system( / subprocess.run( / pickle.loads( / child_process.exec(——时, 用一条安全警示annotate提示词。非拦截。
前三个复用你已经知道的动作——blockflag。Insecure-API Advisory 使用 annotate:它不拒绝或脱敏请求,而是用一条模型 在回答前读取的注释增强它。同样的原语驱动 CVE/SBOM 装饰(见下文)。
code_security 预设是确定性的——纯正则,无网络调用,在热路径上 安全。联网的扫描器(CVE 查询、SBOM、SAST)是单独的外部连接, 而不是预设。参见 §3

2. Annotate——在不改变流量的情况下警告模型

你在防护栏上配置的动作是 block(拒绝调用,HTTP 400)、 mask(脱敏匹配项)和 flag(仅记录)。代码安全在底层增加了 第四种行为:annotate,它既不拦截也不脱敏。当一条 annotate 规则匹配时,网关记录一条简短的注释,中继把它作为一条系统警示 注入上游——因此模型在它回答之前被告知,例如,“this request references a high-risk API (code eval, shell execution, or unsafe deserialization); prefer safer alternatives”。用户的文本从不被 拒绝,也从不被改写。

一个具体示例

Insecure-API Advisory 预设应用到一个防护栏并把它绑定到 一个密钥。然后发送调用一个危险 sink 的代码:
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [
      {"role": "user",
       "content": "Refactor this: result = eval(user_supplied_expr)"}
    ]
  }'
请求原封不动地通过——相同的内容,相同的模型——但网关在前面 加上一条模型先读到的安全警示。补全返回时被引导向参数化 API 和 输入验证,你的应用中没有代码改动,也没有第二次往返。
Annotate 与其他动作组合。单个防护栏可以mask一个密钥 annotate同一个请求——在一遍中文本被脱敏并添加了一条注释。

3. 通过外部扫描器进行 CVE 和 SBOM 装饰

警示原语可以泛化。把一个代码安全扫描器作为 外部供应商连接,它的 发现就沿着同样的 annotate 路径流转:
从请求文本中提取导入和清单 pin,并将它们与公开的 OSV 漏洞 数据库交叉引用。一次命中会用例如 “requests@2.0.0 has CVE-2014-1830 (HIGH). Fixed in 2.20.0.” 装饰提示词——因此模型 被告知它被要求使用的一个包中的一个已知漏洞。免费且免鉴权, 因此没有 API-key 字段。默认为 annotate;你可以改为把它 设为 flag 或 block。
像连接任何外部供应商一样连接一个 SBOM(软件物料清单)或 SAST (静态分析)扫描器——一个 base URL 加凭证,加密存储并在读取 时屏蔽。每个发现都带有一个稳定的身份,因此一个你已经分诊过的 发现不会在每个请求上重新触发。
外部扫描器遵循与每条高级规则相同的 fail-open 默认值:一次 扫描器错误或超时会被记录为遥测,请求继续。在漏掉一次扫描不可 接受的策略上,把规则的 fail_open 设为 false 以故障关闭。

4. 与密钥和许可证规则配对

代码安全防护栏很少单独运行。常见形态是一个带几条规则的防护栏:
目标规则
阻止粘贴的凭证.env / Secret-File Block(block
捕获内联密钥值Secrets Blockerblock
把关 copyleft 代码License Compliance(flag
引导危险 sinkInsecure-API Advisory(annotate
把它们全部添加到一个命名策略,把它绑定到你的编码智能体的密钥, 每个请求都会被筛查——对明确的违规 block,对需要判断的情况 annotate,对其余的 flag 以供审查。
被拦截的请求返回 HTTP 400 guardrail_blocked 并且不消耗 配额——输入阶段拦截在计量之前触发。它也被标记为 skip-retry, 因此针对另一个通道重新运行同一个提示词只会再次拦截。参见 guardrail-blocked 错误

5. 配置它(控制台 + 角色)

这里的一切都在控制台中配置,而不是通过中继密钥。管理路由 (/api/guardrail/*)用你的会话 / 访问令牌鉴权,而不是 sk- 中继密钥。读取——列出防护栏和 Matches 信息流——对每个工作区 成员开放。写入(创建 / 编辑 / 删除)以及测试沙箱需要 Developer 角色或以上:沙箱可以触发付费模型调用和出站供应商 请求,因此它像写入一样被门控。
1

创建防护栏

在控制台中打开 Guardrails → New guardrail。分裂按钮会把你 带入模板库——选择一个 Code security 预设作为你的起点。
2

自由编辑

预设是种子,而不是锁。调优正则、添加一条 Secrets Blocker 规则、更改一个动作。在你把它绑定到密钥之前,用 Test 标签页 针对样本文本证明一条规则如你所期望地触发。
3

绑定一个密钥

在一个 API 密钥上设置防护栏(guardrail_id),或将它标记为 工作区默认值。绑定关系存在于网关的密钥上,因此编辑防护栏会 在下一次调用时切换每个绑定的密钥。
发现落入工作区 Matches 信息流(规则类型、动作、阶段、详情)。 匹配的子串在开启 Log raw content 时才记录——默认关闭, 隐私保守的姿态。参见 日志与隐私

6. 接下来去哪里

  • 拦截密钥——在请求参数中 捕获凭证的配套规则。
  • 动作——深入介绍 block、mask、 flag、annotate 和 spotlight。
  • 合规日志记录器——为 每个代码安全发现保留一份不可变记录。
  • 测试与 eval——在你上线之前 证明你的策略能捕获已知的坏代码。
  • 防护栏参考——完整引擎。
  • 保护 AI 智能体——代码 安全防护栏在零信任控制栈中的位置。