返回市场
斯尼克扫描工具

斯尼克扫描工具

作者:snyk68 星标更新:2025-11-21

项目介绍

Snyk 语言服务器 (Snyk-LS)

构建 Go 二进制文件 发布 Go 二进制文件 贡献者公约

支持的功能

语言服务器遵循 语言服务器协议, 并与 Snyk 开源、Snyk 基础设施即代码和 Snyk 代码集成。对于前两者,它使用 Snyk CLI 作为数据提供者,对于后者,它直接连接到 Snyk 代码 API。

目前,语言服务器支持以下操作:

  • 在打开文档时向客户端发送诊断信息,如果该文档是当前文件夹集的一部分。
  • 启动文件夹扫描并在启动时发送诊断信息。
  • 根据命令启动所有文件夹的工作区扫描。
  • 缓存诊断信息直到保存或触发新的工作区扫描。
  • 在保存文档时使缓存失效,并重新获取已保存文档的诊断信息。
  • 提供范围计算以正确突出显示 Snyk 开源问题。
  • 提供带有诊断详情和后续链接的格式化悬停信息。
  • 向客户端报告后台任务的进度。
  • 向客户端发送通知及日志消息。
  • 当需要时进行身份验证,使用 OAuth2 或令牌认证,并在必要时打开网页。
  • 如果有问题打开网页,则将身份验证 URL 复制到剪贴板。
  • 自动下载 Snyk CLI,如果没有找到或配置到 XDG_DATA_HOME。
  • 根据传输的设置选择性激活产品。
  • 将扫描错误作为诊断信息报告给语言服务器客户端。
  • 代码透镜以从编辑器内导航 Snyk 代码数据流。
  • 代码操作用于编辑器内的命令,如打开浏览器、快速修复或打开 Snyk 学习课程。

实现的操作

语言服务器协议支持

请求

  • 初始化
  • 退出
  • 文档代码操作
  • 文档代码透镜
  • 文档关闭
  • 文档保存
  • 文档悬停
  • 文档内联值
  • 关闭
  • 工作区更改工作区文件夹
  • 工作区更改配置
  • 工作区执行命令
  • 窗口完成进度创建(从服务器 -> 客户端)
  • 窗口显示消息请求
  • 窗口显示文档

通知

  • $/进度

  • $/取消请求

  • 文档发布诊断

    • 参数:types.PublishDiagnosticsParams
    • 示例:Snyk 开源
    {
      "uri": "file:///path/to/file",
      "diagnostics": [
        {
          "range": {
            "start": { "line": 1, "character": 0 },
            "end": { "line": 2, "character": 0 },
          },
          "severity": 1,
          "code": "S100",
          "source": "Snyk",
          "message": "消息",
          "tags": ["安全"],
          "data": {
            "id": "123",
            "issueType": "漏洞",
            "packageName": "包名",
            "packageVersion": "包版本",
            "issue": "问题",
            "additionalData": {
              "ruleId": "规则ID",
              "identifiers": {
                "cwe": ["cwe"],
                "cve": ["cve"]
              },
              "description": "描述",
              "language": "语言",
              "packageManager": "包管理器",
              "packageName": "包名"
            }
          }
        }
      ]
    }
    
    • 示例:Snyk 代码
    {
      "uri": "file:///path/to/file",
      "diagnostics": [
        {
          "range": {
            "start": { "line": 1, "character": 0 },
            "end": { "line": 2, "character": 0 },
          },
          "severity": 1,
          "code": "S100",
          "source": "Snyk",
          "message": "消息",
          "tags": ["安全"],
          "data": {
            "id": "123",
            "filePath": "文件路径",
            "range": {
              "start": { "line": 1, "character": 0 },
              "end": { "line": 2, "character": 0 },
            },
            "additionalData": {
              "message": "消息",
              "rule": "规则",
              "ruleId": "规则ID",
              "dataFlow": [
                {
                  "filePath": "文件路径",
                  "range": {
                    "start": { "line": 1, "character": 0 },
                    "end": { "line": 2, "character": 0 },
                  },
                }
              ],
              "cwe": "cwe",
              "isSecurityType": true
            }
          }
        }
      ]
    }
    
  • 窗口日志消息

  • 窗口显示消息

