github CodeQL 支援 PHP 嗎?

error message:

Error: Did not recognize the following languages: php
Warning: This run of the CodeQL Action does not have permission to access the CodeQL Action API endpoints. This could be because the Action is running on a pull request from a fork. If not, please ensure the workflow has at least the 'security-events: read' permission. Details: Code scanning is not enabled for this repository. Please enable code scanning in the repository settings. - https://docs.github.com/rest

這看起來像是 CodeQL 分析時遇到了兩個常見的障礙:一個是語言設定問題,另一個是 GitHub API 的權限或設定問題。

以下是針對這兩項錯誤的解決方案:


1. 語言錯誤:Did not recognize the following languages: php

問題點: 雖然 CodeQL 支援 PHP,但系統提示無法辨認。

解決方法:

  • 檢查大小寫:.github/workflows/codeql.yml 檔案中,請確保語言名稱是全小寫
  • 更新 Action 版本: 確保你使用的是較新的版本(建議使用 @v3)。
  • 縮排與語法: 如果有多種語言,請使用列表格式。

YAML

# 範例設定
- name: Initialize CodeQL
  uses: github/codeql-action/init@v3
  with:
    languages: php  # 確保這裡是小寫

2. 權限與 API 錯誤:does not have permission

問題點: 工作流(Workflow)沒有權限將掃描結果上傳到 GitHub 的安全後台。這通常發生在從 Fork(分叉)出來的 PR,或是權限設定過於嚴格時。

解決方法:

你需要在 YAML 檔案中明確加入 permissions 區塊,賦予工作流寫入安全事件的權力:

YAML

permissions:
  actions: read
  contents: read
  security-events: write  # 這是上傳結果最關鍵的權限

3. 警告:Code scanning is not enabled

問題點: 你的儲存庫(Repository)尚未正式啟用 Code Scanning 功能。

操作步驟:

  1. 進入 GitHub 儲存庫的 Settings(設定)
  2. 點擊左側選單的 Code security and analysis
  3. 找到 Code scanning 並點擊 Set up 或確保其為開啟狀態。

[!IMPORTANT]

如果這是私有儲存庫(Private Repo),你必須擁有 GitHub Advanced Security 授權才能使用 CodeQL 的自動掃描功能。


快速檢查清單

問題類型應對動作
來自 Fork 的 PRSettings > Actions > General 確認是否允許 Fork 的 PR 執行工作流並存取秘密(Secrets)。
多語言設定若有其他語言,請寫成:languages: [ 'javascript', 'php' ]
GitHub Enterprise如果你在企業版環境,請確認 Runner 是否可以連線到 GitHub 的 API 端點。

請問你這個專案是公開的還是組織內的私有專案呢?這會影響到權限設定的細節。


討論串: Why doesn’t CodeQL support auditing PHP
https://github.com/github/codeql/issues/12376

這是一個很常見的誤解。簡單來說:CodeQL 絕對支援 PHP,但在 GitHub Action 的某些特定版本或環境下,可能會因為「配置方式」導致它找不到 PHP。

