打开网易新闻 查看精彩图片

45%的AI生成代码带安全漏洞,2.74倍于人工代码——这不是实验室数据,是过去几个月我从真实代码库里扫出来的。

有个场景每个用Cursor的人都熟悉:连续肝了6小时,AI帮你补全句子,应用能跑通,数据能存,登录流程顺畅。你推上生产环境,感觉自己发现了软件开发的作弊码。

然后用户发邮件来了。或者更糟,他们什么都不说,直接走人。

我这半年干了一件多数开发者跳过的事:在代码上线前扫描AI生成的代码库。不是事后,是事前。AI分析加人工工程师复核,专门找那些"看起来没问题"的问题。结果同一批漏洞反复出现——不是偶尔,不是烂代码才这样,是持续出现,出现在聪明人用最好工具写的项目里。

这不是说AI工具不行。我每天都在用。这是一个特定、可预测的盲区——它正在让创始人丢失用户、信任,有时候是整个产品。

AI写的代码能跑,这才是问题

AI写的代码能跑,这才是问题

先杀死第一个误解。

Cursor、Bolt、v0、GitHub Copilot、Claude这些工具写的代码功能 remarkably 完整。这正是危险所在。代码能编译,测试能通过(如果你写了的话),主流程跑得漂亮。

但Veracode的数据是:45%的AI生成代码引入安全漏洞。CodeRabbit发现AI辅助项目的安全问题数量是人工代码的2.74倍。Forrester预测到2027年,仅AI生成代码就会产生1.5万亿美元的技术债。

这些不是边缘案例。是一款被优化为"输出看起来合理、能运行的代码"的工具的统计结果——而非"输出防御性强、能抵抗攻击的代码"。

区别很大。

60%代码库出现的SQL注入:AI知道答案,但不选

60%代码库出现的SQL注入:AI知道答案,但不选

带数据库层的代码库里,大概60%有这个问题。看AI生成的典型代码:

const user = await db.query( `SELECT * FROM users WHERE email = '${req.body.email}'` );

运行完美——直到有人把邮箱填成 ' OR '1'='1,然后读走了你的整张用户表。字符串拼接不是风格选择,是敞开的门。

参数化版本写起来并不难:

打开网易新闻 查看精彩图片

const user = await db.query( 'SELECT * FROM users WHERE email = $1', [req.body.email] );

AI知道这个模式存在。它只是不会主动选——除非你明确要求,而多数人不知道要提这个要求。

密钥硬编码:AI在"完成"你的暗示

密钥硬编码:AI在"完成"你的暗示

这个问题安静但致命。

const stripe = require('stripe')('sk_live_424242...'); const db = new Client({ connectionString: 'postgresql://admin:prod-password@...' });

AI根据上下文和注释补全代码。当你的注释写// Connect to Stripe,变量名叫stripeKey,它就会填一个"看起来对"的东西。有时候从你代码库里的模式提取,有时候从训练数据里"借"一个看着像的密钥

生产环境的Stripe密钥就这样躺在GitHub公开仓库里。我上个月扫到一个项目,数据库连接字符串里嵌着明文密码,提交历史里能追溯到三个月前。

开发者没意识到这是问题——因为本地跑的时候一切正常,AI也没标红警告。

权限模型:AI默认"信任所有人"

权限模型:AI默认"信任所有人"

这是我最常发现的架构级漏洞。AI生成的API端点通常长这样:

app.get('/api/documents/:id', async (req, res) => { const doc = await db.documents.findById(req.params.id); res.json(doc); });

能跑。能根据ID取文档。但检查用户是否有权看这个文档?AI不会主动加这层。我见过医疗记录系统、财务仪表盘、内部管理后台,全是这个模式。

横向权限漏洞(IDOR)在AI代码里几乎是默认配置。不是AI故意不安全,是它的优化目标里没有"怀疑请求合法性"这一项。

为什么聪明人反复踩同一个坑

为什么聪明人反复踩同一个坑

这不是能力问题,是注意力分配问题。

AI工具把开发者的认知负荷从"怎么写"转移到"写什么"。当你连续6小时处于心流状态,大脑不会自动切到"攻击者视角"——而传统开发里,写查询语句时的摩擦感恰好给人停下来想一想的空间。

打开网易新闻 查看精彩图片

Cursor的自动补全太快、太顺滑了。顺滑到危险代码和安全的代码看起来同样"对"。

我观察到一个规律:用AI越熟练的开发者,越可能在安全审查上偷懒。不是因为他们不在乎,是因为工具训练他们信任"能跑的代码"。

CodeRabbit的2.74倍数据背后,是经验与警惕性的错配——老手知道SQL注入的原理,但不再逐行检查AI生成的查询;新人根本没见过 ' OR '1'='1 长什么样。

1.5万亿技术债的账单谁付

1.5万亿技术债的账单谁付

Forrester的1.5万亿美元预测不是抽象数字。它分解到每个创始人身上,是凌晨三点处理数据泄露的紧急会议,是向用户解释为什么密码要强制重置,是合规审计失败后的罚款单。

更隐蔽的成本是信任折旧。用户不会告诉你他们因为"感觉不安全"而流失——他们直接消失。等你发现的时候,已经攒了六个月有漏洞的代码,重构成本远超当初花20分钟做安全审查。

我见过一个团队,AI生成的认证模块跑了八个月,直到白帽黑客在漏洞赏金平台提交报告。修复用了两周,但用户注册转化率在那之后跌了40%——没人知道具体原因,但时间线对得上。

不是不用AI,是改个流程

不是不用AI,是改个流程

我现在的做法很简单,分享给你:

第一,把安全审查从"上线前检查"改成"生成时拦截"。Cursor有规则文件(.cursorrules),可以强制要求参数化查询、禁止字符串拼接SQL。花10分钟写规则,比事后扫代码有效十倍。

第二,AI生成任何涉及数据访问的代码后,强制问自己:如果我是攻击者,怎么让这个查询返回不该看的数据?这个视角切换不能省。

第三,密钥管理用环境变量检查工具做预提交钩子。不是相信开发者会记得,是让错误推不上去。

第四,也是最反直觉的:降低AI补全速度。Cursor的Tab键太顺手了,顺手到你会在没看清代码前就接受。我关了自动提交,改成手动触发,给自己三秒钟的停顿窗口。

这三秒钟,就是区分"能跑的代码"和"能扛住攻击的代码"的间隙。

最后说个细节。上周扫的一个代码库,开发者在注释里写了句"AI generated, review carefully"。结果审查跳过了——人类看到这句,潜意识里把责任推给了"AI会处理好",反而看得更粗。

安全审查不能外包给注释。你的下一个AI生成项目,准备在哪一步卡住自己?