如何审核和验证 AI 生成的代码输出
人工智能拥有的大量前端知识既令人生畏又令人安心。然而,人工智能永远不应被视为主题专家。明智的做法是不要使用无法测试或确定真假的人工智能输出。
AI 生成的代码可能存在依赖项管理不善的问题,或者无法遵循实施安全最佳实践的逻辑。由于每个开发人员都在其工作流程中采用了各种 AI 工具,因此设置审核 AI 生成代码的技术措施和流程非常重要。
在本文中,您将了解 AI 工具开发的代码组件可能引入的安全漏洞和设计缺陷。更重要的是,您将学习如何设置验证 AI 工具生成的代码的技术审计流程。
人工智能导致的安全和架构设计缺陷
使用 AI 生成的代码的一个重大风险是可能引入安全漏洞和架构缺陷。本节将讨论开发人员在使用 AI 生成的代码时应注意的问题。
未遵守安全编码准则
许多编码准则是由不同的安全标准(例如 NSA)制定的。AI 代码生成器专注于编写完成给定任务的代码。在确保生成的代码安全方面,它可能会失败。一个例子是当 AI 工具对机密进行硬编码时。
然而,AI 可能陷入的最重要安全问题是使用过时的概念或技术。AI 容易受到此安全问题影响的原因是用于训练 AI 的数据集没有定期更新。如果某个库因数据泄露而被宣布为过时库,AI 将继续使用过时库,直到其数据集更新为止。
使用未扫描任何过时库和概念的 AI 生成代码会使您的应用程序面临被利用的风险。下面是一个过时代码的示例,它使用旧的、不安全的 SHA-1 哈希算法,该算法现已弃用。过时的哈希算法无法有效地加密密码以抵御网络攻击:
using System.Security.Cryptography; using System.Text; public string HashPassword(string password) { SHA1 sha1 = SHA1.Create(); byte[] inputBytes = Encoding.ASCII.GetBytes(password); byte[] hashBytes = sha1.ComputeHash(inputBytes); return Convert.ToBase64String(hashBytes); }
数据质量问题
AI 不像人类开发者那么灵活。生成的代码的质量取决于 AI 模型的训练数据。如果人类开发者认为当前数据质量不好,他们可以探索无限的选项,甚至获得 AI 没有的新见解。
此外,有些情况下,AI 会输出出色的代码,但代码是从公共 GitHub 存储库中检索的。将许可代码用于商业用途或复制许可产品可能会让您陷入无休止的诉讼!
为什么人们容易对人工智能产生不安全感?
尽管人工智能输出可能存在缺陷,但许多因素导致开发人员盲目信任人工智能输出:
如何审核和验证 AI 生成的代码输出
以下是您在使用 AI 生成的代码时应该熟悉并实施的验证概念。
检查知识截止以检测幻觉
预测 AI 代码生成器何时会产生幻觉或生成有偏见的内容的最佳方法是检查其知识截止时间。知识截止时间表示模型上次更新的日期。截止时间之后发生的任何发现或事件模型都不知道。例如,在撰写本文时,GPT 4-Turbo 的知识截止时间为 2023 年 12 月。

那么,知识截止对前端开发人员有何帮助和重要性?当要求 AI 编码工具使用最新的库或新的 JavaScript 框架版本生成代码或 UI 组件时,这一点很重要。
之前我提到过,这些 AI 编码工具可以通过搜索网络获取超出知识范围的新知识。好吧,在这个幻觉案例中,ChatGPT 使用了 `useMetadata` Hook(React 中不存在),事实证明 ChatGPT 从 Thirdweb 网站获取了该钩子。
文档标准验证
AI 模型没有在文件中添加足够的注释或包文档的原因之一是它们没有生成将被多个开发人员审查的代码。通常,它们会为了解代码库的用户创建文档。AI 不知道生成的组件何时过于复杂,需要用注释进行解释,AI 也不知道代码何时过于简单,不需要解释。
AI 可以学习如何为您的项目撰写更好的评论,但它必须经过训练。然而,并非每个开发人员都具备训练这些模型的能力或有时间这样做。
为了确保遵循 Javascript 文档 (JSDoc) 标准,请安装 ESLint 工具。此工具不仅可以检查 JavaScript 代码,还可以扫描 JavaScript 文档并识别缺失的注释和非正式文档模式。使用以下命令安装 ESLint:
npm install --save-dev eslint
接下来,安装 JSDoc linter 插件:
npm install --save-dev eslint-plugin-jsdoc
使用以下命令通过 AI 生成的文档扫描您的文件:
npx eslint project-dir/ your-file.js
审计过时的图书馆
前端项目高度依赖内置和第三方库。每个项目都会导入多个库,为应用程序添加功能和自定义功能。库可能非常有用,但过时的库也很危险。
由于人工智能由其知识截止决定,因此它很容易添加过时的依赖项。因此,在将人工智能生成的代码集成到应用程序代码库时,运行“npm audit”非常重要。“npm audit”命令列出了在过时的库或依赖项中发现的所有漏洞。检测到漏洞后,使用“npm audit fix”来消除漏洞并找到过时库的更新。
代码库上下文相关性
使用 AI 代码生成器时,请记住 AI 模型仅限于它们所训练的算法模式。它们可能无法完全掌握应用程序中使用的某些要求、业务逻辑和独特模式。这种有限的理解会导致 AI 生成的代码不符合应用程序的需求。
AI 工具可以生成具有函数隔离问题的代码。函数隔离意味着创建的函数不使用任何项目库或调用任何项目函数。这就是为什么必须重构 AI 生成的代码以使其与代码库相关,除非 AI 工具可以读取整个代码库并理解所有函数。
隔离函数对应用程序几乎没有任何价值,因为它们可以被删除,并且不会破坏任何服务。隔离函数大多使用硬编码的值和配置。它们很难被重用。以下是隔离代码的示例:
// Irrelevant - Direct database access, bypassing the service layer async function getUserData(id) { return db.query(`SELECT * FROM users WHERE id = ${id}`); } // Relevant - Adheres to project's architecture async function getUserData(id) { return userService.getUserById(id); // Uses service layer abstraction
代码库上下文无关性问题可能由不遵守项目特定命名约定、格式和注释样式的函数引起。要识别和解决由代码库上下文无关性导致的这些架构缺陷,请考虑使用静态分析工具。许多现代测试平台和静态测试工具(例如 SonarSource)都经过了优化和训练,可以修复 AI 代码生成的问题。
结论
尽管 AI 已经彻底颠覆了开发人员的工作流程,但使用 AI 代码生成工具仍然变得越来越必要。为了有效地做到这一点,请按照我们在本教程中概述的步骤来验证您正在使用的 AI 生成的代码是否足够安全,可以添加到您的应用代码库中。验证 AI 代码可以减少代码错误并确保代码合规。然后,您可以放心使用 AI 来自动执行以下代码任务:
几分钟内即可设置 LogRocket 的现代错误跟踪:
新版本:
$ npm i --save logrocket // Code: import LogRocket from 'logrocket'; LogRocket.init('app/id');
脚本标记:
Add to your HTML:
3.(可选)安装插件以便与您的堆栈进行更深入的集成: