Semgrep 導入指引
導入效應
| 效應 |
說明 |
| 自訂規則引擎 |
用簡單語法寫出团队專屬的 lint 規則,例如禁止 RestTemplate、強制 WebClient |
| AI 產碼守門 |
AI 產碼後直接掃描,確保符合團隊 Coding Standard |
| 多語言支援 |
Java / Python / TypeScript / Go / JavaScript 全支援 |
| 社群規則 |
上千條 pre-built 規則(OWASP、CWE、最佳實踐)可直接使用 |
| 快速掃描 |
比 SonarQube 快 10-100x,適合 PR 即時檢查 |
| 零設定 CI |
semgrep ci 一行指令搞定 |
1. 安裝 Semgrep
# macOS / Linux
brew install semgrep
# pip
pip install semgrep
# Docker
docker pull semgrep/semgrep
2. 基本使用
# 掃描專案(使用預設規則)
semgrep scan
# 使用 Java 規則
semgrep scan --config auto
# 掃描特定目錄
semgrep scan src/
# 只顯示 Error 級別
semgrep scan --config auto --error
3. 自訂規則
3.1 禁止 RestTemplate,強制使用 WebClient
# rules/no-rest-template.yaml
rules:
- id: no-rest-template
pattern: RestTemplate
message: "禁止使用 RestTemplate,請使用 WebClient (Reactive)"
languages: [java]
severity: ERROR
metadata:
category: best-practice
technology: [spring]
3.2 禁止 System.out
rules:
- id: no-system-out
pattern: System.out.println(...)
message: "禁止使用 System.out.println,請使用 Logger"
languages: [java]
severity: WARNING
fix: "logger.info($1)"
3.3 強制使用 Optional
rules:
- id: use-optional
pattern: |
if ($X != null) {
...
}
message: "考慮使用 Optional 替代 null 檢查"
languages: [java]
severity: WARNING
3.4 禁止 Hardcoded Password
rules:
- id: no-hardcoded-password
patterns:
- pattern: |
String $PASS = "...";
- metavariable-regex:
metavariable: $PASS
regex: (?i)(password|secret|token|key)
message: "禁止硬編碼密碼/金鑰"
languages: [java]
severity: ERROR
3.5 自訂規則集
# rules/team-rules.yaml
rules:
- id: enforce-logger
pattern: LoggerFactory.getLogger($CLASS.class)
message: "使用 SLF4J Logger"
languages: [java]
severity: WARNING
- id: no-optional-get
pattern: |
$OPT.get()
message: "避免 Optional.get(),使用 orElse/orElseThrow"
languages: [java]
severity: ERROR
- id: enforce-immutable
pattern: |
public class $CLASS { ... }
message: "考慮將資料類別設為 record 或 final"
languages: [java]
severity: WARNING
4. CI 整合
4.1 Azure Pipeline
- stage: CodeAnalysis
jobs:
- job: Semgrep
steps:
- script: |
pip install semgrep
semgrep scan --config auto --error --json --output semgrep-results.json
displayName: 'Semgrep Scan'
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: 'semgrep-results.json'
artifactName: 'semgrep-report'
condition: always()
4.2 GitHub Actions
- name: Semgrep
uses: semgrep/semgrep-action@v1
with:
config: >-
p/default
p/java
rules/no-rest-template.yaml
5. Semgrep Cloud
# 登入 Semgrep Cloud
semgrep login
# 雲端掃描(自動整合 GitHub PR)
semgrep ci
6. 與其他工具比較
| 特性 |
Semgrep |
Checkstyle |
SpotBugs |
| 規則語言 |
YAML Pattern |
XML Config |
Java API |
| 自訂規則 |
簡單 |
中等 |
困難 |
| 多語言 |
✅ |
Java 為主 |
Java 為主 |
| 掃描速度 |
極快 |
快 |
較慢 |
| AI 友善 |
✅ |
❌ |
❌ |
7. 參考資源