關於你提到的 issue (#12376) 以及相關的討論,這裡有幾個核心重點幫助你理解:

1. CodeQL 確實支援 PHP

PHP 是 CodeQL 官方支援的語言之一(包括分析 SQL 注入、跨站腳本 XSS 等漏洞)。你可以從官方文件中看到 PHP 始終在支援清單中。

2. 為什麼會出現 “Did not recognize php” 的錯誤?

在該 issue 和類似案例中,通常是因為以下兩個原因:

  • 版本相容性 (Action Version): 如果你使用的 github/codeql-action 版本太舊,或者內含的 CodeQL CLI 版本不匹配,可能會導致語言包加載失敗。
  • 預設套件包 (Standard Bundles):CodeQL 在執行時會下載一個包含所有語言規則的「套件包 (Bundle)」。如果下載過程中出錯,或是你指定的分析器路徑不對,就會報出找不到語言的錯誤。
  • 大小寫問題:CodeQL 對設定檔非常敏感,必須確保是全小寫的 php

3. 如何解決這個問題?

根據目前的最佳實踐,請檢查並修正你的 .github/workflows/codeql.yml

A. 更新 Action 版本(最重要)

確保你使用的是 v3(目前的主流版本):

YAML

- name: Initialize CodeQL
  uses: github/codeql-action/init@v3
  with:
    languages: php

B. 手動指定 CodeQL 套件來源(如果問題持續)

有時候 GitHub 的託管執行器(Runner)快取了壞掉的 CodeQL 版本。你可以嘗試強制它使用最新的版本:

YAML

- name: Initialize CodeQL
  uses: github/codeql-action/init@v3
  with:
    languages: php
    tools: latest # 強制下載最新版工具

4. 針對你提到的權限錯誤(補充)

你之前提到的第二個錯誤 Warning: This run of the CodeQL Action does not have permission... 其實才是主因。

當 CodeQL 因為權限不足無法從 GitHub API 獲取配置或下載必要的語言組件時,它可能會退回到一個「空狀態」,然後報錯說它「不認識 php」。

請務必檢查:

  • 你的 Repository 設置中:Settings > Code security and analysis > Code scanning 是否已啟動?
  • 如果這是 Fork 過來的專案,預設是不能執行 CodeQL 並回傳結果的(為了安全)。你必須在 PR 頁面手動核准執行,或者在該 Fork 倉庫的設定中開啟 Actions 權限。

總結

CodeQL 支援 PHP。 你看到的錯誤通常不是因為「不支援」,而是因為 權限被阻擋Action 版本過舊 導致 CodeQL 無法正確加載 PHP 的分析模組。請嘗試將 Action 更新至 v3 並在 YAML 中加入 permissions: security-events: write


PHP is not supported by CodeQL. What should we do with codeql-analysis.yml?

雖然 CodeQL 目前不支援 PHP,但這並不代表 codeql-analysis.yml 就完全沒有用處。如果你的專案除了 PHP 之外,還包含 JavaScript、TypeScript、HTML 或 CSS 等前端程式碼,CodeQL 依然可以掃描這些語言中的安全漏洞。建議先確認專案的語言組成,如果確實只有純 PHP 程式碼,直接移除這個檔案是合理的選擇,這樣可以避免 CI 執行無意義的掃描,節省系統資源。

如果專案包含前端程式碼,你可以修改設定檔,將語言限制在 CodeQL 支援的範圍內。如果你決定移除它,第一選項提到的 PHPStan 確實已經處理了大部分的靜態分析任務。不過要注意的是,PHPStan 主要專注於型別檢查和邏輯錯誤,而 CodeQL 類型的工具通常更偏向安全性漏洞掃描(如 SQL 注入)。如果你對安全性有高度要求,可以考慮第二選項,導入像 Snyk 或 Psalm 的安全分析外掛,來補足安全性掃描的空缺。

若選擇移除,請直接刪除 .github/workflows/codeql-analysis.yml。若專案未來計畫引入其他語言,則可以考慮暫時停用而非刪除。總結來說,若專案結構單一且 PHPStan 已能滿足開發需求,採取第一選項移除檔案是最簡潔的做法。


這兩款工具在 PHP 社群都非常知名,但定位和收費模式完全不同。簡單來說,Psalm 適合預算有限、追求深度程式碼檢查的專案;Snyk 則適合企業級開發,需要更完整的安全性掃描生態。

Psalm 安全分析

Psalm 本身是完全免費且開源的靜態分析工具。它最強大的地方在於 Taint Analysis(汙點分析),可以追蹤不受信任的輸入(如 $_GET)是否流向了危險的函數(如 query()),從而檢測 SQL 注入或 XSS。


安裝步驟

如果你已經有專案,可以使用 Composer 進行安裝:

  1. 安裝主程式:composer require --dev vimeo/psalm
  2. 初始化設定:./vendor/bin/psalm --init這會生成一個 psalm.xml 設定檔。
  3. 啟用安全分析:在 psalm.xml 中確保啟用了 taintAnalysis,或是直接在執行時加入參數:./vendor/bin/psalm --taint-analysis
  4. 安裝框架外掛(選配):如果你使用 Laravel 或 Symfony,建議安裝專屬外掛,分析會更準確:composer require --dev psalm/plugin-laravel./vendor/bin/psalm-plugin enable psalm/plugin-laravel

Snyk 安全掃描

Snyk 是一個商業產品。對於開源專案或個人小規模使用,它提供免費額度(Free Plan),但對於企業或需要大量掃描、進階合規報告的團隊,則需要付費。2026 年的 Team 版本起跳價大約在每位開發者每月 50 美元左右。


安裝步驟

Snyk 通常是透過 CLI 或直接整合到 GitHub 工作流中。

  1. 安裝 Snyk CLI:在本地或 CI 環境執行:npm install -g snyk
  2. 驗證身份:snyk auth這會跳轉到瀏覽器讓你登入帳號。
  3. 進行掃描:在專案根目錄執行以下指令來檢查依賴套件與程式碼漏洞:snyk test
  4. GitHub 工作流整合:你可以在 .github/workflows 中建立 snyk.yml,使用官方提供的 Action:YAMLsteps: - uses: actions/checkout@v4 - uses: snyk/actions/php@master env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

該選哪一個

  • 如果你想要不花一毛錢就達到極致的程式碼安全檢查,選 Psalm。它對 PHP 的理解非常深,但設定上會比較囉嗦。
  • 如果你希望有漂亮的儀表板、自動掃描開源套件(SCA)的漏洞,且不介意免費額度的限制,選 Snyk。它的強項在於全面性的漏洞資料庫。

解決 Composer 找不到的問題

如果你是在 Windows 環境下,最簡單的解決方法是去 Composer 官網下載並執行 Composer-Setup.exe 安裝檔。

傳送門: https://getcomposer.org/download/

安裝過程中它會自動尋找你的 php.exe 路徑,並幫你把執行命令設定好。安裝完成後,務必重新啟動你的終端機(如 CMD 或 PowerShell),這樣設定才會生效。

如果你確定已經安裝過,請檢查 PHP 的安裝路徑是否已經加入到系統環境變數中。你可以在終端機輸入 php -v 來確認。如果連 php 都不被辨認,那代表你必須先搞定 PHP 的環境。


關於在本機檢查

是的,當你執行 composer require --dev vimeo/psalm 時,這是在你的開發本機進行操作。

這行指令的意思是將 Psalm 下載到你專案資料夾裡的 vendor 目錄中。--dev 參數表示這個工具只在開發環境使用,實際把程式碼上傳到正式伺服器時,不會包含這些測試工具。

在本機檢查的好處是,你可以在程式碼還沒上傳到 GitHub 或伺服器之前,就先發現潛在的安全性問題。這通常被稱為「左移測試」(Shift-Left Testing),也就是在開發初期就介入檢查。


執行本機檢查的流程

當你解決了 Composer 的問題後,在本機操作的完整流程如下:

安裝: 執行

composer require --dev vimeo/psalm

初始化: 執行

./vendor/bin/psalm --init

這會在你的專案裡產生一個設定檔,讓 Psalm 知道要檢查哪些資料夾。

執行掃描: 執行

./vendor/bin/psalm

它會開始掃描你的程式碼並在終端機顯示錯誤報告。

如果你覺得在本機手動執行很麻煩,通常我們會把這套流程整合進 VS Code 等編輯器的外掛中,讓你邊寫程式時,編輯器就直接畫紅線提醒你哪裡可能有安全性漏洞。

為什麼這比在 GitHub 上檢查快

在本機執行檢查的反應速度最快。如果你只靠 GitHub Actions(也就是你原本提到的 codeql-analysis.yml 所在的環境)來檢查,你必須先 commit 並 push 程式碼,等待雲端主機啟動,然後才能看到結果。在本機跑 Psalm 通常只需要幾秒鐘,能節省大量的等待時間。


● CodeQL 完全不支援 PHP,這也是我們移除 codeql-analysis.yml 的原因。

支援的語言只有:C/C++、C#、Go、Java/Kotlin、JavaScript/TypeScript、Python、Ruby、Swift。

針對 PHP 的替代方案:

┌────────────────────────────────┬───────────────────────────────────┐
│ 工具 │ 用途 │
├────────────────────────────────┼───────────────────────────────────┤
│ Psalm (--taint-analysis) │ 資安漏洞(SQL injection、XSS 等) │
├────────────────────────────────┼───────────────────────────────────┤
│ PHPStan │ 型別錯誤、靜態分析 │
├────────────────────────────────┼───────────────────────────────────┤
│ PHP CodeSniffer │ 程式碼風格(PSR-12) │
├────────────────────────────────┼───────────────────────────────────┤
│ composer audit │ 相依套件已知漏洞 │
└────────────────────────────────┴───────────────────────────────────┘

這些都能在本機直接執行,速度比 GitHub Actions 快很多。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *