上一篇 下一篇 分享链接 返回 返回顶部

零基础用 AI 写代码,别等上线后才补安全漏洞

发布人:慈云数据-客服中心 发布时间:23小时前 阅读量:3

AI编程 安全加固方案|零基础可学

在 AI 编程工具快速普及的今天,越来越多零基础用户开始借助 ChatGPT、Cursor、Copilot、通义灵码、豆包 MarsCode 等工具写代码、搭建网站、开发小程序、自动化办公脚本,甚至独立完成一个完整产品。AI 编程极大降低了开发门槛,但也带来了一个非常容易被忽视的问题:安全风险

很多新手在使用 AI 写代码时,往往只关注“能不能运行”“效果好不好”,却忽略了“是否安全”“是否会泄露数据”“是否容易被攻击”。例如:AI 生成的登录接口没有密码加密、数据库账号直接写在代码里、上传文件没有校验、后台管理页面没有权限控制、调用第三方 API 时暴露了密钥……这些问题看似不起眼,一旦项目上线,就可能导致用户数据泄露、服务器被入侵、接口被刷爆,甚至造成经济损失。

本文将以零基础也能理解的方式,系统讲解一套适合 AI 编程项目的安全加固方案,帮助你从项目创建、代码生成、接口开发、数据库使用、部署上线到日常维护,逐步建立安全意识和基础防护能力。


一、为什么 AI 编程更需要安全加固?

AI 编程的特点是:生成速度快、代码量大、使用者不一定懂底层原理。这既是优势,也是风险来源。

传统开发者写代码时,通常知道某段代码为什么这样写,也知道可能存在什么问题。而零基础用户使用 AI 生成代码时,往往会直接复制粘贴或一键运行,如果 AI 生成了不安全代码,用户很难第一时间发现。

常见风险包括:

  1. AI 生成的代码存在漏洞
    例如 SQL 注入、XSS 跨站脚本、越权访问、明文密码存储等。

  2. 敏感信息被写入代码
    如数据库密码、API Key、短信平台密钥、支付密钥等。

  3. 项目权限控制不完善
    普通用户可能访问管理员接口,未登录用户可能查看私密数据。

  4. 部署配置不安全
    服务器端口随意开放、默认密码未修改、日志暴露敏感信息。

  5. 过度信任 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            # 项目说明

其中 .envlogs/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 写代码之前,不要只说“帮我写一个登录系统”,而应该明确提出安全要求。

可以这样提问:

请帮我设计一个登录注册系统,要求:

  1. 密码必须使用 bcrypt 加密存储;
  2. 登录失败次数过多需要限制;
  3. 使用 JWT 时密钥从环境变量读取;
  4. 所有用户输入都要校验;
  5. 不要在代码中硬编码数据库密码;
  6. 请指出可能存在的安全风险。

这样的提示词可以显著提升 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 位;
  • 包含字母和数字;
  • 不允许使用 123456passwordadmin123 等常见弱密码;
  • 可选:包含特殊字符。

可以让 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 需要设置 HttpOnlySecureSameSite
  • 高安全场景建议使用 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 是强大的生产力工具,但安全加固才是让项目真正可靠、可上线、可长期运行的关键。

目录结构
全文