对语言服务器协议的自定义扩展(服务器 -> 客户端)

  • SDK 回调以从客户端检索配置的 SDK

    • 方法:workspace/snyk.sdks
    • 参数:types.WorkspaceFolder
    • 示例:
    [{
      "type": "java", // 或 python 或 go
      "path": "/path/to/sdk" // JAVA_HOME 对于 java,GOROOT 对于 Go,Python 可执行文件对于 Python
    }]
    
  • 文件夹配置通知

    • 方法:$/snyk.folderConfigs
    • 参数:types.FolderConfigsParam
    • 示例:
    {
        "folderConfigs":
        [
          {
            "folderPath": "the/folder/path",
            "baseBranch": "the-base-branch", // 例如 main
            "localBranches": [ "branch1", "branch2" ],
            "preferredOrg": "org-id", // 操作此文件夹时使用的组织。
            "orgMigratedFromGlobalConfig": true, // 由语言服务器设置以跟踪升级过程中的迁移。
            "orgSetByUser": true // 如果为假,则语言服务器自动确定组织。
          }
        ]
    }
    
  • 自定义发布诊断通知

    • 方法:$/snyk.publishDiagnostics316
    • 参数:types.PublishDiagnosticsParams
    • 注释:textDocument/publishDiagnostics 的别名
  • MCP 服务器 URL 通知以发布监听地址。服务器在 /messages 上监听 POST 请求,并在 /sse 上订阅 SSE。可以在 mcp 包的烟雾测试中找到一个示例。

    • 方法:$/snyk.mcpServerURL
    • 参数:types.McpServerURLParams
    • 示例:
    {
      "url": "https://127.0.0.1:7595"
    }
    
  • 身份验证通知

    • 方法:$/snyk.hasAuthenticated
    • 参数:types.AuthenticationParams
    • 示例:
    {
      "token": "the snyk token", // 这可以是一个 oauth2.Token 字符串或旧版令牌
      "apiUrl": "https://api.snyk.io"
    }
    
  • CLI 路径通知

    • 方法:$/snyk.isAvailableCli
    • 参数:types.SnykIsAvailableCli
    • 示例:
    {
      "cliPath": "/a/path/to/cli-executable"
    }
    
  • 可信文件夹通知

    • 方法:$/snyk.addTrustedFolders
    • 参数:types.SnykTrustedFoldersParams
    • 示例:
    {
      "trustedFolders": ["/a/path/to/trust"]
    }
    
  • 扫描通知

    • 方法:$/snyk.scan
    • 参数:types.ScanParams
    • 示例:成功扫描
    {
      "status": "success", // 可能的值:"error", "inProgress", "success"
      "product": "code", // 可能的值:"code", "oss", "iac"
      "folderPath": "/a/path/to/folder",
    }
    
    • 示例:失败扫描并带有错误
    {
      "status": "error",
      "product": "code",
      "folderPath": "/a/path/to/folder",
      "presentableError": {
        "cliError": {
          "code": "CLI_ERROR_CODE",
          "error": "发生了一个错误"
        },
        "showNotification": true,
        "treeNodeSuffixError": "(失败)"
      }
    }
    
  • 汇总面板状态通知

    • 方法:$/snyk.scanSummary
    • 参数:types.ScanSummary
    • 示例:
    {
      "scanSummary": "<html><body<p> 汇总 </p></body></html>"
    }
    

