PHPのWindows版は、版の番号が同じまま「-1」で作り直された ── 開発用のパソコンの同梱PHPを洗い出し、部品の版を確かめる13項目(2026年10月時点)
PHPのWindows版は、版の番号が同じまま「-1」で作り直された ── 開発用のパソコンの同梱PHPを洗い出し、部品の版を確かめる13項目(2026年10月時点)
目次
01 何が書いてあるか — 同じ版の番号のまま、Windows版のPHPが4つの枝で作り直された
引用について
この記事の「" "」で囲んだ英語の文は、PHP公式サイトのニュース、PHPのマニュアル、libcurlの文書からの引用で、日本語訳は記事の筆者が付けたものである。各ページは2026年10月29日に開き、本文を取り直して確かめた。出典に書かれていない筆者の読みは、「筆者の読み」と書いて分ける。
2026年10月26日に、PHP公式サイトのニュースに、「Updated PHP Windows builds for Brotli security fix」(訳: Brotliのセキュリティ修正のための、更新されたPHPのWindows版)という記事が載った。この記事は、Brotliという圧縮の部品の脆弱性そのものよりも、パソコンの中で動く開発用のPHPが、更新の対象に入っているかに絞って書く。Brotliの脆弱性の中身は、すでに書いた記事に任せる。
原文が書いていること
原文の内容を、3つに分けて書く。
- 更新されたWindows版は、PHP 8.5.12-1、8.4.27-1、8.3.36-1、8.2.35-1の4つである。
- これらは、Brotli 1.2.1を含む。Brotli 1.2.1が直すのは、Brotliの展開(圧縮を元に戻す処理)の、範囲外への書き込みの脆弱性(CVE-2026-111497)である。
- Windows版のPHPでは、cURL拡張で「HTTPの応答の自動展開」を有効にしたときに、問題のある展開の処理に届きうる。
末尾の「-1」は、部品を入れ替えた作り直しの印
原文は、版の番号の末尾の「-1」を、次のように説明する。
"The -1 suffix identifies a Windows package rebuild with updated dependencies. These builds use the same PHP source releases, and the PHP runtime versions remain unchanged."
(訳: 末尾の-1は、依存する部品を更新した、Windows用パッケージの作り直しを示す。これらの版は同じPHPのソースの版を使っていて、PHP本体の版は変わらない。)
つまり、PHP本体のプログラムは同じで、同梱された部品(ここではBrotli)だけが新しくなった。PHP本体の版の数字は、8.5.12のまま動かない。
自動展開は「初期値で無効」だが、アプリが有効にできる
到達できる条件について、原文は次のように書く。
"This is disabled by default in cURL, but applications and HTTP client libraries can enable it."
(訳: これはcURLでは初期値で無効になっているが、アプリケーションやHTTPクライアントのライブラリが有効にできる。)
この一文から、確かめる対象が2つに分かれる。1つは、PHPに同梱された部品の版。もう1つは、自分のコードやライブラリが、自動展開を有効にしているかである。この記事は、前者を主に扱い、後者は後ろの章で短く触れる。
原文が書いていないこと
原文には、次のことは書かれていない。XAMPPのような、PHPを同梱した配布物が、いつ更新されるか。古い版(8.1以前や7.4)に同じ修正があるか。実際にこの経路で攻撃が行われたか。後ろの章は、この3点を、確かめられた範囲だけで書く。
02 なぜ・背景 — 版の番号が変わらないと、「入れたつもり」が起きる
PHPの版の表示は、本体の版しか見せない
「php -v」で出る1行目は、PHP本体の版である。今回の作り直しでは、PHP本体の版は変わらない、と原文が書く。だから、作り直し前の8.5.12と、作り直し後の8.5.12-1は、php -vの画面ではどちらも「8.5.12」と読める。当サイトは、サーバーのPHPで同じ形を経験していて、記事PHPの修正を入れても、版の番号も「作った日」も入れ替える前と同じ文字だった ── 修正が入ったかを値で確かめる4つの方法と、3本目の知らせ(CVE-2026-115560)を当サイトで確かめた記録に書いた。Windows版では、末尾の「-1」が見えるかどうかは、どこで版を見るかで変わる。
配布の側も、1つの場所に揃っていない
開いたとき、PHP公式の「Windows版のダウンロード」のページの本文に出ていた版の番号は、8.5.12-1だけだった。ほかの枝(8.4、8.3、8.2)の版は、このページからは確かめられなかった。XAMPPのダウンロードのページには、8.5.12、8.4.27、8.3.36が並び、日付の表示は見つからなかった。XAMPPの配布物が、Brotli 1.2.1を含むかは、ページに書かれていない。
日付を、開いたページごとに並べる
開いたページの日付を、古い順に並べた。年の書かれていない日付は、その旨を書いた。
| 日付 | 何が書かれたか | 出どころ |
|---|---|---|
| 10月21日(年の記載なし) | Brotli 1.2.1のリリースページ。セキュリティの欄にCVE-2026-111497が1件載る | Brotliのリリースページ |
| 2026年10月26日 | PHPがWindows版の更新を告知した。Windows版のダウンロードの表示は、8.5.12-1が「2026-Oct-26 13:05:05 UTC」 | PHP公式サイト |
| 2026年10月27日 | CISAの「悪用が確認された脆弱性」の一覧に、BrotliのCVE-2026-111497が追加された | CISAの一覧 |
| 2026年11月10日 | 同じ一覧に書かれた、このCVEの期限日 | CISAの一覧 |
一覧の期限日は、連邦政府の行政機関に向けた期限で、CISAの運用指令(BOD 26-04)が定めている。CISAの説明のページは、この指令に拘束されない州・地方の政府や民間の企業にも、一覧の脆弱性の対処を優先するよう強く勧めている。日本の民間のサイトである当サイトには、この期限を守る義務はない。この記事では、期限日を、自分の更新の期限とは読み替えない。
CVEの呼び名は、出典で少し違う
同じCVE-2026-111497を、PHPの告知は「out-of-bounds write」(訳: 範囲外への書き込み)、CISAの一覧は「Unchecked Return Value」(訳: 戻り値を確かめない)という題で書く。Brotliのリリースページは、「out-of-bounds write permits remote code execution」(訳: 範囲外への書き込みで、遠隔のコード実行ができる)と書く。同じ脆弱性を、見る角度の違う名前で呼んでいる、と筆者は読む。名前の違いを理由に、別の脆弱性と考えない。
03 用語 — 出てくる言葉を、先にそろえる
Windows版のパッケージと「同梱」
用語
同梱は、PHPの実行ファイルのほかに、PHPが使う部品(通信、圧縮、暗号などの部品)を、同じ配布物の中に入れて渡すことである。Windows版のPHPは、部品を同梱して配られる。だから、PHP本体の版が同じでも、部品の版は配布物ごとに違いうる。
XAMPPのような、PHP、Apache、データベースをまとめて入れる配布物は、さらに外側から、これらを束ねる。この記事では、PHPを含む束ねた配布物を、「パッケージ」と呼ぶ。
HTTPの応答の自動展開
用語
応答の自動展開は、サーバーから受け取った応答が圧縮されていたとき、受け取る側の部品が、自動で元に戻すことである。受け取る側は、「この圧縮方式なら受け取れる」と、リクエストのAccept-Encodingという項目で伝える。PHPのマニュアルは、cURLの設定CURLOPT_ENCODINGについて、「The contents of the Accept-Encoding: header as a string. This enables decoding of the response.」(訳: Accept-Encodingの項目の中身を文字列で指定する。これで応答の展開が有効になる。)と書く。
マニュアルは、同じ設定の続きに、「If an empty string is set, a header containing all supported encoding types is sent.」(訳: 空の文字列を設定すると、対応している全部の圧縮方式を並べた項目が送られる。)とも書く。空の文字列で有効にするコードが、書いた人の意図しない圧縮方式まで頼む形になりうる、と筆者は読む。
curl_version()の「brotli_version」
PHPのマニュアルは、関数curl_version()が返す配列の項目として、brotli_versionを挙げる。説明は「Brotli version, as a string, or an empty string if cURL was built without Brotli」(訳: 文字列のBrotliの版。cURLがBrotliなしで作られていたら空の文字列)である。つまり、この項目を見ると、使っているcURLの部品がBrotliを含んで作られているか、含むなら何版かが分かる。
phpinfoと、curl_versionの違い
PHPのマニュアルによると、phpinfo()は、「PHPの作られ方」や拡張機能、設定値など、大量の情報を出す。画面を取っておくと、更新の前後を比べられる。ただし、phpinfoの画面にBrotliの版を示す行が必ず出るかは、開いた文書では確かめられなかった。そこで、この記事のチェックリストでは、curl_version()の結果を確かめの本命にして、phpinfoの画面は見比べの補助に回す。
04 型別 — 開発用のPHPが、パソコンに入っている3つの経路
担当サイトの本番だけを見ても、足りない
サイトの本番のサーバーは、Linuxで動くことが多い。Windows版のPHPは、サーバーではなく、制作する人のパソコンの中にある。コードを書いて、画面を確かめる開発用の環境である。本番のPHPを更新しても、制作会社や担当者のパソコンの中のPHPは、別のものとして残る。
パソコンの中のPHPが、どこから来たかで、見つけ方と更新の仕方が変わる。筆者は、3つの経路に分けた。この分け方は、出典に書かれたものではなく、確かめる場所を決めるための整理である。
| 経路 | 更新の持ち主 | 見つけ方 |
|---|---|---|
| 1 パッケージで入れた | パッケージの配布元。新しい版を出すまで、中のPHPは古いまま | Cドライブの直下などに、パッケージ名のフォルダがある。その中のPHPの実行ファイルを探す |
| 2 公式のzipを置いた | 入れた人。上書きして入れ替える | PowerShellでwhere.exe phpを打つ。環境変数のPATHに通した場所が出る |
| 3 他のソフトの中にある | そのソフトの配布元。自分では触れないことが多い | ソフトの入れ先のフォルダの中に、PHPの実行ファイルが混ざっていないか探す |
経路1: パッケージは、配布元の更新を待つ
パッケージの中のPHPは、パッケージの配布元が入れ替えるまで、古いままである。XAMPPのダウンロードのページには、8.5.12などの版が並ぶが、Brotliの版や作り直しの有無は書かれていなかった。ページを見て分からないときは、入れたPHPに聞くのが確実である。
経路2: 公式のzipは、上書きで入れ替える
公式のzipを自分で置いた場合は、作り直された版のzipを取り直して、フォルダを入れ替える。入れ替える前に、php.iniなどの設定ファイルを別の場所に控える。入れ替えたあと、控えの設定と見比べる。更新で設定が戻るのは、サーバーでも起きた形で、当サイトは記事PHPの重大な脆弱性「php2shell」を、初心者から上級者まで1本で ── 自分のサイトは関係あるか、更新の順番、更新の後に確かめること、攻撃を受けたかの調べ方、当サイトとチームの記録に、更新の後に確かめることとして書いた。
経路3: 気づかないうちに、PHPがもう1つ入っている
他のソフトの中に、PHPが入っていることがある。ソフトの入れ先のフォルダに、PHPの実行ファイルが混ざっていないか探す。見つけても、そのソフトの配布元が更新を出すまでは、自分で入れ替えにくい。この場合は、そのソフトを使うのをやめる、または外から届かない状態にしておくという選択になる。
3つの段で、部品の版にたどり着く
パソコンの中のPHPを見つけたら、次の3段で確かめる。
1段目のphp -vは、作り直しの前後で同じ文字になりうる。2段目のcurl_version()のbrotli_versionが、部品の版を見せる。3段目のファイルの更新日は、いつ作られたファイルかの手がかりになる。ただし、更新日は、zipを展開した日に書き換わる環境もあるので、1つの根拠にしない。
05 明日、自社のサイトで確認できることチェックリスト
以下は、制作や運営で使うWindowsパソコンの中のPHPが、今回の更新の対象かを確かめる13項目である。1〜3番目はPHPを探す作業、4〜7番目は版と部品の確認、8〜11番目は配布元とコードの確認、12〜13番目は外から届かない状態の確認と決め方である。1項目は5分以内でできる。
- 担当サイトの制作や運営に使うWindowsパソコンを、担当者ごとに書き出し、その台数をメモに数字で書く
- パソコン1台ごとに、PowerShellで
where.exe phpを1回実行し、出てきた場所を全部書き留める - エクスプローラーでCドライブとDドライブの直下を開き、xampp、laragon、wampなど、パッケージ名のフォルダがあるかを見て、あれば名前を書く
- 見つけたPHPごとに
php -vを実行し、1行目の版の番号と、2行目の「built」の日付を書き留める - 同じPHPで
php -r "$v=curl_version(); echo $v['version'], ' ', $v['brotli_version'];"を実行し、cURLの版と、Brotliの版が空か、値があるかを書き留める - Brotliの版に値があるものは、1.2.1以上かを見て、1.2.1より小さいものに「古い部品」と印を付ける
- Brotliの版が空のものは、「Brotli付きでは作られていない」と書き、5番目の結果の隣にその一言を書き足す
- PHP公式のWindows版のダウンロードのページを開き、自分の枝(8.5、8.4、8.3、8.2)の版の番号の末尾に「-1」が付いているかを見る
- 入れたPHPのフォルダで
php.exeとextの中のphp_curl.dllのファイルの更新日を開き、2026年10月26日以降かを書き留める - 開発中のコードを入れたフォルダ全体で
CURLOPT_ENCODINGを検索し、ヒットした数と、各行が空の文字列か、圧縮方式の名前を並べた文字列かを書き分ける - Apacheやデータベースを動かしているパソコンで、PowerShellの
netstat -anoを実行し、80番と3306番の行の左側のアドレスが、127.0.0.1だけか、0.0.0.0かを見て書き留める - パッケージの配布元や、PHPの入っているソフトの更新のお知らせを開き、今回の更新に触れた記述があるかを探して、有無を書く
- 見つけたPHPを1つずつ「更新する・外す・保留」に分け、担当者の名前と見直す日を書く
実務のヒント
5番目の結果は、更新の前後で、同じ書き方のまま取っておく。更新したあとに同じ命令をもう1回打ち、Brotliの版が変わったかを見る。php -vだけでは、作り直しの前後が見分けられないからである。
06 代替・他の選択肢 — 公式のzipで入れ替える・パッケージを待つ・外す
選択肢を、4つに分ける
見つけたPHPをどう扱うかは、4つに分けられる。出典に書かれた分類ではなく、筆者の整理である。
| 選択肢 | やること | 先に確かめること |
|---|---|---|
| 公式のzipで入れ替える | PHP公式の作り直された版のzipに、フォルダごと入れ替える | 設定ファイルを控える。拡張機能を使うコードがあれば、入れ替えたあとに画面を開いて動きを見る |
| パッケージの更新を待つ | 配布元が新しい版を出すまで、今のまま使う | 待つ間は、外から届かない状態にする。応答の自動展開を有効にするコードがあるかを先に検索する |
| 外す | 使っていないPHPは、フォルダごとアンインストールするか、別の場所に移す | 消す前に、中に自分のコードや設定がないかを見て、あれば先に控える |
| 保留 | 理由と見直す日を書いて、今は何もしない | 「いつまで」を決めずに保留にしない。見直す日を、日付で書く |
「空」は、安全の証明ではない
Brotliの版が空のPHPは、Brotliを含まないcURLの部品で作られている。そのため、今回の告知が書いた経路には、届かないと筆者は読む。ただし、それ以外の脆弱性や、古いことそのものの問題は、別に残る。「空だから更新しなくていい」とは読まない。
PHPの古い枝は、サポートの表に載らないことがある
PHP公式の「対応している版」のページの表には、8.2から8.5までが載る。8.2のセキュリティサポートの期限は2026年12月31日、8.3は2027年12月31日、8.4は2028年12月31日、8.5は2029年12月31日と書かれている。7.4、8.0、8.1は、この表に載っていない。ページの凡例には、サポートを終えた版(End of life)について、「Users of this release should upgrade as soon as possible, as they may be exposed to unpatched security vulnerabilities.」(訳: この版の利用者は、できるだけ早く上げること。修正されていない脆弱性にさらされているおそれがある。)と書かれている。8.2の期限は、すぐそこにあるので、記事PHP 8.2のセキュリティサポートは2026年12月31日で終わる ── 自社と担当サイトのPHPの版を確かめ、年内の移行先と試験日を決める13項目(2026年10月時点)も参照してほしい。
コードの側を、先に見る
応答の自動展開を有効にするコードがなければ、今回の経路は開かない。PHP公式の告知も、この点を条件として書く。ライブラリの中に隠れていることもあるので、自分のコードだけでなく、使っているライブラリの検索も、チェックリストの10番目に含めた。libcurlの文書は、CURLOPT_ACCEPT_ENCODINGを空の文字列にすると、その部品が内蔵している圧縮方式をすべて頼む項目になる、と書く。圧縮方式の名前には「br」(Brotli)も挙がるので、Brotliを含めて作られた部品なら、頼む中に入る、と筆者は読む。空の文字列を使うコードは、最初に確かめる対象になる。
注意
このチェックリストでBrotliの版が1.2.1以上と出ても、「パソコンが安全」とは言えない。この記事が確かめるのは、PHPに同梱された圧縮の部品の版と、外から届く状態か、までである。ほかの部品や、PHP本体の別の問題は、この記事の範囲にない。
当サイトの無料ツールで補えることもある。外から見えるセキュリティの状態を、監査するには、🔧 WEBサイトの外からできるセキュリティ対策を監査するツールが使える(要ログイン)。サイトの状態を更新の前後で比べるには、🔧 WEBサイトの状況をチェックし、比較するツールが使える(要ログイン)。
07 当サイトで確かめたこと — Windowsのパソコン1台のPHPと、サーバーの扱い
当サイトのサーバーは、Windows版を使っていない
当サイトのサーバー側のPHPは、Windows版ではない。今回の告知は、Windows版の話なので、サーバーのPHPは対象に入らない。サーバー側のBrotliの扱いは、記事圧縮の部品(Brotli)の脆弱性は、縮めて送る側ではなく「元に戻す側」の話だった ── 当サイトが外から圧縮を受け取る場所を数え、その日のうちに塞いだ記録と、同じ日にサーバーが止まったあとの確かめ方と、Brotliのデコーダーの脆弱性がCISAの悪用確認リストに載った ── 担当サイトで「圧縮を受け取って解く側」になっている所を数える13項目(2026年10月時点)に書いた。
運営で使うWindowsのパソコンに、PHPが1つ入っていた
この記事を書くとき、当サイトの運営で使っているWindowsのパソコン1台で、チェックリストの2番目から5番目までと、11番目を実際にやった。2026年10月29日の結果は、次のとおりである(読むだけで、設定は何も変えていない)。
- パッケージに同梱されたPHPが、1つあった。
- PHP公式の対応版の表に載っていない、古い版だった。作られたのも、ずっと前だった。
- cURLの部品に、Brotliは入っていなかった(brotli_versionが空の文字列だった)。
- Webサーバーとデータベースの待ち受けは、そのパソコンの中だけで、外のネットワークには開いていなかった。
この結果から、言えることと、言えないこと
マニュアルの説明のとおりなら、brotli_versionが空のPHPは、Brotliなしで作られたcURLの部品を使っている。だから、今回の告知が書く経路(cURLの自動展開でBrotliの展開に届く)は、このパソコンのPHPには無い見込みである、と筆者は読む。ただし、これは「今回の件の対象外」であって、「更新しなくてよい」ではない。対応版の表に載らない古い版には、ほかの部品も古いまま残っている。
外から届くかは、待ち受けのアドレスで確かめた
11番目の確かめは、PowerShellのnetstat -anoで、待ち受けのアドレスの左側を見る形でやった。そのパソコン自身からしか届かないアドレスだけで、Webサーバーの設定ファイルの待ち受けの指定も同じ向きだった。この結果は、2026年10月29日のその時点のもので、パソコンのネットワークの設定やファイアウォールまでは見ていない。
当サイトの宿題として、書いておくこと
このパソコンのPHPは、更新するか、外すか、保留にするかを、まだ決めていない。決める前に、使っている場面(何の確認に使うか)を見る。決めたら、この記事の末尾に日付つきで追記する。サーバーのPHPでは、更新の前後に、版と部品の値を確かめる手順を、記事PHPの重大な脆弱性「php2shell」を、初心者から上級者まで1本で ── 自分のサイトは関係あるか、更新の順番、更新の後に確かめること、攻撃を受けたかの調べ方、当サイトとチームの記録に書いた。パソコンのPHPにも、同じ考え方を当てはめる。
見えなかったもの
この記事で確かめられなかったことも書いておく。PHP公式のダウンロードのページから、8.4、8.3、8.2のWindows版の版の番号は確かめられなかった。XAMPPの最新の配布物が、Brotli 1.2.1を含むかも、確かめていない。phpinfoの画面に、Brotliの版が出るかも、確かめていない。
08 このテーマは、ここまで
この記事で扱った範囲
この記事が扱ったのは、2026年10月26日にPHP公式が告知した、Windows版PHPの作り直しと、制作や運営で使うパソコンの中のPHPを洗い出す手順である。Brotliの脆弱性の中身や、サーバーのPHPの更新は、すでに書いた記事に任せた。
この記事で扱っていないこと
- XAMPPなどのパッケージの、次の更新の日(出典に書かれていない)
- 7.4や8.1など、サポートの表に載らない古い枝の修正の有無(開いた文書では確かめていない)
- この脆弱性が、実際に攻撃に使われた経路の詳細(告知には書かれていない)
関連する、これまでの記事
PHPの修正の確かめ方は、記事PHPの修正を入れても、版の番号も「作った日」も入れ替える前と同じ文字だった ── 修正が入ったかを値で確かめる4つの方法と、3本目の知らせ(CVE-2026-115560)を当サイトで確かめた記録に、担当サイトの一覧の作り方は、PHPの修正版が出た日に「どのサイトが当たるか」を数分で答えるには、担当サイトの一覧が要る ── 台帳の8列を埋めて確かめる13項目(2026年10月時点)に書いた。開発用の環境のように、公開の場所に控えやメモが残る件は、控えファイルを外から確かめた日 ── 当サイトで読めたのは25本。「403でも置かない」理由と、次から積もらない手順に書いた。
2026年10月29日 — この記事の確認日
この記事の内容は、2026年10月29日に、PHP公式のニュースとWindows版のダウンロードのページ、PHPのマニュアル、対応している版のページ、libcurlの文書、Brotliのリリースページ、XAMPPのダウンロードのページ、CISAの一覧を開いて確かめた時点のものである。告知や配布物が変わったときは、日付つきで追記する。
現在の貴方のIPアドレス
このサイトで書いている人
WEBサイト