零基础用 AI 写代码,别等上线后才补安全漏洞
AI编程 安全加固方案|零基础可学
在 AI 编程工具快速普及的今天,越来越多零基础用户开始借助 ChatGPT、Cursor、Copilot、通义灵码、豆包 MarsCode 等工具写代码、搭建网站、开发小程序、自动化办公脚本,甚至独立完成一个完整产品。AI 编程极大降低了开发门槛,但也带来了一个非常容易被忽视的问题:安全风险。
很多新手在使用 AI 写代码时,往往只关注“能不能运行”“效果好不好”,却忽略了“是否安全”“是否会泄露数据”“是否容易被攻击”。例如:AI 生成的登录接口没有密码加密、数据库账号直接写在代码里、上传文件没有校验、后台管理页面没有权限控制、调用第三方 API 时暴露了密钥……这些问题看似不起眼,一旦项目上线,就可能导致用户数据泄露、服务器被入侵、接口被刷爆,甚至造成经济损失。
本文将以零基础也能理解的方式,系统讲解一套适合 AI 编程项目的安全加固方案,帮助你从项目创建、代码生成、接口开发、数据库使用、部署上线到日常维护,逐步建立安全意识和基础防护能力。
一、为什么 AI 编程更需要安全加固?
AI 编程的特点是:生成速度快、代码量大、使用者不一定懂底层原理。这既是优势,也是风险来源。
传统开发者写代码时,通常知道某段代码为什么这样写,也知道可能存在什么问题。而零基础用户使用 AI 生成代码时,往往会直接复制粘贴或一键运行,如果 AI 生成了不安全代码,用户很难第一时间发现。
常见风险包括:
-
AI 生成的代码存在漏洞
例如 SQL 注入、XSS 跨站脚本、越权访问、明文密码存储等。 -
敏感信息被写入代码
如数据库密码、API Key、短信平台密钥、支付密钥等。 -
项目权限控制不完善
普通用户可能访问管理员接口,未登录用户可能查看私密数据。 -
部署配置不安全
服务器端口随意开放、默认密码未修改、日志暴露敏感信息。 -
过度信任 AI 输出
AI 可能给出“能运行但不安全”的方案,如果没有人工审查,就容易埋下隐患。
因此,AI 编程不是“让 AI 写完就结束”,而是要学会给 AI 提要求、检查 AI 输出,并在关键位置进行安全加固。
二、AI 编程安全加固的核心原则
在正式学习具体方案前,先理解几个非常重要的安全原则。
1. 最小权限原则
最小权限原则是指:每个用户、程序、接口、数据库账号,只拥有完成任务所必需的最少权限。
例如:
- 普通用户不能访问管理员后台;
- 查询数据的数据库账号不应该拥有删除表的权限;
- 上传文件接口不能允许执行脚本文件;
- 服务器只开放必要端口。
新手常见错误是为了方便,直接给所有功能最高权限。这样一旦某个地方被攻击,攻击者就能获得更大控制权。
2. 默认不信任原则
任何来自用户、前端、第三方接口、文件上传的数据,都不能直接相信。
例如:
- 用户输入的用户名可能包含恶意脚本;
- 表单提交的价格可能被篡改;
- 上传的图片可能伪装成可执行文件;
- 前端传来的用户 ID 可能不是当前用户自己的 ID。
所以后端必须进行校验,而不能只依赖前端限制。
3. 敏感信息不进代码原则
数据库密码、JWT 密钥、API Key、支付密钥等,都不应该直接写在源代码中,更不能提交到 GitHub、Gitee 等公开仓库。
正确做法是使用:
- 环境变量;
.env配置文件;- 云平台密钥管理服务;
- CI/CD Secret 配置。
4. 安全不是一次性工作
安全加固不是上线前检查一次就结束,而是一个持续过程。随着功能增加、依赖升级、用户增长,新的风险也会不断出现。因此需要定期检查依赖漏洞、服务器日志、异常访问和权限配置。
三、项目创建阶段的安全准备
很多安全问题不是上线后才产生的,而是在项目创建第一天就埋下了隐患。
1. 建立合理的项目目录
以一个常见 Web 项目为例,可以参考如下结构:
my-ai-project/
├── src/ # 源代码
├── config/ # 配置文件
├── tests/ # 测试文件
├── logs/ # 日志文件
├── uploads/ # 上传文件目录
├── .env # 环境变量,本地使用
├── .gitignore # Git 忽略配置
├── package.json # 依赖配置
└── README.md # 项目说明
其中 .env、logs/、uploads/ 等文件或目录,通常不应该直接提交到代码仓库。
2. 配置 .gitignore
如果你使用 Git 管理代码,一定要配置 .gitignore 文件,防止敏感文件被上传。
示例:
node_modules/
.env
.env.local
logs/
uploads/
*.log
dist/
.DS_Store
如果是 Python 项目,可以增加:
__pycache__/
*.pyc
venv/
.env
很多新手会把 .env 文件直接上传到公开仓库,导致数据库密码或 API Key 泄露。配置 .gitignore 是非常基础但非常重要的一步。
3. 让 AI 生成安全需求说明
在让 AI 写代码之前,不要只说“帮我写一个登录系统”,而应该明确提出安全要求。
可以这样提问:
请帮我设计一个登录注册系统,要求:
- 密码必须使用 bcrypt 加密存储;
- 登录失败次数过多需要限制;
- 使用 JWT 时密钥从环境变量读取;
- 所有用户输入都要校验;
- 不要在代码中硬编码数据库密码;
- 请指出可能存在的安全风险。
这样的提示词可以显著提升 AI 生成代码的安全性。
四、账号与密码安全加固
账号系统是大多数项目最核心的部分,也是攻击者最关注的位置。
1. 密码不能明文保存
错误示例:
const user = {
username: "test",
password: "123456"
};
这种方式非常危险。一旦数据库泄露,所有用户密码都会暴露。
正确做法是使用哈希算法,例如 bcrypt:
const bcrypt = require("bcrypt");
const saltRounds = 10;
const hashedPassword = await bcrypt.hash(password, saltRounds);
登录时不是解密密码,而是比较用户输入密码和数据库中的哈希值:
const isMatch = await bcrypt.compare(inputPassword, user.passwordHash);
2. 密码强度要求
注册时应限制弱密码,例如:
- 长度不少于 8 位;
- 包含字母和数字;
- 不允许使用
123456、password、admin123等常见弱密码; - 可选:包含特殊字符。
可以让 AI 帮你生成密码校验函数,但要记得检查逻辑是否完整。
3. 登录失败限制
如果没有登录失败限制,攻击者可以不断尝试密码,也就是所谓的暴力破解。
简单策略:
- 同一账号连续失败 5 次,锁定 15 分钟;
- 同一 IP 短时间请求过多,进行限流;
- 后台记录失败日志,便于排查异常。
4. JWT 使用注意事项
JWT 很常见,但新手容易错误使用。
注意:
- JWT 密钥必须足够复杂;
- 密钥从环境变量读取;
- Token 设置合理过期时间;
- 不要把敏感信息放进 Token;
- 退出登录时要考虑 Token 失效机制。
错误示例:
const secret = "123456";
正确示例:
const secret = process.env.JWT_SECRET;
.env 文件中配置:
JWT_SECRET=your-super-long-random-secret-key
五、接口安全加固
接口是前端和后端交互的通道,也是攻击发生最频繁的地方。
1. 所有接口都要做权限校验
不要以为前端隐藏了按钮,用户就不能访问接口。攻击者可以直接使用 Postman、curl 或浏览器控制台请求后端接口。
例如,删除用户接口:
DELETE /api/users/1001
后端必须判断:
- 当前用户是否已登录;
- 当前用户是否有管理员权限;
- 是否允许删除目标用户。
权限判断必须在后端完成。
2. 防止越权访问
越权访问是新手项目中非常常见的问题。
比如用户 A 的订单 ID 是 1001,用户 B 猜到了这个 ID,然后访问:
GET /api/orders/1001
如果后端只根据订单 ID 查询,而不判断订单是否属于当前用户,就会导致用户 B 查看用户 A 的订单。
正确逻辑是:
查询订单时,不仅要判断订单 ID,还要判断订单所属用户 ID 是否等于当前登录用户 ID。
3. 参数校验
所有用户输入都要校验,包括:
- 字符串长度;
- 数据类型;
- 邮箱格式;
- 手机号格式;
- 数字范围;
- 枚举值是否合法;
- 必填字段是否为空。
不要直接把用户输入传给数据库或系统命令。
4. 接口限流
如果接口没有限流,可能被恶意刷接口,导致服务器压力过大,短信费用暴涨,甚至服务瘫痪。
常见需要限流的接口:
- 登录接口;
- 注册接口;
- 发送验证码接口;
- 搜索接口;
- 上传文件接口;
- AI 调用接口。
例如:
同一 IP 每分钟最多请求 60 次;
同一手机号每分钟最多发送 1 次验证码;
同一用户每天最多调用 AI 接口 100 次。
六、数据库安全加固
数据库中往往保存着用户资料、订单信息、业务数据,是安全保护的重点。
1. 防止 SQL 注入
SQL 注入是经典漏洞。错误示例:
const sql = "SELECT * FROM users WHERE username = '" + username + "'";
如果用户输入恶意内容,就可能改变 SQL 语句含义。
正确做法是使用参数化查询:
const sql = "SELECT * FROM users WHERE username = ?";
db.query(sql, [username]);
如果使用 ORM,例如 Prisma、Sequelize、TypeORM、Django ORM,也能降低 SQL 注入风险,但仍然不能拼接原始 SQL。
2. 数据库账号权限分离
不要直接用 root 账号连接业务系统。
建议:
- 开发环境使用开发账号;
- 生产环境使用生产账号;
- 只给业务账号必要权限;
- 备份账号单独管理;
- 删除表、修改结构等高危权限谨慎开放。
3. 定期备份
安全不只是防攻击,也包括防误删、防故障。
备份建议:
- 每天自动备份;
- 重要系统增加每小时增量备份;
- 备份文件加密保存;
- 定期测试能否恢复;
- 不要把备份文件放在公开目录。
很多人以为有备份就安全,但真正出问题时才发现备份损坏或无法恢复。因此恢复演练也很重要。
七、文件上传安全加固
文件上传是非常危险的功能,因为用户可以把文件传到你的服务器。
1. 限制文件类型
如果只是上传头像,就只允许:
- jpg;
- jpeg;
- png;
- webp。
不要只依赖文件后缀判断,因为攻击者可以把恶意脚本改名为 xxx.jpg。
应结合:
- 文件扩展名;
- MIME 类型;
- 文件头特征;
- 文件大小限制。
2. 限制文件大小
避免用户上传超大文件占满服务器磁盘。例如:
头像最大 2MB;
普通图片最大 10MB;
视频文件根据业务设置合理限制。
3. 上传目录禁止执行脚本
上传文件目录不应该具备执行权限。比如用户上传了一个伪装文件,即使成功上传,也不能让服务器执行它。
4. 文件名随机化
不要使用用户原始文件名直接保存,因为可能存在路径穿越风险,例如:
../../app.js
正确做法是生成随机文件名:
avatar_1730000000_8f3a9c.png
八、前端安全加固
虽然核心安全逻辑要放在后端,但前端同样需要注意安全。
1. 防止 XSS 攻击
XSS 是指攻击者输入恶意脚本,导致其他用户访问页面时执行。
例如用户昵称设置为:
如果页面直接渲染,就会执行脚本。
防护措施:
- 对用户输入进行转义;
- 不随意使用
innerHTML; - 富文本内容使用安全过滤库;
- 设置 Content Security Policy;
- 后端返回数据前也要进行必要处理。
2. 不在前端保存敏感密钥
前端代码是可以被用户查看的。因此不要把这些内容写在前端:
- 数据库密码;
- 服务端 API Key;
- 支付密钥;
- 管理员 Token;
- 私有 AI 模型密钥。
前端只能保存公开配置,真正敏感的调用应通过后端代理完成。
3. Token 存储注意事项
Token 可以存放在 Cookie 或本地存储中,但要理解风险:
localStorage容易受到 XSS 影响;- Cookie 需要设置
HttpOnly、Secure、SameSite; - 高安全场景建议使用 HttpOnly Cookie。
九、AI 接口调用安全
很多 AI 编程项目会接入大模型 API,例如 OpenAI、Claude、通义千问、文心一言、DeepSeek 等。AI 接口通常按量计费,因此更要注意安全。
1. API Key 不得暴露在前端
错误做法:
const apiKey = "sk-xxxxxx";
如果这段代码出现在前端,任何人都可以打开浏览器开发者工具看到你的 Key,然后盗用你的额度。
正确做法是:
前端请求你的后端;
后端读取环境变量中的 API Key;
后端再请求 AI 服务商。
2. 设置用户调用额度
例如:
- 免费用户每天最多调用 20 次;
- 登录用户每天最多调用 100 次;
- 付费用户根据套餐限制;
- 同一 IP 未登录状态每小时最多 10 次。
3. 过滤用户输入和输出
如果你的 AI 应用会处理用户上传的内容,或者将 AI 输出展示给其他用户,需要注意:
- 不要让 AI 输出直接执行;
- 不要把 AI 生成的代码自动部署;
- 对 AI 输出的 HTML 进行过滤;
- 防止提示词注入导致系统提示泄露。
4. 日志不要记录完整敏感内容
很多 AI 应用会记录用户提问和模型回答用于排查问题。但如果用户输入包含身份证号、手机号、合同、密钥等敏感信息,就可能造成二次泄露。
建议:
- 日志脱敏;
- 敏感字段打码;
- 限制日志访问权限;
- 设置日志保存期限。
十、服务器部署安全加固
项目上线后,服务器就是对外暴露的入口。
1. 修改默认密码
不要使用:
admin/admin
root/123456
password
服务器、数据库、后台管理系统都必须使用强密码。
2. 关闭不必要端口
只开放必要端口,例如:
- 80:HTTP;
- 443:HTTPS;
- 22:SSH,但建议限制 IP 或改用密钥登录;
- 数据库端口一般不应直接暴露公网。
3. 使用 HTTPS
HTTPS 可以防止数据在传输过程中被窃听或篡改。现在很多平台都支持免费证书,例如 Let's Encrypt。
上线项目应尽量强制使用 HTTPS。
4. 开启防火墙
可以使用云服务器安全组或系统防火墙,只允许必要访问。
5. 定期更新系统和依赖
很多攻击不是因为你代码写错,而是因为使用了有漏洞的旧版本依赖。
建议定期执行:
npm audit
pip list --outdated
并关注框架安全公告。
十一、日志与监控
没有日志,就很难发现攻击;没有监控,就很难知道系统是否异常。
1. 记录关键安全日志
建议记录:
- 登录成功与失败;
- 密码修改;
- 权限变更;
- 管理员操作;
- 文件上传;
- 支付回调;
- 异常请求;
- 接口限流触发。
2. 日志要脱敏
不要在日志中直接记录:
- 密码;
- Token;
- 身份证号;
- 银行卡号;
- 完整手机号;
- API Key。
可以这样处理:
手机号:138****5678
身份证:110101********1234
Token:只记录前 6 位和后 4 位
3. 设置告警
当出现以下情况时,应及时提醒:
- 短时间大量登录失败;
- 某个 IP 请求异常频繁;
- 服务器 CPU 或内存过高;
- 磁盘空间即将耗尽;
- AI 接口费用异常增长;
- 数据库连接数异常。
十二、让 AI 帮你做安全检查
AI 不仅可以写代码,也可以帮你检查代码安全。但要注意,AI 检查不能替代专业审计,只能作为辅助。
你可以使用这样的提示词:
请你作为资深安全工程师,审查以下代码是否存在安全问题。重点检查:SQL 注入、XSS、越权访问、敏感信息泄露、密码存储、接口限流、文件上传安全、JWT 使用方式。请按“问题描述、风险等级、修复建议、修复示例”输出。
如果项目较大,可以分模块让 AI 检查:
- 登录模块;
- 用户权限模块;
- 文件上传模块;
- 支付模块;
- AI 调用模块;
- 管理后台模块。
还可以让 AI 帮你生成安全测试用例,例如:
请根据这个接口文档,帮我生成一份安全测试清单,包括未登录访问、越权访问、参数篡改、重复提交、异常输入、频率限制测试。
十三、零基础安全加固清单
下面是一份适合新手使用的 AI 编程安全检查清单。每次项目上线前,都可以逐项检查。
账号安全
- [ ] 密码是否加密存储?
- [ ] 是否限制弱密码?
- [ ] 登录失败是否有限制?
- [ ] JWT 密钥是否来自环境变量?
- [ ] Token 是否设置过期时间?
接口安全
- [ ] 每个接口是否校验登录状态?
- [ ] 管理接口是否校验管理员权限?
- [ ] 是否防止用户访问他人数据?
- [ ] 参数是否做类型和范围校验?
- [ ] 高频接口是否做限流?
数据库安全
- [ ] 是否使用参数化查询或 ORM?
- [ ] 是否避免拼接 SQL?
- [ ] 数据库密码是否未写入代码?
- [ ] 数据库是否未暴露公网?
- [ ] 是否定期备份?
文件上传安全
- [ ] 是否限制文件类型?
- [ ] 是否限制文件大小?
- [ ] 文件名是否随机生成?
- [ ] 上传目录是否禁止执行?
- [ ] 是否防止路径穿越?
前端安全
- [ ] 是否避免直接使用
innerHTML? - [ ] 用户输入是否转义显示?
- [ ] 前端是否没有保存敏感密钥?
- [ ] Cookie 是否设置安全属性?
- [ ] 页面是否使用 HTTPS?
部署安全
- [ ] 是否修改默认密码?
- [ ] 是否关闭无用端口?
- [ ] 是否开启防火墙?
- [ ] 是否配置 HTTPS?
- [ ] 是否定期更新依赖?
AI 接口安全
- [ ] AI API Key 是否只在后端保存?
- [ ] 是否限制用户调用次数?
- [ ] 是否监控接口费用?
- [ ] 日志是否脱敏?
- [ ] 是否防止 AI 输出直接执行?
十四、推荐的 AI 安全提示词模板
为了让 AI 更容易生成安全代码,可以直接使用以下模板。
1. 生成代码前的提示词
请帮我实现以下功能,但必须遵守安全开发规范:
1. 所有用户输入都要进行参数校验;
2. 密码必须使用 bcrypt 或同等级安全算法加密;
3. 数据库查询必须使用参数化查询或 ORM;
4. 敏感配置必须从环境变量读取;
5. 接口必须包含身份认证和权限校验;
6. 高频接口需要限流;
7. 请不要生成硬编码密钥;
8. 请在代码后说明可能的安全风险和改进建议。
2. 审查代码的提示词
请以安全审计员身份检查以下代码。
请重点分析:
- 是否存在 SQL 注入;
- 是否存在 XSS;
- 是否存在越权访问;
- 是否存在敏感信息泄露;
- 密码和 Token 是否安全;
- 是否缺少参数校验;
- 是否缺少限流;
- 文件上传是否安全。
请输出问题、风险等级、原因和修复方案。
3. 上线前检查提示词
我的项目准备上线,请帮我生成上线前安全检查清单。
项目类型是:Web 应用。
技术栈是:Node.js + Express + MySQL + Vue。
请覆盖账号安全、接口安全、数据库安全、前端安全、服务器安全、日志监控和备份恢复。
十五、给零基础学习者的安全学习路线
如果你是零基础,不需要一开始就学习非常复杂的攻防技术。可以按照以下顺序逐步掌握:
第一阶段:基础安全意识
学习内容:
- 什么是账号密码安全;
- 什么是权限控制;
- 什么是敏感信息;
- 为什么不能相信用户输入;
- 为什么不能把密钥写进代码。
目标:能识别明显不安全的代码。
第二阶段:常见 Web 漏洞
学习内容:
- SQL 注入;
- XSS;
- CSRF;
- 越权访问;
- 文件上传漏洞;
- 暴力破解;
- 敏感信息泄露。
目标:知道常见漏洞是什么、如何预防。
第三阶段:安全编码实践
学习内容:
- 参数校验;
- 密码哈希;
- JWT 安全;
- 接口限流;
- 日志脱敏;
- 权限中间件;
- 安全配置管理。
目标:能在自己的 AI 编程项目中应用安全方案。
第四阶段:部署与运维安全
学习内容:
- HTTPS;
- 防火墙;
- 服务器权限;
- 数据库备份;
- 日志监控;
- 依赖漏洞扫描;
- 容器安全基础。
目标:能安全地把项目部署上线。
十六、一个简单的安全开发流程
对于 AI 编程项目,可以采用下面这个流程:
需求设计
↓
让 AI 生成安全方案
↓
让 AI 编写代码
↓
人工检查关键逻辑
↓
让 AI 做安全审查
↓
本地测试异常输入
↓
上线前安全清单检查
↓
部署 HTTPS、防火墙、日志监控
↓
定期更新和复查
这个流程并不复杂,但可以避免大量低级安全问题。
结语:AI 能帮你写代码,但安全责任仍在你手里
AI 编程让普通人也能快速开发应用,这是非常值得兴奋的变化。但越是容易写代码,越要重视安全。因为项目一旦上线,就不再只是“本地能运行”的小实验,而是一个真实暴露在互联网环境中的系统。
对于零基础学习者来说,不必一开始就成为安全专家,但至少要做到:
- 不明文保存密码;
- 不把密钥写进代码;
- 不相信用户输入;
- 后端必须做权限校验;
- 数据库查询避免拼接 SQL;
- 文件上传必须限制;
- AI API Key 不放前端;
- 上线必须使用 HTTPS;
- 定期备份和更新依赖。
只要你在使用 AI 编程时,始终把“安全要求”写进提示词,把“安全检查”加入开发流程,就能大幅降低风险。AI 是强大的生产力工具,但安全加固才是让项目真正可靠、可上线、可长期运行的关键。