
1. 项目概述为什么Java开发者需要关注SAST工具在当前的软件开发与安全实践中代码安全已经从“加分项”变成了“必选项”。作为一名有十多年经验的Java开发者我亲眼见证了项目从只关注功能实现到如今必须将安全左移将漏洞发现和修复融入开发流程的转变。在这个过程中静态应用程序安全测试工具也就是SAST扮演了至关重要的角色。它就像一位不知疲倦的代码审查员能在代码编写、提交甚至编译之前就帮你揪出那些潜在的安全风险比如SQL注入、命令执行、不安全的反序列化等。然而传统的商业SAST工具往往价格昂贵、配置复杂对中小团队或个人开发者并不友好。这也是为什么当我接触到“铲子SAST”这款工具时觉得有必要写一篇详细的指南。它定位为“简单、好用、价格厚道”这恰恰击中了广大Java开发者和安全工程师的痛点。本文的目的就是为你提供一份从零开始到实战上手的“保姆级”教程。无论你是想提升自己代码安全性的开发者还是负责团队安全审计的工程师甚至是正在学习安全测试的学生都能通过这篇文章快速掌握使用铲子SAST进行高效代码审计的方法。我们将不仅讲解工具怎么用更会深入背后的原理分享实战中的避坑经验让你知其然更知其所以然。2. 铲子SAST核心功能与工作原理拆解在深入实操之前我们有必要先搞清楚铲子SAST到底能做什么以及它是如何工作的。理解其核心机制能帮助我们在后续使用中更好地解读扫描结果甚至进行自定义规则的编写。2.1 SAST工具的核心价值在代码层面“排雷”SAST即静态应用程序安全测试其核心思想是在不运行程序的情况下通过分析源代码、字节码或中间代码来寻找安全漏洞。你可以把它想象成一位极其严谨的语法和语义检查官。与动态测试需要运行程序、渗透测试需要模拟攻击不同SAST的优势在于“早发现”和“全覆盖”。早发现在开发阶段、代码提交前或CI/CD流水线中集成SAST可以将安全缺陷扼杀在摇篮里修复成本远低于在生产环境发现漏洞后再进行热修复。全覆盖只要代码被扫描到理论上所有执行路径都会被分析不会像动态测试那样受限于测试用例的覆盖范围。对于Java项目而言常见的Spring Boot、MyBatis、JDBC数据库操作、文件上传、日志记录等模块都是安全漏洞的高发区也正是SAST工具重点关照的对象。铲子SAST作为一款专注于Java语言的工具其设计目标非常明确降低使用门槛。它通过内置丰富的漏洞规则库、提供简洁的图形化界面和灵活的扫描配置让安全审计不再是大厂安全团队的专属普通开发团队也能快速上手。2.2 铲子SAST的技术架构与扫描流程虽然作为使用者我们无需深究其全部实现细节但了解其大致的扫描流程对于理解扫描报告、判断误报/漏报非常有帮助。根据其官方描述和我的使用经验铲子SAST的扫描流程可以概括为以下几个关键步骤代码解析与抽象语法树构建工具首先会读取你的Java源代码也支持对JAR/WAR包进行反编译将其解析成抽象语法树。AST是代码结构的一种树状表示它剥离了具体的格式如空格、换行只保留语法逻辑这是进行深度代码分析的基础。数据流与控制流分析这是SAST的核心。工具会分析代码中数据是如何传递和变化的。例如它追踪一个来自HTTP请求的参数源头经过若干次赋值、拼接最终是否未经净化就传递到了执行SQL语句的方法汇聚点。控制流分析则关注代码的执行路径判断某些存在漏洞的代码分支是否可能被执行。规则匹配与漏洞判定工具内置了一套漏洞规则库。每一条规则都定义了特定的漏洞模式例如“从HttpServletRequest.getParameter获取的字符串直接拼接进Statement.executeQuery”。分析引擎会将AST和数据流分析的结果与这些规则进行匹配一旦匹配成功就会标记为一个潜在漏洞。结果汇总与报告生成将所有匹配到的漏洞点按照危险等级如高危、中危、低危、漏洞类型、所在文件、行号等信息进行汇总最终生成一份详细的扫描报告支持HTML、PDF等多种格式导出。注意SAST工具不可避免地会产生一定比例的误报和漏报。误报是指将安全的代码误判为漏洞漏报是指未能发现真实存在的漏洞。理解这一点很重要扫描报告不是最终判决书而是需要开发者结合业务逻辑进行人工复核的重要参考。2.3 与其他Java代码审计工具的横向对比在决定采用一款工具前了解一下市场同类产品是很有必要的。这里我简单对比一下铲子SAST与一些常见的选择工具名称类型/模式核心优势潜在不足适用场景铲子SAST商业化SAST提供免费额度1. 中文界面上手极快2. 针对Java生态优化深入3. 性价比高付费灵活1. 目前主要专注于Java2. 规则库相比顶级商业工具可能略少中小型Java团队、个人开发者、安全入门学习SonarQube开源/商业代码质量平台1. 功能全面质量安全2. 生态插件丰富3. 支持CI/CD深度集成1. 配置和运维相对复杂2. 高级安全规则需商业版中大型企业追求代码质量和安全一体化管理Fortify SCA商业SAST1. 规则库极其庞大且更新快2. 支持语言众多分析深度强1. 价格非常昂贵2. 使用复杂学习曲线陡峭对安全有极高要求的大型金融、电信等企业SpotBugs开源静态分析工具1. 完全免费2. 可作为Maven/Gradle插件集成1. 安全规则有限更多是Bug查找2. 需要一定的配置和调优开发者本地代码检查作为基础安全补充通过对比可以看出铲子SAST在易用性和成本之间找到了一个很好的平衡点。对于大多数Java项目来说它内置的规则已经能够覆盖OWASP Top 10等主流安全风险足以作为项目安全防线的重要一环。3. 从零开始铲子SAST的安装与环境配置理论讲得再多不如动手实操。这一部分我将带你完成铲子SAST工具的下载、安装和基础配置。整个过程力求清晰确保即便是刚入门的朋友也能顺利完成。3.1 工具获取与系统要求铲子SAST提供了非常便捷的获取方式。其官方发布在GitHub上你可以直接访问其仓库进行下载。根据网络资料显示工具提供了Windows、macOS和Linux版本覆盖了主流的开发环境。下载步骤打开浏览器访问铲子SAST的GitHub仓库地址例如https://github.com/Chanzi-keji/chanzi请以官方最新发布为准。在仓库的“Releases”发布页面找到最新稳定版本的发布包。通常你会看到以.exe(Windows)、.dmg(macOS) 或.tar.gz(Linux) 结尾的安装包。根据你的操作系统下载对应的安装包。对于Windows用户直接下载.exe文件是最简单的。系统环境要求操作系统Windows 7/10/11 macOS 10.12 或主流Linux发行版如Ubuntu 16.04, CentOS 7。Java环境这是最关键的一点。铲子SAST本身是一个Java应用因此需要本地安装Java运行环境。推荐安装JDK 8或JDK 11这两个是长期支持版本兼容性最好。你可以通过命令行输入java -version来检查是否已安装及版本信息。内存建议至少4GB可用内存。扫描大型项目时更多的内存有助于提升分析速度。磁盘空间安装包本身不大但需要预留至少1GB空间用于存放扫描过程中的临时文件和分析结果。实操心得在安装前务必确认好Java环境。我曾遇到过因为系统默认Java版本过高如JDK 17导致工具界面启动异常的情况。如果遇到问题尝试切换或重新安装一个JDK 8/11环境往往能解决。3.2 安装与首次启动安装过程非常简单几乎就是“下一步”到底。Windows双击下载的.exe安装程序跟随向导选择安装路径即可。安装完成后可以在开始菜单或桌面上找到“铲子SAST”的快捷方式。macOS打开下载的.dmg文件将应用图标拖拽到“应用程序”文件夹中。Linux解压下载的.tar.gz包例如tar -xzf chanzi-linux.tar.gz然后进入解压后的目录找到可执行脚本通常为.sh文件并运行。首次启动工具你会看到一个简洁的登录界面。根据资料铲子SAST采用了微信扫码登录的方式这省去了注册账号、记忆密码的麻烦。直接用手机微信扫描界面上的二维码授权登录即可。登录后工具会与你的微信账号进行绑定用于管理你的扫描任务和免费额度。3.3 基础配置与偏好设置成功登录后建议先花几分钟进行一些基础配置让工具更贴合你的使用习惯。扫描引擎设置在设置或偏好设置中通常可以找到关于扫描深度的选项。对于首次扫描或大型项目可以先使用“标准”或“快速”模式以了解工具性能。后续深度审计时再切换到“深度”模式。规则集管理工具应该会允许你启用或禁用某些规则集。例如你可以暂时关闭与“代码风格”或“性能”相关的规则如果它有的话专注于安全漏洞的扫描。或者根据项目使用的框架如Spring MVC, Struts2针对性开启相关规则。报告模板查看报告输出的默认格式如HTML和保存路径是否合适可以按需修改。网络代理如果你的开发环境需要通过代理服务器访问外部网络如下载依赖或上传报告记得在工具的网络设置中配置好代理信息否则可能导致扫描过程中依赖解析失败。完成以上步骤你的铲子SAST就已经整装待发可以开始创建第一个扫描任务了。4. 核心功能实战创建与执行你的第一个扫描任务现在让我们进入最核心的环节——使用铲子SAST扫描一个真实的Java项目。我将以一个典型的Spring Boot Web应用为例带你走完从新建任务到查看报告的完整流程。4.1 准备扫描目标选择一个合适的项目为了演示我们需要一个包含一些常见安全漏洞模式的Java项目。你可以使用自己的项目也可以找一个开源项目。根据提供的资料示例中使用了https://gitee.com/wukongcrm/72crm-java.git这个项目。我们也可以选择其他类似的项目关键是要有清晰的源码结构。项目选择建议对于学习建议选择一个结构清晰、规模适中的开源Spring Boot项目。太简单的项目如Hello World可能扫不出东西太复杂的项目如大型ERP首次扫描时间可能较长。对于自身项目可以直接扫描你正在开发或维护的项目代码库。这是最有价值的实践。这里我假设我们准备扫描一个本地的Spring Boot项目其目录结构如下/my-springboot-app ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/com/example/demo/ │ │ │ ├── controller/UserController.java │ │ │ ├── service/UserService.java │ │ │ └── ... │ │ └── resources/ │ └── test/ └── ...4.2 新建扫描任务详解每一步配置在铲子SAST的主界面找到并点击“新建任务”或类似的按钮。接下来你会看到任务配置界面这里有几个关键选项需要填写任务名称给你的扫描任务起一个易于识别的名字例如“MyApp-安全初筛-20231027”。扫描目标本地代码目录最常见的方式。点击“浏览”或“选择目录”定位到你本地项目的根目录即包含pom.xml或build.gradle的文件夹。工具会自动识别Java项目。Git仓库地址如果你想像资料中那样直接扫描远程Git仓库可以填入仓库的HTTPS或SSH URL。工具会先克隆代码到临时目录再进行扫描。上传代码压缩包如果你只有源代码的ZIP包也可以直接上传。扫描配置扫描模式通常有“快速扫描”和“深度扫描”。快速扫描耗时短但可能漏掉一些深层调用链的漏洞。首次建议用“深度扫描”以获得全面结果。规则集选择要启用的规则集合。全选是一个好的开始。扫描后如果发现某些规则误报率高可以后续在任务设置中排除。排除路径有些目录或文件你肯定不想扫描比如target/,build/,node_modules/, 或者存放静态资源、文档的目录。在这里添加这些路径可以显著提升扫描速度避免无关干扰。例如**/target/**,**/*.md。高级选项可选Java版本指定项目使用的Java版本帮助分析引擎更准确。依赖分析是否分析项目的第三方库通过Maven或Gradle。开启后工具会尝试识别依赖库中已知的公开漏洞CVE这非常有用但可能会增加扫描时间。配置完成后点击“开始扫描”。工具会显示扫描进度包括代码解析、依赖下载如果开启、漏洞分析等阶段。4.3 扫描过程监控与中断处理扫描时间取决于项目大小和复杂度。一个中等规模的Spring Boot项目几十个Controller上百个Service深度扫描可能在5到15分钟内完成。在扫描过程中你可以看到实时日志了解当前正在分析哪个文件或者遇到了什么问题。可能遇到的问题及处理依赖下载失败如果网络不畅或仓库地址配置有问题可能导致Maven依赖下载超时。你可以考虑在扫描前先在本地命令行执行mvn clean compile或gradle build确保所有依赖都已就绪然后在工具中关闭“在线依赖分析”选项或配置正确的Maven镜像地址。内存不足扫描大型项目时如果工具卡住或崩溃可能是内存不足。尝试关闭其他占用内存的软件或者在工具启动脚本中增加JVM内存参数如果工具提供此配置。扫描时间过长如果项目非常大可以考虑使用“快速扫描”模式或者更精细地配置排除路径只扫描核心的业务代码目录。耐心等待扫描完成最激动人心的部分——结果分析——就要来了。5. 深度解析扫描报告从漏洞告警到问题修复扫描完成后工具会自动跳转到结果页面或者你可以从任务列表进入查看。一份清晰的扫描报告是SAST工具价值的最终体现。这里我将教你如何读懂它并转化为实际的修复行动。5.1 报告概览与漏洞分类报告首页通常会有一个仪表盘展示本次扫描的概况扫描统计总文件数、总代码行数、扫描耗时。漏洞摘要以饼图或柱状图展示高、中、低危漏洞的数量分布。漏洞类型分布列出发现最多的几种漏洞类型如SQL注入、跨站脚本、路径遍历等。重点关注漏洞列表这是核心内容。列表通常包含以下列漏洞级别严重、高危、中危、低危、漏洞类型、所在文件、行号、漏洞描述、修复建议。5.2 典型漏洞案例分析与修复实战我们以最常见的两种漏洞为例看看铲子SAST会如何报告以及我们该如何修复。案例一SQL注入漏洞报告示例级别高危类型SQL注入文件UserController.java行号45描述用户可控数据username未经净化直接拼接至SQL语句中可能导致SQL注入攻击。代码片段GetMapping(/user) public String getUser(RequestParam String username) { String sql SELECT * FROM users WHERE name username ; // 使用Statement执行sql... return jdbcTemplate.queryForList(sql).toString(); }原理分析攻击者可以输入admin OR 11作为username使得最终SQL语句变为SELECT * FROM users WHERE name admin OR 11从而绕过身份验证查询出所有用户数据。修复方案使用预编译语句PreparedStatement这是根本解决方法。将SQL语句中的变量用占位符?代替然后通过set方法传参数据库驱动会负责参数的安全处理。String sql SELECT * FROM users WHERE name ?; return jdbcTemplate.queryForList(sql, username); // Spring JdbcTemplate 自动使用预编译使用ORM框架的查询构建器如MyBatis-Plus的QueryWrapper或JPA的Criteria API它们内部都使用了预编译。实操心得不要试图用字符串替换过滤单引号等方式来“修复”SQL注入这是不安全的。预编译是唯一被广泛认可的安全方式。案例二跨站脚本漏洞报告示例级别中危/高危取决于上下文类型跨站脚本文件MessageController.java行号32描述用户输入content直接输出到HTML页面未进行转义可能导致XSS攻击。代码片段PostMapping(/addMsg) public String addMsg(RequestParam String content, Model model) { model.addAttribute(msg, content); // 危险直接放入模型 return showMessage; }对应的Thymeleaf模板showMessage.htmlp th:text${msg}/p如果错误地使用th:utext或直接${msg}则危险。原理分析攻击者提交一段恶意脚本作为content如scriptalert(xss)/script。如果该内容未经转义直接输出到HTML页面浏览器就会执行这段脚本可能导致Cookie窃取、页面篡改等。修复方案输出编码在现代模板引擎中默认的表达式输出通常是安全的会进行HTML转义。例如Thymeleaf的th:textFreeMarker的${msg}。关键在于绝对不要使用“不转义”的输出指令如Thymeleaf的th:utext除非你非常确定内容是安全的。明确指定编码在需要输出到不同上下文时如HTML属性、JavaScript、CSS使用专门的编码函数。例如在纯Servlet环境中使用ESAPI.encoder().encodeForHTML(userInput)。内容安全策略在HTTP响应头中设置CSP作为最后一道防线。实操心得框架的默认安全机制很重要。了解你使用的模板引擎的默认行为。对于富文本内容如博客正文需要使用白名单过滤的HTML解析器如Jsoup而不是简单的转义。5.3 误报处理与规则调优SAST工具不是神误报是常态。当你看到一个漏洞告警时需要结合业务逻辑判断其真实性。如何判断误报数据源是否可信如果输入参数并非来自不可信的用户例如来自内部配置的常量、经过严格校验的枚举值那么相关的注入漏洞可能就是误报。是否存在全局防护如果项目在Filter或Interceptor层对所有输入进行了统一的过滤或转义那么工具在方法内部检测到的漏洞可能已被防护。但要注意这种全局防护必须可靠且全覆盖。漏洞路径是否可达通过数据流分析工具可能发现了一条从源头到汇聚点的路径但这条路径在运行时可能因为某些条件判断永远走不到。在铲子SAST中处理误报 大多数SAST工具都提供了“标记为误报”或“忽略此问题”的功能。在铲子SAST中你应该能找到类似选项。对于确认为误报的条目将其标记这样在后续的扫描中工具就不会再报告同一个问题。但是请务必谨慎使用此功能最好在团队内进行复核避免将真正的漏洞忽略掉。更高级的做法是自定义规则。如果某种误报模式在你的代码中反复出现而工具内置规则无法识别你可以学习编写自定义规则来排除这种模式或者增强规则以发现工具未覆盖的漏洞。这需要你对工具的原理和规则语法有更深的理解。6. 集成与进阶将SAST融入开发工作流单独运行SAST工具只是第一步。要让安全真正“左移”必须将其集成到开发流程中让安全检查自动化、常态化。6.1 本地集成在IDE或构建工具中使用IDE插件最理想的本地集成方式。如果铲子SAST未来能提供IntelliJ IDEA或Eclipse插件开发者就可以在编码时实时看到安全警告像语法错误一样直观。目前可以将其作为外部工具配置到IDE中在保存文件或编译时自动触发扫描当前文件。Maven/Gradle插件这是目前更可行的自动化方案。虽然铲子SAST可能尚未提供官方插件但你可以通过其命令行接口与构建工具整合。思路在项目的pom.xml中通过maven-antrun-plugin或exec-maven-plugin在verify或install阶段调用铲子SAST的命令行版本如果提供进行扫描。示例概念性build plugins plugin groupIdorg.codehaus.mojo/groupId artifactIdexec-maven-plugin/artifactId version3.1.0/version executions execution phaseverify/phase !-- 在测试之后打包之前执行 -- goals goalexec/goal /goals /execution /executions configuration executablejava/executable arguments argument-jar/argument argument/path/to/chanzi-cli.jar/argument argument--project/argument argument${project.basedir}/argument argument--report/argument argument${project.build.directory}/sast-report.html/argument /arguments /configuration /plugin /plugins /build效果每次执行mvn clean verify都会自动进行代码安全扫描并生成报告。你可以进一步配置如果发现高危漏洞就让构建失败强制开发者修复。6.2 持续集成/持续部署流水线集成这是SAST价值最大化的地方。在CI/CD流水线如Jenkins、GitLab CI、GitHub Actions中集成SAST可以确保每次代码合并请求都经过安全检查。以GitHub Actions为例的集成思路在项目根目录创建.github/workflows/sast-scan.yml。在 workflow 中定义一个 job步骤包括检出代码、设置Java环境、下载铲子SAST命令行工具、运行扫描。配置扫描结果的处理。可以将HTML报告上传为流水线制品或者使用工具提供的API将结果解析后以注释的形式反馈到Pull Request中让代码评审者一目了然。可以设置质量门禁例如如果出现“严重”或“高危”漏洞则让本次流水线运行失败阻止代码合并。这种集成方式将安全审查从“事后抽查”变成了“事前必检”极大地提升了团队的整体安全水位。6.3 制定团队安全扫描规范工具用起来了接下来需要建立规范让它发挥持续的作用扫描频率个人开发者应在提交代码前本地扫描团队应确保CI流水线每次合并请求必扫定期如每周对主干分支进行全量深度扫描。漏洞处理流程分级处理严重/高危漏洞必须立即修复中危漏洞应在当前迭代内修复低危/信息类问题可规划修复。责任到人扫描报告应自动通知到代码提交者或模块负责人。漏洞跟踪将SAST发现的漏洞录入到团队的问题跟踪系统如Jira像处理功能Bug一样跟踪其修复状态。规则库更新关注铲子SAST的规则更新定期升级工具版本以应对新出现的安全威胁。培训与分享定期在团队内分享典型的漏洞案例和修复方案提升全员的安全编码意识。7. 常见问题排查与使用技巧实录即使按照指南操作在实际使用中仍可能遇到各种问题。这一部分我汇总了一些常见的情况和解决思路以及一些能提升效率的小技巧。7.1 扫描过程常见问题排查问题1扫描失败提示“无法解析项目依赖”或“构建失败”。原因分析铲子SAST在扫描时可能需要解析项目的pom.xml或build.gradle来理解项目结构和依赖关系。如果本地Maven仓库不完整或者项目使用了私有仓库且未配置或者构建脚本本身有错误都会导致此问题。解决步骤在项目根目录下手动执行mvn clean compile -DskipTests或gradle compileJava确保项目能在本地独立编译成功。检查网络连接确保能访问Maven中央仓库或你配置的镜像仓库。在铲子SAST的设置中检查是否配置了正确的Maven本地仓库路径和配置文件settings.xml。对于特别复杂的多模块项目可以尝试在工具中只扫描核心的业务模块而非整个父工程。问题2扫描结果为空没有报告任何漏洞。原因分析这通常有两种可能。一是你的代码确实非常安全符合安全编码规范二是扫描配置或目标选择有误导致工具没有正确分析代码。解决步骤验证扫描目标确认你选择的扫描目录确实是Java源代码根目录并且里面包含.java文件。测试规则集创建一个包含明显漏洞的测试文件例如一个存在SQL注入的Servlet将其放入项目中进行扫描看工具是否能发现。这可以验证工具本身是否工作正常。检查排除路径确认你没有不小心将src/main/java这样的核心目录添加到排除列表中。尝试深度扫描模式快速扫描模式可能会跳过一些复杂的分析。问题3扫描报告中的漏洞位置行号不准确。原因分析SAST工具是通过静态分析推断漏洞当代码经过混淆、或存在复杂的继承和反射时定位可能产生偏移。此外如果扫描的是编译后的.class文件或反编译后的代码行号可能与源代码对不上。解决思路行号是一个重要参考但并非唯一依据。结合漏洞描述和代码片段在报告指出的文件和方法范围内进行人工审查通常能找到问题所在。确保扫描时提供的是最新的、未混淆的源代码。7.2 提升扫描效率与准确性的技巧增量扫描对于大型项目每次全量扫描耗时很长。如果工具支持可以配置只扫描上次扫描后有变动的文件如基于Git Diff。如果不支持可以自己写脚本在CI中只对变更文件所在模块进行扫描。合理利用排除项精准配置“排除路径”。除了构建输出目录第三方库的源码、生成的代码如MyBatis的Mapper接口、单元测试代码等通常也可以排除以缩短扫描时间聚焦业务代码。基线扫描在项目初始阶段或引入SAST工具时进行一次全面的“基线扫描”。将这次扫描发现的所有问题记录下来作为“历史债务”。之后可以将这些历史问题在工具中标记为“已接受”或“忽略”并制定计划逐步修复。这样后续的扫描报告就只关注新引入的问题避免报告被历史问题淹没失去重点。人工复核流程建立简单的复核流程。对于工具报出的每一个中危及以上漏洞要求开发者必须点击“确认”或“误报”并附上简要说明。这个简单的动作能极大提高开发者对安全问题的重视程度并减少误报的干扰。结合其他工具SAST不是银弹。将其与软件成分分析工具SCA用于检查第三方库漏洞、动态应用安全测试工具DAST以及人工代码评审相结合才能构建起立体的安全防御体系。7.3 关于铲子SAST的免费与付费根据资料铲子SAST采用了“免费增值”的模式。免费版每月提供一定次数的扫描任务如10次这对于个人开发者、小团队或低频扫描场景基本够用。如果扫描需求更大或者需要更多高级功能如团队协作、自定义规则深度编辑、更快的扫描速度等则可以考虑付费订阅。我的建议是先充分使用免费额度将工具集成到你的开发流程中验证其价值。当它确实成为你工作中不可或缺的一环并且免费额度开始捉襟见肘时再考虑升级。年付799元的价格对于一款能切实提升代码安全性的工具来说如果分摊到团队每个人成本并不高但带来的风险降低价值是巨大的。工具只是辅助关键还是使用工具的人。希望这篇指南能帮助你顺利上手铲子SAST并将其转化为你开发武器库中一件得心应手的“安全铲子”在代码的土壤里提前挖出那些深埋的安全隐患。