指南

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 仓库中。

上线前需要做安全审计吗?

对于数据风险较低的小型应用,按照这样的清单逐项检查是合理的起点。如果你直接处理支付,或涉及健康、金融、儿童数据,或有合同规定的安全要求,则应请有资质的专业人员进行审查。

Mythex · Pricing · 用 AI 构建任何东西 · 网站和应用模板 · Mythex 对比 · AI 应用构建术语表 · 免费的 AI 应用构建工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 繁體中文(香港) 繁體中文(台灣)