AI 构建应用安全检查清单:上线前需要检查什么
在真实用户使用你用 AI 构建的应用之前,请检查七件事:每个页面和 API 都要确认用户身份以及其权限;密钥只能存放在服务器上,绝不能出现在浏览器或聊天中;所有输入都要在服务器端验证;每个用户只能访问自己的记录;登录和高成本的接口要做速率限制;依赖项保持最新;出现问题时你能够恢复数据。下面的清单把每一项都转化为具体的测试,无需阅读代码即可完成。
AI 应用构建工具擅长让功能跑起来,但它们不会自动变得谨慎,因为提示词里很少会提到“谨慎”。下面大多数问题都源于没人要求的事情,因此通常的解决办法就是去要求它。
如何使用这份清单
按顺序逐项完成,每一项都要做两件事:让 AI 确认已经处理,并且自己亲自测试。AI 可以写出权限检查,但只有测试才能证明它有效。各项标记如下:
- 必做 —— 在任何其他人使用应用之前完成。
- 应做 —— 在拥有真实用户或真实数据之前完成。
- 以后再做 —— 随着应用成长值得去做。
如果你只有一个小时,请完成所有必做项。
1. 身份验证:这个人是谁?
身份验证是确认某人身份的过程,通常就是登录。基础知识参见什么是身份验证,登录方案的选择参见如何为应用添加登录功能。
- 必做: 每个显示私人数据的页面都需要登录。测试方法:退出登录,然后把某个私人页面的 URL 直接粘贴到浏览器中。
- 必做: 这些页面背后的每个 API 端点也需要登录,而不只是页面本身。测试方法:退出登录,打开浏览器的网络面板,然后重试一个你登录时应用发出的请求。
- 必做: 密码必须使用慢速的密码哈希算法进行哈希存储,绝不能明文保存。OWASP 的密码存储指南首推 Argon2id,scrypt、bcrypt 或 PBKDF2 可作为替代。请询问:“密码是如何存储的?”
- 应做: 密码重置链接会过期,并且只能使用一次。
- 应做: 会话 Cookie 标记为
Secure、HttpOnly和SameSite,退出登录时在服务器端结束会话。 - 以后再做: 提供双因素身份验证,或使用支持该功能的第三方登录服务。
检查每个返回用户数据的 API 路由和页面。每一个都必须在服务器端拒绝未登录用户的请求,而不能只靠页面代码。列出你检查过的路由。
2. 授权:他们被允许做什么?
授权是登录之后的一步:决定该用户可以查看和修改什么。AI 构建的应用最常在这里出现严重漏洞,因为应用看起来没问题:每个用户的仪表盘只显示自己的数据,但服务器只要被直接请求,就会把任何人的数据交出来。
- 必做: 每一次读取、更新和删除,都要在服务器端检查该记录是否属于当前用户(或其团队)。
- 必做: 进行测试:创建两个账户 A 和 B。以 A 的身份打开 A 的某条记录,记下 URL 或网络请求中的 ID。再以 B 的身份登录,请求同一个 ID。B 必须得到错误,而不能看到 A 的数据。
- 必做: 管理员页面和管理员 API 端点要在服务器端检查用户角色。隐藏管理员链接并不是保护。
- 必做: 用户不能通过修改请求来更改自己的角色、价格、余额或所有者字段。测试方法:在网络面板中查看一次资料更新发送了什么。如果其中包含
role或isAdmin之类的字段,请让 AI 忽略来自客户端的这些字段。 - 应做: URL 中的 ID 应难以猜测(使用随机 ID,而不是 1、2、3)。这并不能替代权限检查,但在权限检查缺失时可以限制损失。
对每个读取或修改记录的端点,在服务器端检查已登录用户是否拥有该记录或有权访问它。如果没有,返回 404。然后向我展示你会如何用两个账户来测试这一点。
3. 数据库中的行级访问控制
“行级访问控制”指的是表中的每一行(例如一条预订、一张发票)只对与之相关的用户可见。常见的实现方式有两种:
| 方式 | 工作原理 | 需要注意 |
|---|---|---|
| 在服务器代码中 | 每条查询都包含过滤条件,例如“所有者是当前用户” | 一个遗漏的过滤条件就会暴露全部数据 |
| 在数据库中(例如 Postgres 的行级安全) | 数据库本身会拒绝用户无权查看的行 | 设置更复杂;服务器必须以正确的用户身份连接 |
两种方式都可以做好。关键在于:
- 必做: 如果浏览器直接与数据库通信(某些托管数据库产品允许这样做),则每张表都必须启用行级规则。否则,任何持有公开密钥的人都能读取整张表。
- 必做: 查询应按当前用户或团队过滤,而不是按浏览器发送的 ID 过滤。
- 应做: 共享数据(例如团队的项目)应有明确的成员规则,并且只在一处执行。
4. 密钥与 API 密钥
API 密钥就是服务的密码。Stripe、邮件服务和 AI 服务商都使用它们。背景知识参见什么是环境变量和密钥。
- 必做: 密钥存放在项目的环境变量或密钥管理中,绝不能写入代码。
- 必做: 能够花钱或读取私人数据的密钥只能在服务器端使用。测试方法:打开你的线上网站,在开发者工具中查看页面源代码和 JavaScript 文件,搜索密钥的开头部分(例如
sk_)。它不应该出现在那里。 - 必做: 密钥从未被粘贴到聊天、公开仓库或截图中。如果有过,请轮换它:在服务商处创建新密钥,并删除旧密钥。
- 应做: 如果服务商提供,请使用受限或限定范围的密钥。例如,Stripe 建议使用受限密钥,只授予集成所需的权限。
- 应做: 测试密钥和正式密钥要分开,只有在准备好时,正式应用才使用正式密钥。
有些密钥本来就设计为公开的,例如 Stripe 的可发布密钥(pk_…),或仅限于你的域名使用的地图密钥。这条规则针对的是那些具有实际权限的密钥,而不是所有看起来像密钥的字符串。
5. 输入验证
用户提交的任何内容,包括表单字段、文件上传和 URL 参数,都可能是任意内容,而不只是表单允许的内容。
- 必做: 验证必须在服务器端进行,而不能只在浏览器中进行。浏览器端的检查只是为了方便,任何人都可以绕过。
- 必做: 数据库查询必须使用参数化方式,而不是把用户输入直接拼接成文本(这样可以防止 SQL 注入)。请让 AI 确认这一点。
- 必做: 用户输入的文本应以文本形式显示,而不是当作 HTML 执行。测试方法:把
<b>hello</b>作为你的名字输入。你应该看到这些标签本身,而不是粗体文字。 - 应做: 文件上传需检查类型和大小,并且上传的文件不能从应用的主域名作为可运行页面提供。
- 应做: 显示给用户的错误信息应简洁明了(例如“出了点问题”),详细的错误只写入服务器日志。
- 应做: 来自 Stripe 等服务的 Webhook 在执行操作之前,要先验证服务商的签名。参见什么是 Webhook。
为每个表单和 API 端点添加服务器端验证:必填字段、长度、格式和允许的取值。拒绝其他任何内容,并给出清楚的提示。不要向用户展示内部错误详情。
6. 速率限制与滥用防护
速率限制会限制某人在一段时间内可以发出的请求数量。如果没有它,任何人都可以整天猜测密码、刷爆你的注册表单,或者让你的付费 API 账单无限增长。
- 必做: 登录、注册和密码重置要按 IP 地址和按账户进行速率限制。
- 必做: 任何按调用次数产生费用的操作(AI 模型请求、短信、邮件)都要设置按用户的限制,并且需要登录。
- 应做: 公开表单(联系表单、候补名单)应有防垃圾信息机制:速率限制、隐藏的蜜罐字段或验证码。
- 应做: 在付费服务商处设置消费上限或告警,这样即使出现程序错误或攻击者,也不会产生无上限的账单。
7. 依赖项
应用由开源软件包构建,而这些软件包有时会存在已知漏洞。
- 应做: 让 AI 检查已知漏洞(对于 JavaScript 项目,使用
npm audit或你的包管理器对应的工具),并更新受影响的部分。 - 应做: 删除应用已不再使用的软件包。
- 应做: 对用户很少的软件包要保持警惕,尤其是名称看起来像热门包拼写错误的包。
- 以后再做: 每一两个月重新检查一次,如果你的代码托管在 GitHub 上,可以开启自动告警。
8. 备份与恢复
安全也包括在出错后能够恢复,无论错误来自你、AI,还是攻击者。
- 必做: 知道你的数据存放在哪里,以及是否有备份。不要想当然,请查阅托管服务商的文档确认。
- 应做: 定期自行导出重要数据(例如使用 CSV 导出功能或数据库转储),并存放在其他地方。
- 应做: 将代码纳入版本控制,以便恢复到任一版本。
- 应做: 删除类操作(删除账户、删除项目)应要求确认,并考虑使用可在一段时间内撤销的“软删除”。
- 以后再做: 实际测试一次恢复。从未恢复过的备份只是一种期望,而不是计划。
9. 上线前
- 必做: 线上网站全程使用 HTTPS。
- 必做: 删除开发阶段的示例数据、测试账户和调试页面。
- 应做: 隐私政策应说明你收集哪些数据以及原因。如果你收集个人数据,许多地区都要求这样做。不要声称你没有的认证(例如 SOC 2、HIPAA)。
- 应做: 你有一个渠道供他人报告安全问题,并且你知道如何快速轮换每一个密钥。
如需在安全之外进行更全面的上线前检查,参见如何把 AI 原型推向生产环境。
何时需要专业人士审查
清单能发现常见错误,但无法替代专家。如果你自己处理银行卡号而不是通过托管收银台,如果你存储健康、金融或儿童数据,如果你向要求安全问卷的企业销售产品,或者一旦泄露会造成严重损害,就应该考虑付费进行专业审查。代码可以导出,会让这类审查容易得多。
在 Mythex 上构建时的安全
Mythex 没有安全扫描面板,因此上面的清单就是你应遵循的流程。以下几点有所帮助:
- 项目密钥。 在项目设置 → 密钥中存放密钥,或通过智能体在聊天中显示的密钥卡片存放,这样它们就不会出现在你的代码或消息中。更改线上应用的密钥后,请重新发布。
- 计划模式和询问模式。 让智能体在不做修改的情况下检查权限:“在询问模式下,列出每一条 API 路由以及它所做的权限检查。”
/test让智能体以用户身份在你的预览中逐步操作,适合用来完成第 2 节中的双账户测试。- 检查点 可以让你回滚导致问题的修改。
参见文档中的为你构建的应用设置安全和环境变量与密钥。如果你接下来要添加用户账户,请阅读如何为应用添加登录功能。
常见问题
用 AI 构建的应用安全性更差吗?
本身并不一定,但 AI 构建工具的目标是让功能跑起来,而在没有人提出要求的情况下,安全检查很容易被忽略。最常见的漏洞是服务器端缺少权限检查,以及 API 密钥被放在浏览器可以读取的地方。
AI 构建应用最重要的安全检查是什么?
用一个用户登录,尝试查看或修改另一个用户的数据,既要通过应用的页面操作,也要直接修改 URL 中的 ID。这类访问控制失效在 OWASP Top 10:2025 网络应用安全风险列表中排名第一。
AI 构建应用中的 API 密钥应该放在哪里?
放在项目的环境变量或密钥中,并且只能由服务器端代码使用。能够产生费用或读取私人数据的密钥,绝不应出现在浏览器代码、聊天记录或 Git 仓库中。
上线前需要做安全审计吗?
对于数据风险较低的小型应用,按照这样的清单逐项检查是合理的起点。如果你直接处理支付,或涉及健康、金融、儿童数据,或有合同规定的安全要求,则应请有资质的专业人员进行审查。