SonarSource/sonar-php

GitHub: SonarSource/sonar-php

SonarPHP 是 SonarQube 平台的 PHP 静态代码分析插件,帮助开发者在编码和持续集成过程中发现并修复 bug、安全漏洞和代码质量问题。

Stars: 428 | Forks: 108

# PHP 代码质量与安全

Build Quality Gate Status Coverage Maven Central GitHub

这个 SonarSource 项目是针对 PHP 语言的[静态代码分析器](https://en.wikipedia.org/wiki/Static_program_analysis),用作 [SonarQube](https://www.sonarqube.org/) 平台的扩展。它将通过帮助您查找和修复代码中的 bug、漏洞和异味,使您能够开发出具备[集成代码质量与安全](https://www.sonarsource.com/solutions/for-developers/?utm_medium=referral&utm_source=github&utm_campaign=clean-code&utm_content=sonar-php)的稳定且易于维护的项目。 # 功能特性 * 200+ 条规则 * 支持到 PHP 8.4 * 指标(复杂度、代码行数等) * 导入[单元测试与覆盖率结果](https://docs.sonarqube.org/latest/analysis/coverage/) * 支持[自定义规则](https://docs.sonarqube.org/latest/analysis/languages/php/) # 实用链接 * [项目主页](https://www.sonarsource.com/php/) * [文档](https://docs.sonarqube.org/latest/analysis/languages/php/) * [问题追踪](https://jira.sonarsource.com/browse/SONARPHP) * [可用规则](https://rules.sonarsource.com/php) * [SonarSource 社区论坛](https://community.sonarsource.com/) * [演示项目分析](https://sonarcloud.io/dashboard?id=monica) # 更多文档 * [控制流图文档](doc/CFG.md) ## 有疑问或反馈? 如需提供反馈(请求新功能、报告 bug 等),请使用 [SonarSource 社区论坛](https://community.sonarsource.com/)。请不要忘记注明语言(PHP!)、插件版本以及 SonarQube 版本。 如果您对如何使用插件有疑问(且[文档](https://docs.sonarqube.org/latest/analysis/languages/php/)未能帮到您),我们也鼓励您使用社区论坛。 ### SonarSource 社区论坛的主题 如需请求新功能,请在 [SonarSource 社区论坛](https://community.sonarsource.com/) 创建一个新帖子。即使您打算自己实现并将其提交给社区,也请先创建一个新帖子,以确保我们能够跟进。 ### Pull Request (PR) 要提交贡献,请为此仓库创建一个 pull request。请确保您遵循了我们的[代码风格](https://github.com/SonarSource/sonar-developer-toolset),并且所有的[测试](#testing)都能通过。 ### 自定义规则 如果您对某个规则有想法,但不确定是否所有人都需要它,您可以实现一个仅供您自己使用的[自定义规则](https://docs.sonarqube.org/latest/analysis/languages/php/)。 #### 自定义规则 API 变更 - **3.32** (2023 年 10 月) * 在 `CheckContext` API 接口中添加了额外的 `newIssue` 端点 - **3.15** (2021 年 1 月) * `PHPCustomRulesDefinition` 已被移除,该类自 2.13 版本(2018 年 3 月)起已废弃 * 移除了不再维护的 sslr-squid-bridge 依赖 - **3.11**,支持 PHP 8: * `ParameterTree#type()` 已废弃。请改用 `ParameterTree#declaredType()`。 * `ReturnTypeClauseTree#type()` 已废弃。请改用 `ReturnTypeClauseTree#declaredType()`。 * `ClassPropertyDeclarationTree#typeAnnotation()` 已废弃。请改用 `ClassPropertyDeclarationTree#declaredType()`。 * `CatchBlockTree#variable()` 现在可以返回 `NULL`。 * `FunctionCallTree#arguments()` 已废弃。请改用 `FunctionCallTree#callArguments()`。 * `AnonymousClassTree#arguments()` 已废弃。请改用 `AnonymousClassTree#callArguments()`。 * 新的 tree:`CallArgumentTree`。该 tree 现在用于包装作为参数传递的表达式。 * 新的表达式类型:`ThrowExpressionTree`。 * 新的表达式类型:`MatchExpressionTree`。 * `ParameterTree` 现在拥有 `visibility` 方法。 # 构建与测试 请按照以下说明在本地构建并运行测试。 要配置构建依赖项,请运行以下命令: ``` git submodule update --init -- build-logic/common ``` 为了在 git 操作期间始终获取最新版本的构建逻辑,请设置以下配置: ``` git config submodule.recurse true ``` ### 构建项目并运行单元测试 要构建插件并运行其单元测试,请从项目根目录执行以下命令: ``` ./gradlew build ``` ### 修复代码格式问题 在 Gradle 构建期间,会执行 spotless 格式检查。 也可以使用 `./gradlew spotlessCheck` 手动触发此检查。 它检查代码是否使用标准的 Sonar 规则进行了正确的格式化。 如果您的构建失败,只需运行以下命令即可修复格式: ``` ./gradlew spotlessApply ``` ### 修复许可证打包问题 在 Gradle 构建期间,会执行许可证打包检查。 也可以使用 `./gradlew validateLicenseFiles` 手动触发此检查。 它检查第三方库的许可证文件是否按照 SonarSource 标准正确打包到了资源文件夹中。 如果您的构建失败,可以通过运行以下命令来修复许可证打包: 请注意,这会覆盖 `resources/licenses/THIRD_PARTY_LICENSES` 文件夹中当前的许可证文件。 ``` ./gradlew generateLicenseResources ``` ### 重新生成依赖锁定文件 Gradle 锁定文件会固定依赖版本以确保构建的可复现性。当依赖发生更改时(例如,在 `build.gradle.kts` 或 `gradle/libs.versions.toml` 中更新版本后),请使用以下命令重新生成所有锁定文件: ``` ./gradlew writeAllLockFiles --write-locks ``` ### 集成测试 要运行集成测试,您需要创建一个如下所示的属性文件,并在名为 `ORCHESTRATOR_CONFIG_URL` 的环境变量中设置其位置。 ``` # SonarQube 服务器版本 sonar.runtimeVersion=9.9 ``` 在运行任何集成测试之前,请确保已检出子模块: ``` git submodule update --init ``` #### 插件测试 “插件测试”是一个额外的集成测试,用于验证插件的功能,例如指标计算、覆盖率等。要启动它: ``` ./gradlew its:plugin:integrationTest ``` #### 裁决测试 “裁决测试”是一个特殊的集成测试,它会启动对大型代码库的分析,将插件生成的问题保存在报告文件中,然后将这些结果与预期的 issues 集合(存储为 JSON 文件)进行比较。要启动裁决测试: ``` ./gradlew its:ruling:integrationTest ``` 此测试为您提供了检查每条规则生成的问题的机会,并确保它们符合您的预期。您可以通过查看分析结束时日志中提及的 SonarQube 本地 URL 来检查新增/丢失的问题。 如果一切看起来都没问题,您可以将位于以下路径的实际 issues 文件复制: ``` sonar-php/its/ruling/target/actual/ ``` 到预期 issues 所在的目录: ``` sonar-php/its/ruling/src/test/resources/expected/ ``` ### 规则描述 #### 更新规则描述 更新所有规则描述: ``` ./gradlew ruleApiUpdate ``` #### 生成新的规则描述 要从 [RSPEC](https://github.com/SonarSource/rspec) 获取规则 SXXXX 的静态文件: ``` ./gradlew ruleApiGenerateRule -Prule=SXXXX ``` 同样适用于特定的 RSPEC 分支(默认为 `master`): ``` ./gradlew ruleApiGenerateRule -Prule=SXXXX -Pbranch=my-branch ``` # 许可证 版权所有 2010-2025 SonarSource。 2024 年 11 月 29 日之后发布的 SonarQube 分析器,包括针对先前版本的补丁修复, 均基于 [Sonar Source-Available 许可证版本 1 (SSALv1)](LICENSE.txt) 发布。 请查看各个文件以了解适用于每个文件的许可证详情。 受 SSALv1 约束的文件将在其文件头中注明。
标签:Anchore, Bug检测, DevSecOps, JS文件枚举, Maven, odt, OpenVAS, PHP, PHP 8, SOC Prime, SonarLint, SonarQube, 上游代理, 代码坏味道, 代码复杂度, 代码安全, 代码审查, 代码规范, 单元测试, 后台面板检测, 域名枚举, 安全专业人员, 开发工具, 抽象语法树, 控制流图, 插件, 测试覆盖率, 漏洞枚举, 漏洞验证, 自动代码审查, 错误基检测, 静态代码分析, 静态分析器, 静态测试