Semgrep 是高效检测 PHP 安全漏洞的静态分析工具,支持 OWASP Top 10 扫描、PHP 专用规则、CMS 插件识别、自定义业务逻辑规则及 CI/PR 集成。

Semgrep 是检测 PHP 安全漏洞非常高效的选择,它不依赖运行环境,直接分析源码语法结构,对 SQL 注入、XSS、反序列化、文件包含、CSRF 逻辑缺陷等常见 PHP 风险有良好覆盖能力。
用内置规则快速扫描 OWASP Top 10 类漏洞
Semgrep 自带 p/owasp-top-ten 规则集,专为 Web 应用高频漏洞设计,开箱即用:
- 执行命令:
semgrep --config p/owasp-top-ten --lang php .(扫描当前目录下所有 PHP 文件) - 该规则集会识别如
mysql_query($_GET['id'])、echo $_GET['name']、unserialize($_POST['data'])等高危模式 - 结果按严重等级(CRITICAL / HIGH / MEDIUM)分类,附带行号、上下文代码片段和修复提示
聚焦 PHP 特有风险的针对性扫描
除通用规则外,可叠加 PHP 专用规则提升检出精度:
- 启用社区维护的 PHP 安全规则:
semgrep --config p/php --lang php . - 重点覆盖:
–allow_url_include=On相关配置风险(配合.php.ini或.htaccess扫描)
– 危险函数调用:eval()、assert()、create_function()、preg_replace('/.*/e')
– 文件操作绕过:file_get_contents($_GET['file'])、include($_GET['page']) - 对 CMS 类项目(如 WordPress 插件),还可加
--config p/wordpress辅助识别插件级漏洞
自定义规则精准捕获业务逻辑漏洞
当标准规则无法覆盖定制化逻辑(如 Token 校验缺失、Referer 仅校验存在性)时,可写 YAML 规则:
立即学习“PHP免费学习笔记(深入)”;
- 示例:检测未验证 CSRF Token 的 POST 处理逻辑
- pattern: |
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$userId = $_POST['user_id'];
changePassword($userId, $_POST['new_pass']);
} - 保存为
csrf-missing.yml,运行:semgrep --config csrf-missing.yml --lang php . - 支持元变量(如
$INPUT)、路径限定(paths: include: ["*controller*.php"])和多行模式匹配
集成进开发流程减少漏报误报
避免“扫完就扔”,让 Semgrep 成为持续防护环节:
- PR 阶段只扫变更文件:
semgrep --config p/php --diff - 用
// nosemgrep: rule-id注释临时忽略已知安全的误报 - 建立
.semgrepignore排除测试文件、第三方库、生成代码目录 - 结合 VS Code 插件或 SARIF 输出,实现编辑器内实时提示



