命令

  • NavigateToRangeCommand 导航客户端到给定的范围

    • 命令:snyk.navigateToRange
    • 参数:path, Range
  • WorkspaceScanCommand 触发所有工作区文件夹的扫描

    • 命令:snyk.workspace.scan
    • 参数:空
  • WorkspaceFolderScanCommand 触发给定工作区文件夹的扫描

    • 命令:snyk.workspaceFolder.scan
    • 参数:path
  • OpenBrowserCommand 在默认浏览器中打开给定的 URL

    • 命令:snyk.openBrowser
    • 参数:URL
  • LoginCommand 触发登录过程

    • 命令:snyk.login
    • 参数:空
  • CopyAuthLinkCommand 将身份验证 URL 复制到剪贴板

    • 命令:snyk.copyAuthLink
    • 参数:空
  • LogoutCommand 触发注销过程

    • 命令:snyk.logout
    • 参数:空
  • TrustWorkspaceFoldersCommand 检查可信的工作区文件夹并在必要时请求信任

    • 命令:snyk.trustWorkspaceFolders
    • 参数:空
  • OpenLearnLesson 在 Snyk 学习网站上打开给定的课程

    • 命令:snyk.openLearnLesson
    • 参数:
      • rule string
      • ecosystem string
      • cwes string(逗号分隔),例如 CWE-79,CWE-89
      • cves string(逗号分隔),例如 CVE-2018-11776,CVE-2018-11784
      • issueType int
      PackageHealth 类型 = 0
      CodeSecurityVulnerability = 1
      LicenseIssue = 2
      DependencyVulnerability = 3
      InfrastructureIssue = 4
      
  • GetLearnSession 返回 Snyk 学习网站上的给定课程

    • 命令:snyk.getLearnLesson
    • 参数:
      • rule string
      • ecosystem string
      • cwes string(逗号分隔),例如 CWE-79,CWE-89
      • cves string(逗号分隔),例如 CVE-2018-11776,CVE-2018-11784
      • issueType int
      PackageHealth 类型 =  0
      CodeSecurityVulnerability = 1
      LicenseIssue = 2
      DependencyVulnerability = 3
      InfrastructureIssue = 4
      
    • 结果:课程 JSON
    {
    "lessonId": "123",
    "datePublished": "2022-01-01",
    "author": "John Doe",
    "title": "Golang 入门",
    "subtitle": "Golang 初学者指南",
    "seoKeywords": ["Golang", "编程", "初学者"],
    "seoTitle": "学习 Golang",
    "cves": ["CVE-2022-1234", "CVE-2022-5678"],
    "cwes": ["CWE-123", "CWE-456"],
    "description": "本课程为初学者提供了 Golang 的入门介绍",
    "ecosystem": "编程",
    "rules": ["规则 1", "规则 2", "规则 3"],
    "slug": "golang-intro",
    "published": true,
    "url": "https://example.com/golang-intro",
    "source": "Example.com",
    "img": "https://example.com/images/golang-intro.png"
    }
    
  • SettingsSastEnabled 触发 API 调用以检查 Snyk 代码是否启用

    • 命令:snyk.getSettingsSastEnabled
    • 参数:空
    • 返回一个 *sast_contract.SastResponse 或者如果发生错误则返回错误和假。
  • GetActiveUser 触发 API 调用以获取当前登录用户或未登录时的错误

    • 命令:snyk.getActiveUser
    • 参数:空
    • 返回活动用户及其组织和组或未登录时的错误。
    {
      "id": "123",
      "username": "johndoe",
      "orgs": [
       {
         "name": "org1",
         "id": "org1_id",
         "group": {
            "name": "group1",
            "id": "group1_id"
         }
       }
      ],
    }
    
  • Code Fix Command 触发自动修复并应用第一个建议的更改

    • 命令:snyk.code.fix
    • 参数:
      • codeActionId string
      • AffectedFilePath string
      • range Range
    • 如果不成功则返回错误
  • Code Fix Diffs 允许检索自动修复建议的差异

    • 命令:snyk.code.fixDiffs
    • 参数:
      • issueID string(UUID)
    • 返回建议数组:
    [{
      "fixId": "123",
      "unifiedDiffsPerFile": {
        "path/to/file": "diff"
      }
    }]
    
    • 差异示例:
    
    --- /var/folders/vn/77lwfy3974g7vykcm5lr6mkh0000gn/T/Test_SmokeWorkspaceScanOssAndCode952013010/001/1
    +++ /var/folders/vn/77lwfy3974g7vykcm5lr6mkh0000gn/T/Test_SmokeWorkspaceScanOssAndCode952013010/001/1-fixed
    @@ -32,7 +32,8 @@
    
         test('应设置成功为 OK', function() {
           // 给定
    
    -      comp.password = comp.confirmPassword = 'myPassword';
    
    +      comp.password = process.env.TEST_PASSWORD;
    +      comp.confirmPassword = process.env.TEST_PASSWORD;
    
           // 当
           comp.changePassword();
    
  • Code Fix Apply Edit Command 触发自动修复并应用第一个建议的更改

  • Feature Flag Status Command 触发 API 调用以检查功能标志是否启用

    • 命令:snyk.getFeatureFlagStatus
    • 参数:
      • featureFlagType string
    • 返回一个对象,其中包含功能标志的状态和可选用户消息
      {
        "ok": true, // 布尔值表示功能是否启用(真或假)
        "userMessage": "可选用户消息" // 如果 'ok' 为假,则存在
      }
    
  • Clear Cache 清除持久或内存缓存或两者。

    • 命令:snyk.clearCache
    • 参数:
      • folderUri string,
      • cacheType 持久内存
  • Generate Issue Description 生成 HTML 格式的问题描述。

    • 命令:snyk.generateIssueDescription
    • 参数:
      • issueId string

安装

下载

发布流程存储生成的可执行文件,以便可以从 这里 下载。只需选择您想要构建工件的发布版本并下载与之关联的 zip 文件。目前,为 Windows、macOS 和 Linux 生成可执行文件。

当前发布的二进制文件可以通过 这个 Bash 脚本获取,请记住 协议版本 是下载