快速入门:安全分析器(预览版)

GitHub Copilot 可帮助开发人员识别和解决 SQL 代码和应用程序层查询中的常见安全风险。 它可以帮助检测漏洞,例如 SQL 注入、过度公开的数据和不安全模式,特别是针对那些安全背景不强的开发人员,并在开发过程中提供切合实际的建议,增强其安全意识。

开始吧

确保已连接到数据库,并使用 MSSQL 扩展打开活动编辑器窗口。 通过此连接, @mssql 聊天参与者可以了解数据库环境的上下文,从而提供准确的上下文感知建议。 如果没有数据库连接,聊天参与者将没有架构或数据上下文来提供有意义的响应。

以下示例使用 AdventureWorksLT2022 示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。

为了获得最佳结果,请调整表和架构名称以匹配自己的环境。

确保聊天包含 @mssql 前缀。 例如,键入 @mssql 后跟问题或提示。 这可确保聊天参与者了解你请求与 SQL 相关的帮助。

使用 GitHub Copilot 检测和修复安全风险

GitHub Copilot 可帮助开发人员在开发过程早期检测和修复常见的安全漏洞,然后再到达生产环境。 无论你使用的是原始 SQL、ORM 还是存储过程,GitHub Copilot 都可以识别不安全模式,解释潜在风险,并根据数据库上下文建议更安全的替代方案。 这对于不专门从事安全性但需要遵循安全编码做法的开发人员尤其有用。

下面是通过聊天参与者可以询问的常见用例和示例。

SQL 注入检测

SQL 注入是数据库应用程序中最常见的和危险的安全漏洞之一。 GitHub Copilot 可帮助识别未参数化的查询、字符串内插问题以及动态 SQL 的滥用,同时建议为上下文定制的更安全的参数化替代项。

  • 我正在使用SQLAlchemyPython中为我的当前数据库SalesLT架构。 检查以下 SQLAlchemy 查询,了解潜在的安全风险,例如 SQL 注入、过度提取或性能问题。 如果适用,建议使用参数化查询、连接池和其他安全 SQL Server 做法进行改进,以确保性能和安全性。
query = f"SELECT * FROM SalesLT.Customer WHERE LastName = '{user_input}'"
result = engine.execute(query).fetchall()
  • 分析以下 JavaScriptSQL 查询中是否存在潜在的安全漏洞。 确定诸如SQL注入、过度提取和不良身份验证做法等风险。 解释此查询为何不安全并提供安全替代方法。
const query = `SELECT * FROM Users WHERE Username = '${username}' AND Password = '${password}'`;
  • 使用当前数据库,模拟 SQL 存储过程的 SalesLT.uspGetCustomerOrderHistory 注入攻击并建议修复。

  • 查看当前数据库中的存储过程 SalesLT.uspGetCustomerOrderHistory ,了解潜在的 SQL 注入漏洞。 说明如何利用未参数或未正确验证的输入,并建议采用安全编码做法。

  • 查看SalesLT.uspGetCustomerOrderHistory_Insecure存储过程。 确定实现中的任何潜在安全问题,然后提供经过修订的存储过程版本,以解决这些问题,而无需明确列出安全最佳做法。

可以使用以下 T-SQL 创建存储过程:

CREATE OR ALTER PROCEDURE [SalesLT].[uspGetCustomerOrderHistory_Insecure]
@CustomerID NVARCHAR (50)
AS
BEGIN
    DECLARE @SQL AS NVARCHAR (MAX) = N'SELECT *
    FROM SalesLT.SalesOrderHeader
    WHERE CustomerID = ' + @CustomerID + ';';
    EXECUTE (@SQL);
END
GO

常规安全建议

除了 SQL 注入之外,许多数据库应用程序默认公开敏感数据或使用不安全的配置。 GitHub Copilot 提供有关加密连接、屏蔽或保护个人数据以及跨多个开发堆栈的安全身份验证和授权最佳做法的指南。

  • 建议使用安全方法将敏感数据 SalesLT.Address 存储在表中。

  • 数据库中用于屏蔽表中个人数据 SalesLT.Customer 的最佳策略或内置功能是什么?

  • 如何配置连接字符串 Entity Framework Core 以强制加密并避免公开凭据?

  • 如何在 Prisma 环境或 Node.js 环境中安全地使用 Microsoft Entra ID 身份验证或托管身份SQL Server,而不是存储密码?

  • 使用 SEquelize 或 EF Core 等 ORM 时,应启用或验证哪些 SQL Server 选项(例如 Always EncryptedTransparent Data Encryption)保护客户数据?

反馈:安全分析器

为了帮助我们优化和改进 MSSQL 扩展的 GitHub Copilot,请使用以下 GitHub 问题模板提交反馈: GitHub Copilot 反馈

提交反馈时,请考虑包括:

  • 测试方案 – 告诉我们你关注哪些领域,例如架构创建、查询生成、安全性、本地化。

  • 效果良好 - 描述任何感觉流畅、有用或超出预期的体验。

  • 问题或漏洞 – 包括任何问题、不一致或令人困惑的行为。 屏幕截图或屏幕录制特别有用。

  • 改进建议 - 分享改进可用性、扩大覆盖范围或增强 GitHub Copilot 响应的想法。