静态分析是一个非常好用的工具,使用它可以帮助开发人员或者安全人员在开发阶段发现代码中的bug和安全问题。静态分析是一项综合性的系统工程。每个开发人员和安全人员都需要了解其原理并能够使用工具进行初步分析。在本文中,我们通过在Docker中搭建基本的Semgrep环境来介绍Semgrep这个开源、快速、高效的多语言静态分析工具,并通过一些简单的例子来说明它的用法。概述Linters,例如用于Python的pylint或用于JavaScript的eslint非常适合通用的广泛语言标准。但是代码审查中的常见问题呢,例如使用print语句而不是记录过程,或者在for循环(Go-specific)中使用defer语句,或者多级嵌套循环等。大多数开发人员没有语言解析经验。因此,在中小型团队中很少看到自定义Lint规则。虽然没有任何一种linter或语言比另一种复杂得多(都是AST操作),但学习每种语言linter的AST和框架需要付出很小的代价。semgrep规则的优点之一是可以学习semgrep模式匹配语法(非常简单),然后为任何一种语言编写规则。Semgrep使用标准代码表达式进行模式匹配,无需复杂的查询或正则化。它可用于DevSecOps的所有阶段:代码编写、代码提交或CI运行时以查找错误和漏洞。它的精确规则看起来像要搜索的代码,无需遍历抽象语法树或与正则表达式死锁。与传统的正则表达式(和传统的grep)不同,它可以找到递归模式。这使得它作为学习在任何语言中寻找模式的工具特别有用。Semgrep还支持容器化部署和运行。在emgrep官方注册表中,有Semgrep社区维护的包安全性、正确性、性能、代码质量、bug等方面的1000多条规则,可以直接使用。Semgrep由软件安全公司r2c开发并提供商业支持。目前已经有大量企业在生产环境中使用,同时还有很多工具,比如NodeJsScan等底层支持引擎。基本准备本文中的所有示例都需要运行docker,并根据semgrep基础镜像返回corp/semgrep。docker的安装配置过程我们就不介绍了。首先从官方docker拉取一个最新的镜像:dockerpullreturntocorp/semgrep:latestsemgrep有一个在线工具(semgrep.dev/editor/)。如果您没有docker环境,可以通过在线工具示例进行尝试。如果在PHP中找到eval语句,如果你想让脚本使用PHP中的eval函数,你会得到提示:php/test.php
