diff --git a/package.json b/package.json index 28f54ec3d..dbd156afd 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "classnames": "^2.2.6", "debounce": "^1.2.1", "github-slugger": "^1.3.0", - "next": "15.1.9", + "next": "15.1.11", "next-remote-watch": "^1.0.0", "parse-numeric-range": "^1.2.0", "react": "^19.0.0", diff --git a/src/content/blog/2025/12/03/critical-security-vulnerability-in-react-server-components.md b/src/content/blog/2025/12/03/critical-security-vulnerability-in-react-server-components.md index 192d116ad..eb20b3984 100644 --- a/src/content/blog/2025/12/03/critical-security-vulnerability-in-react-server-components.md +++ b/src/content/blog/2025/12/03/critical-security-vulnerability-in-react-server-components.md @@ -42,7 +42,7 @@ React Server Components に、認証不要のリモートコード実行の脆 一部の React フレームワークやバンドラが、脆弱性のある React パッケージに依存しているか、peer dependency として依存しているか、あるいはそれらを含んでいました。影響を受ける React フレームワークやバンドラは以下の通りです:[next](https://www.npmjs.com/package/next)、[react-router](https://www.npmjs.com/package/react-router)、[waku](https://www.npmjs.com/package/waku)、[@parcel/rsc](https://www.npmjs.com/package/@parcel/rsc)、[@vitejs/plugin-rsc](https://www.npmjs.com/package/@vitejs/plugin-rsc)、[rwsdk](https://www.npmjs.com/package/rwsdk) -アップグレード方法に関する指示が利用可能になり次第、この記事を更新します。 +アップグレード方法について、[以下の更新手順](#update-instructions)を参照してください。 ### ホスティングプロバイダによる緩和策 {/*hosting-provider-mitigations*/} @@ -58,27 +58,46 @@ React Server Components に、認証不要のリモートコード実行の脆 ## 更新手順 {/*update-instructions*/} + + +以下のガイドは新たに発見された以下の脆弱性にも対応するよう更新済みです。 + +- **Denial of Service - High Severity**: [CVE-2025-55184](https://www.cve.org/CVERecord?id=CVE-2025-55184) (CVSS 7.5) +- **Source Code Exposure - Medium Severity**: [CVE-2025-55183](https://www.cve.org/CVERecord?id=CVE-2025-55183) (CVSS 5.3) + +また新たに発見され [CVE-2025-67779](https://www.cve.org/CVERecord?id=CVE-2025-67779) で報告・修正済みの問題にも対応しています。 + +詳細については[フォローアップブログ記事](/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components)を参照してください。 + + + ### Next.js {/*update-next-js*/} 全ユーザは、各リリースラインの最新のパッチ適用済みバージョンにアップグレードすべきです。 ```bash -npm install next@15.0.5 // for 15.0.x -npm install next@15.1.9 // for 15.1.x -npm install next@15.2.6 // for 15.2.x -npm install next@15.3.6 // for 15.3.x -npm install next@15.4.8 // for 15.4.x -npm install next@15.5.7 // for 15.5.x -npm install next@16.0.7 // for 16.0.x +npm install next@14.2.35 // for 13.3.x, 13.4.x, 13.5.x, 14.x +npm install next@15.0.7 // for 15.0.x +npm install next@15.1.11 // for 15.1.x +npm install next@15.2.8 // for 15.2.x +npm install next@15.3.8 // for 15.3.x +npm install next@15.4.10 // for 15.4.x +npm install next@15.5.9 // for 15.5.x +npm install next@16.0.10 // for 16.0.x + +npm install next@15.6.0-canary.60 // for 15.x canary releases +npm install next@16.1.0-canary.19 // for 16.x canary releases ``` -Next.js 14.3.0-canary.77 またはそれ以降の canary リリースを使用している場合は、最新の安定版 14.x リリースにダウングレードしてください。 +Next.js 13 のバージョン `13.3` 以降 (`13.3.x`、`13.4.x`、`13.5.x`) を使用している場合は、バージョン `14.2.35` にアップグレードしてください。 + +`next@14.3.0-canary.77` またはそれ以降の canary リリースを使用している場合は、最新の安定版 14.x リリースにダウングレードしてください。 ```bash npm install next@14 ``` -詳細は [Next.js の変更履歴](https://nextjs.org/blog/CVE-2025-66478) を参照してください。 +最新の更新手順については [Next.js ブログ](https://nextjs.org/blog/security-update-2025-12-11)を、詳細については[前回の変更履歴](https://nextjs.org/blog/CVE-2025-66478)を参照してください。 ### React Router {/*update-react-router*/} @@ -156,6 +175,22 @@ npm install react@latest react-dom@latest @vitejs/plugin-rsc@latest npm install react@latest react-dom@latest react-server-dom-webpack@latest ``` + +### React Native {/*react-native*/} + +モノレポや `react-dom` を使用していない React Native ユーザの場合、`react` バージョンは `package.json` で固定されているはずですので、追加の手順は必要ありません。 + +モノレポで React Native を使用している場合は、以下のパッケージがインストールされている場合に*それらのみ*を更新してください。 + +- `react-server-dom-webpack` +- `react-server-dom-parcel` +- `react-server-dom-turbopack` + +これはセキュリティ上の問題を緩和するために必要ですが、`react` および `react-dom` を更新する必要はなく、そのため React Native でのバージョン不一致エラーが発生することはありません。 + +詳細については[この issue](https://github.com/facebook/react-native/issues/54772#issuecomment-3617929832) を参照してください。 + + ## タイムライン {/*timeline*/} * **11 月 29 日**: Lachlan Davidson 氏が [Meta Bug Bounty](https://bugbounty.meta.com/) を通じて脆弱性を報告。 diff --git a/src/content/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components.md b/src/content/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components.md new file mode 100644 index 000000000..a23f67a8d --- /dev/null +++ b/src/content/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components.md @@ -0,0 +1,178 @@ +--- +title: "React Server Components におけるサービス拒否攻撃とソースコード露出" +author: The React Team +date: 2025/12/11 +description: セキュリティ研究者が先週の重大な脆弱性に対するパッチを検証する過程で、React Server Components における 2 つの脆弱性を追加で発見し、開示しました。高深刻度のサービス拒否攻撃 (CVE-2025-55184) と、中程度の深刻度のソースコード露出 (CVE-2025-55183) です。 + + +--- + +December 11, 2025 by [The React Team](/community/team) + +--- + + + +セキュリティ研究者が先週の重大な脆弱性に対するパッチをテストする過程で、React Server Components における 2 つの脆弱性を追加で発見し、開示しました。 + +**これらの新しい脆弱性はリモートコード実行を許すものではありません**。React2Shell に対するパッチはリモートコード実行の悪用を防止するために引き続き有効です。 + + + +--- + +新しい脆弱性は以下のように公開されています。 + +- **Denial of Service - High Severity**: [CVE-2025-55184](https://www.cve.org/CVERecord?id=CVE-2025-55184) and [CVE-2025-67779](https://www.cve.org/CVERecord?id=CVE-2025-67779) (CVSS 7.5) +- **Source Code Exposure - Medium Severity**: [CVE-2025-55183](https://www.cve.org/CVERecord?id=CVE-2025-55183) (CVSS 5.3) + +新たに開示された脆弱性の深刻さを鑑み、直ちにアップグレードすることを推奨します。 + + + +#### 以前に公開されたパッチには脆弱性があります {/*the-patches-published-earlier-are-vulnerable*/} + +先週の重大なセキュリティ脆弱性の対応のため既にアップデートを行っている場合でも、再度アップデートが必要です。 + +19.0.2、19.1.3、および 19.2.2 にアップデート済みの場合でも、[これらは不完全](#additional-fix-published)であり、再度アップデートする必要があります。 + +アップグレード手順については、[前回記事のガイド](/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-instructions)を参照してください。 + + + +これらの脆弱性の詳細については、修正のロールアウトが完了した後に提供される予定です。 + +## 直ちに対応を {/*immediate-action-required*/} + +これらの脆弱性は、[CVE-2025-55182](/blog/2025/12/03/critical-security-vulnerability-in-react-server-components) と同じパッケージおよびバージョンに存在します。 + +以下のパッケージのバージョン 19.0.0、19.0.1、19.0.2、19.1.0、19.1.1、19.1.2、19.1.2、19.2.0、19.2.1、および 19.2.2 が該当します。 + +* [react-server-dom-webpack](https://www.npmjs.com/package/react-server-dom-webpack) +* [react-server-dom-parcel](https://www.npmjs.com/package/react-server-dom-parcel) +* [react-server-dom-turbopack](https://www.npmjs.com/package/react-server-dom-turbopack?activeTab=readme) + +修正はバージョン 19.0.3、19.1.4、および 19.2.3 にバックポートされています。上記のパッケージを使用している場合は、直ちに修正済みバージョンのいずれかにアップグレードしてください。 + +以前と同様、アプリの React コードがサーバを使用していない場合、アプリはこれらの脆弱性の影響を受けません。アプリが React Server Components をサポートするフレームワーク、バンドラ、またはバンドラプラグインを使用していない場合、アプリはこれらの脆弱性の影響を受けません。 + + + +#### 重大な CVE の後に別の脆弱性報告が続くことはよくあります {/*its-common-for-critical-cves-to-uncover-followup-vulnerabilities*/} + +重大な脆弱性が開示されると、研究者は隣接するコードパスを精査し、初期の修正をバイパスする方法がないかテストし、類似の悪用手段を見つけようとします。 + +これは JavaScript だけでなく、業界全体で見られるパターンです。たとえば [Log4Shell](https://nvd.nist.gov/vuln/detail/cve-2021-44228) の後にも、コミュニティがオリジナルの修正を検証する中で追加の CVE ([1](https://nvd.nist.gov/vuln/detail/cve-2021-45046), [2](https://nvd.nist.gov/vuln/detail/cve-2021-45105)) が報告されました。 + +開示が続くとフラストレーションを感じるかもしれませんが、一般的には健全な対応サイクルの兆候です。 + + + +### 影響を受けるフレームワークとバンドラ {/*affected-frameworks-and-bundlers*/} + +一部の React フレームワークやバンドラが、脆弱性のある React パッケージに依存しているか、peer dependency として依存しているか、あるいはそれらを含んでいました。影響を受ける React フレームワークやバンドラは以下の通りです:[next](https://www.npmjs.com/package/next)、[react-router](https://www.npmjs.com/package/react-router)、[waku](https://www.npmjs.com/package/waku)、[@parcel/rsc](https://www.npmjs.com/package/@parcel/rsc)、[@vite/rsc-plugin](https://www.npmjs.com/package/@vitejs/plugin-rsc)、[rwsdk](https://www.npmjs.com/package/rwsdk) + +アップグレード方法について、[前回の記事の手順](https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-instructions)を参照してください。 + +### ホスティングプロバイダによる緩和策 {/*hosting-provider-mitigations*/} + +以前と同様、我々は多くのホスティングプロバイダと協力し、一時的な緩和策 (mitigation) を適用しています。 + +ただしアプリの保護のためにこれらに依存しないでください。引き続き直ちにアップデートを適用するべきです。 + +### React Native {/*react-native*/} + +モノレポや `react-dom` を使用していない React Native ユーザの場合、`react` バージョンは `package.json` で固定されているはずですので、追加の手順は必要ありません。 + +モノレポで React Native を使用している場合は、以下のパッケージがインストールされている場合に*それらのみ*を更新してください。 + +- `react-server-dom-webpack` +- `react-server-dom-parcel` +- `react-server-dom-turbopack` + +これはセキュリティ上の問題を緩和するために必要ですが、`react` および `react-dom` を更新する必要はなく、そのため React Native でのバージョン不一致エラーが発生することはありません。 + +詳細については[この issue](https://github.com/facebook/react-native/issues/54772#issuecomment-3617929832) を参照してください。 + +## 高深刻度:サービス拒否攻撃 {/*high-severity-denial-of-service*/} + +**CVE**: [CVE-2025-55184](https://www.cve.org/CVERecord?id=CVE-2025-55184) および [CVE-2025-67779](https://www.cve.org/CVERecord?id=CVE-2025-67779) +**Base Score**: 7.5 (High) + +セキュリティ研究者は、悪意のある HTTP リクエストを作成して任意のサーバ関数 (Server Function) エンドポイントに対して送信することで、React がそれをデシリアライズする際に、サーバプロセスをハングさせて CPU を消費する無限ループを引き起こすことができることを発見しました。アプリが React のサーバ関数のエンドポイントを実装していない場合でも、React Server Components をサポートしている場合は脆弱性の影響を受ける可能性があります。 + +これにより、攻撃者がユーザによる製品へのアクセスを不能にし、サーバ環境のパフォーマンスに影響を与えうる手段が生じます。 + +本日公開されたパッチは、無限ループを防ぐことでこの問題を緩和します。 + + + +#### 追加の修正が公開されました {/*additional-fix-published*/} + +[CVE-2025-55184](https://www.cve.org/CVERecord?id=CVE-2025-55184) における DoS に対処する元の修正は不完全でした。 + +これにより、バージョン 19.0.2、19.1.3、19.2.2 が脆弱な状態のままでした。バージョン 19.0.3、19.1.4、19.2.3 は安全です。 + +我々は追加のケースを修正し、脆弱なバージョンに対して [CVE-2025-67779](https://www.cve.org/CVERecord?id=CVE-2025-67779) を提出しました。 + + + +## 中深刻度:ソースコード露出 {/*low-severity-source-code-exposure*/} + +**CVE**: [CVE-2025-55183](https://www.cve.org/CVERecord?id=CVE-2025-55183) +**Base Score**: 5.3 (Medium) + +セキュリティ研究者は、脆弱なサーバ関数に送信された悪意のある HTTP リクエストが、安全でない方法で任意のサーバ関数のソースコードを返す可能性があることを発見しました。悪用には、明示的または暗黙的に引数の文字列化を行い露出するサーバ関数の存在が必要です。 + +```javascript +'use server'; + +export async function serverFunction(name) { + const conn = db.createConnection('SECRET KEY'); + const user = await conn.createUser(name); // implicitly stringified, leaked in db + + return { + id: user.id, + message: `Hello, ${name}!` // explicitly stringified, leaked in reply + }} +``` + +攻撃者は以下のような情報を漏洩させる可能性があります。 + +```txt +0:{"a":"$@1","f":"","b":"Wy43RxUKdxmr5iuBzJ1pN"} +1:{"id":"tva1sfodwq","message":"Hello, async function(a){console.log(\"serverFunction\");let b=i.createConnection(\"SECRET KEY\");return{id:(await b.createUser(a)).id,message:`Hello, ${a}!`}}!"} +``` + +本日公開されたパッチは、サーバ関数のソースコードが文字列化されるのを防ぎます。 + + + +#### 漏洩可能性があるのはソースコード内の秘密情報のみ {/*only-secrets-in-source-code-may-be-exposed*/} + +ソースコードにハードコードされた秘密情報は漏洩の可能性がありますが、`process.env.SECRET` などのランタイムシークレットは影響を受けません。 + +漏洩されるコードの範囲は、サーバ関数内のコードに限定されますが、バンドラが行うインライン化の程度によっては他の関数が含まれる可能性があります。 + +必ず本番バンドルに対して検証を行ってください。 + + + +--- + +## タイムライン {/*timeline*/} +* **12 月 3 日**:[Andrew MacPherson](https://github.com/AndrewMohawk) 氏が Vercel および [Meta Bug Bounty](https://bugbounty.meta.com/) に漏洩の問題を報告。 +* **12 月 4 日**:[RyotaK](https://ryotak.net) 氏が [Meta Bug Bounty](https://bugbounty.meta.com/) に DoS 問題を初期報告。 +* **12 月 6 日**:React チームが両方の問題を確認し、調査を開始。 +* **12 月 7 日**:初期の修正が作成され、React チームが新しいパッチの検証と計画を開始。 +* **12 月 8 日**:影響を受けるホスティングプロバイダとオープンソースプロジェクトに通知。 +* **12 月 10 日**:ホスティングプロバイダの緩和策が導入、パッチの検証が完了。 +* **12 月 11 日**:Shinsaku Nomura 氏が [Meta Bug Bounty](https://bugbounty.meta.com/) に追加の DoS を報告。 +* **12 月 11 日**:パッチが公開され、[CVE-2025-55183](https://www.cve.org/CVERecord?id=CVE-2025-55183) および [CVE-2025-55184](https://www.cve.org/CVERecord?id=CVE-2025-55184) として一般公開。 +* **12 月 11 日**:不足していた DoS のケースが内部で発見され、修正が適用され [CVE-2025-67779](https://www.cve.org/CVERecord?id=CVE-2025-67779) として一般公開。 + +--- + +## 謝辞 {/*attribution*/} + +ソースコード漏洩を報告してくださった [Andrew MacPherson (AndrewMohawk)](https://github.com/AndrewMohawk) 氏、サービス拒否攻撃の脆弱性を報告してくださった GMO Flatt Security Inc の [RyotaK](https://ryotak.net) 氏および株式会社ビットフォレストの Shinsaku Nomura 氏に感謝します。 diff --git a/src/content/blog/index.md b/src/content/blog/index.md index b84223d4a..b75c829d8 100644 --- a/src/content/blog/index.md +++ b/src/content/blog/index.md @@ -16,6 +16,12 @@ Bluesky の [@react.dev](https://bsky.app/profile/react.dev) や Twitter の [@r
+ + +セキュリティ研究者が先週の重大な脆弱性に対するパッチを検証する過程で、React Server Components における 2 つの脆弱性を追加で発見し、開示しました。 + + + React Server Components に、認証不要のリモートコード実行の脆弱性が存在します。バージョン 19.0.1、19.1.2、19.2.1 で修正が公開されました。直ちにアップグレードすることを推奨します。 diff --git a/src/content/reference/react/useEffect.md b/src/content/reference/react/useEffect.md index 0f67fb5b9..d7c9f429f 100644 --- a/src/content/reference/react/useEffect.md +++ b/src/content/reference/react/useEffect.md @@ -44,9 +44,9 @@ function ChatRoom({ roomId }) { #### 引数 {/*parameters*/} -* `setup`: エフェクトのロジックが記述された関数です。このセットアップ関数は、オプションで*クリーンアップ*関数を返すことができます。コンポーネントが初めて DOM に追加されると、React はセットアップ関数を実行します。依存配列 (dependencies) が変更された再レンダー時には、React はまず古い値を使ってクリーンアップ関数(あれば)を実行し、次に新しい値を使ってセットアップ関数を実行します。コンポーネントが DOM から削除された後、React はクリーンアップ関数を最後にもう一度実行します。 +* `setup`: エフェクトのロジックが記述された関数です。このセットアップ関数は、オプションで*クリーンアップ*関数を返すことができます。[コンポーネントがコミットされる](/learn/render-and-commit#step-3-react-commits-changes-to-the-dom)と、React はセットアップ関数を実行します。依存配列 (dependencies) が変更された次のコミット時には、React はまず古い値を使ってクリーンアップ関数(あれば)を実行し、次に新しい値を使ってセットアップ関数を実行します。コンポーネントが DOM から削除された後、React はクリーンアップ関数を最後にもう一度実行します。 -* **省略可能** `dependencies`: `setup` コード内で参照されるすべてのリアクティブな値のリストです。リアクティブな値には、props、state、コンポーネント本体に直接宣言されたすべての変数および関数が含まれます。リンタが [React 用に設定されている場合](/learn/editor-setup#linting)、すべてのリアクティブな値が依存値として正しく指定されているか確認できます。依存値のリストは要素数が一定である必要があり、`[dep1, dep2, dep3]` のようにインラインで記述する必要があります。React は、[`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) を使った比較で、それぞれの依存値を以前の値と比較します。この引数を省略すると、エフェクトはコンポーネントの毎回のレンダー後に再実行されます。[依存値の配列を渡す場合と空の配列を渡す場合、および何も渡さない場合の違い](#examples-dependencies)を確認してください。 +* **省略可能** `dependencies`: `setup` コード内で参照されるすべてのリアクティブな値のリストです。リアクティブな値には、props、state、コンポーネント本体に直接宣言されたすべての変数および関数が含まれます。リンタが [React 用に設定されている場合](/learn/editor-setup#linting)、すべてのリアクティブな値が依存値として正しく指定されているか確認できます。依存値のリストは要素数が一定である必要があり、`[dep1, dep2, dep3]` のようにインラインで記述する必要があります。React は、[`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) を使った比較で、それぞれの依存値を以前の値と比較します。この引数を省略すると、エフェクトはコンポーネントの毎回のコミット後に再実行されます。[依存値の配列を渡す場合と空の配列を渡す場合、および何も渡さない場合の違い](#examples-dependencies)を確認してください。 #### 返り値 {/*returns*/} @@ -107,14 +107,14 @@ function ChatRoom({ roomId }) { **React は必要に応じてセットアップ関数とクリーンアップ関数を呼び出し、これは複数回行われることがあります。** 1. コンポーネントがページに追加(*マウント*)されると、セットアップコードが実行されます。 -2. 依存値が変更された上でコンポーネントが再レンダーされる度に: +2. 依存値が変更された上でコンポーネントがコミットされる度に: - まず、古い props と state でクリーンアップコードが実行されます。 - 次に、新しい props と state でセットアップコードが実行されます。 3. コンポーネントがページから削除(*アンマウント*)されると、最後にクリーンアップコードが実行されます。 **上記の例でこのシーケンスを説明しましょう。** -上記の `ChatRoom` コンポーネントがページに追加されると、`serverUrl` と `roomId` の初期値を使ってチャットルームに接続します。`serverUrl` または `roomId` が再レンダーの結果として変更される場合(例えば、ユーザがドロップダウンで別のチャットルームを選択した場合)、あなたのエフェクトは*以前のルームから切断し、次のルームに接続します*。`ChatRoom` コンポーネントがページから削除されると、あなたのエフェクトは最後の切断を行います。 +上記の `ChatRoom` コンポーネントがページに追加されると、`serverUrl` と `roomId` の初期値を使ってチャットルームに接続します。`serverUrl` または `roomId` がコミットの結果として変更される場合(例えば、ユーザがドロップダウンで別のチャットルームを選択した場合)、あなたのエフェクトは*以前のルームから切断し、次のルームに接続します*。`ChatRoom` コンポーネントがページから削除されると、あなたのエフェクトは最後の切断を行います。 **[バグを見つけ出すために](/learn/synchronizing-with-effects#step-3-add-cleanup-if-needed)、開発中には React はセットアップクリーンアップを、セットアップの前に 1 回余分に実行します**。これは、エフェクトのロジックが正しく実装されていることを確認するストレステストです。これが目に見える問題を引き起こす場合、クリーンアップ関数に一部のロジックが欠けています。クリーンアップ関数は、セットアップ関数が行っていたことを停止ないし元に戻す必要があります。基本ルールとして、ユーザはセットアップが一度しか呼ばれていない(本番環境の場合)か、*セットアップ* → *クリーンアップ* → *セットアップ*のシーケンス(開発環境の場合)で呼ばれているかを区別できないようにする必要があります。[一般的な解決法を参照してください](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development)。 @@ -1145,7 +1145,7 @@ useEffect(() => { #### 依存配列を渡す {/*passing-a-dependency-array*/} -依存配列を指定すると、エフェクトは**最初のレンダー後*および*依存配列が変わった後の再レンダー後に実行されます。** +依存配列を指定すると、エフェクトは**最初のコミット後*および*依存配列が変わった後の再コミット後に実行されます。** ```js {3} useEffect(() => { @@ -1242,7 +1242,7 @@ button { margin-left: 5px; } #### 空の依存配列を渡す {/*passing-an-empty-dependency-array*/} -あなたのエフェクトがリアクティブな値を本当に使っていないのであれば、それは**初回のレンダー後に**のみ実行されます。 +あなたのエフェクトがリアクティブな値を本当に使っていないのであれば、それは**初回のコミット後に**のみ実行されます。 ```js {3} useEffect(() => { @@ -1319,7 +1319,7 @@ export function createConnection(serverUrl, roomId) { #### 依存配列を渡さない {/*passing-no-dependency-array-at-all*/} -依存配列自体をまったく渡さない場合、コンポーネントの**毎回のレンダー(再レンダー)後に**エフェクトが実行されます。 +依存配列自体をまったく渡さない場合、コンポーネントの**毎回のコミット後に**エフェクトが実行されます。 ```js {3} useEffect(() => { @@ -1480,7 +1480,7 @@ body { ### オブジェクト型の不要な依存値を削除する {/*removing-unnecessary-object-dependencies*/} -エフェクトがレンダー中に作成されたオブジェクトや関数に依存している場合、必要以上にエフェクトが実行されてしまうことがあります。たとえば、このエフェクトは `options` オブジェクトが[レンダーごとに異なる](/learn/removing-effect-dependencies#does-some-reactive-value-change-unintentionally)ため、毎回のレンダー後に再接続を行ってしまいます: +エフェクトがレンダー中に作成されたオブジェクトや関数に依存している場合、必要以上にエフェクトが実行されてしまうことがあります。たとえば、このエフェクトは `options` オブジェクトが[レンダーごとに異なる](/learn/removing-effect-dependencies#does-some-reactive-value-change-unintentionally)ため、毎回のコミット後に再接続を行ってしまいます。 ```js {6-9,12,15} const serverUrl = 'https://localhost:1234'; @@ -1497,7 +1497,7 @@ function ChatRoom({ roomId }) { const connection = createConnection(options); // It's used inside the Effect connection.connect(); return () => connection.disconnect(); - }, [options]); // 🚩 As a result, these dependencies are always different on a re-render + }, [options]); // 🚩 As a result, these dependencies are always different on a commit // ... ``` @@ -1583,7 +1583,7 @@ button { margin-left: 10px; } ### 関数型の不要な依存値を削除する {/*removing-unnecessary-function-dependencies*/} -エフェクトがレンダー中に作成されたオブジェクトや関数に依存している場合、必要以上にエフェクトが実行されてしまうことがあります。たとえば、このエフェクトは `createOptions` 関数が[レンダーごとに異なる](/learn/removing-effect-dependencies#does-some-reactive-value-change-unintentionally)ため、毎回再接続を行ってしまいます: +エフェクトがレンダー中に作成されたオブジェクトや関数に依存している場合、必要以上にエフェクトが実行されてしまうことがあります。たとえば、このエフェクトは `createOptions` 関数が[レンダーごとに異なる](/learn/removing-effect-dependencies#does-some-reactive-value-change-unintentionally)ため、毎回のコミット後に再接続を行ってしまいます。 ```js {4-9,12,16} function ChatRoom({ roomId }) { @@ -1601,11 +1601,11 @@ function ChatRoom({ roomId }) { const connection = createConnection(); connection.connect(); return () => connection.disconnect(); - }, [createOptions]); // 🚩 As a result, these dependencies are always different on a re-render + }, [createOptions]); // 🚩 As a result, these dependencies are always different on a commit // ... ``` -再レンダーのたびに新しい関数を作成すること、それ自体には問題はなく、最適化しようとする必要はありません。ただし、エフェクトの依存値としてそれを使用する場合、毎回のレンダー後にエフェクトが再実行されてしまうことになります。 +再レンダーのたびに新しい関数を作成すること、それ自体には問題はなく、最適化しようとする必要はありません。ただし、エフェクトの依存値としてそれを使用する場合、毎回のコミット後にエフェクトが再実行されてしまうことになります。 レンダー中に作成された関数を依存値として使用することは避けてください。代わりに、エフェクトの内部で宣言するようにします。 @@ -1775,7 +1775,7 @@ Strict Mode がオンの場合、開発時に React は実際のセットアッ ```js {3} useEffect(() => { // ... -}); // 🚩 No dependency array: re-runs after every render! +}); // 🚩 No dependency array: re-runs after every commit! ``` 依存配列を指定しているにもかかわらず、エフェクトがループで再実行される場合、それは再レンダーごとに依存する値のどれかが変わっているためです。 diff --git a/src/content/reference/react/useLayoutEffect.md b/src/content/reference/react/useLayoutEffect.md index 663972b81..813a26abf 100644 --- a/src/content/reference/react/useLayoutEffect.md +++ b/src/content/reference/react/useLayoutEffect.md @@ -47,9 +47,9 @@ function Tooltip() { #### 引数 {/*parameters*/} -* `setup`: エフェクトのロジックが記述された関数です。このセットアップ関数は、オプションで*クリーンアップ*関数を返すことができます。コンポーネントが初めて DOM に追加されると、React はセットアップ関数を実行します。依存配列 (dependencies) が変更された再レンダー時には、React はまず古い値を使ってクリーンアップ関数(あれば)を実行し、次に新しい値を使ってセットアップ関数を実行します。コンポーネントが DOM から削除された後、React はクリーンアップ関数を最後にもう一度実行します。 +* `setup`: エフェクトのロジックが記述された関数です。このセットアップ関数は、オプションで*クリーンアップ*関数を返すことができます。[コンポーネントがコミットされる](/learn/render-and-commit#step-3-react-commits-changes-to-the-dom)前に、React はセットアップ関数を実行します。依存配列 (dependencies) が変更された次のコミット時には、React はまず古い値を使ってクリーンアップ関数(あれば)を実行し、次に新しい値を使ってセットアップ関数を実行します。コンポーネントが DOM から削除される前に、React はクリーンアップ関数を実行します。 -* **省略可能** `dependencies`: `setup` コード内で参照されるすべてのリアクティブな値のリストです。リアクティブな値には、props、state、コンポーネント本体に直接宣言されたすべての変数および関数が含まれます。リンタが [React 用に設定されている場合](/learn/editor-setup#linting)、すべてのリアクティブな値が依存値として正しく指定されているか確認できます。依存値のリストは要素数が一定である必要があり、`[dep1, dep2, dep3]` のようにインラインで記述する必要があります。React は、[`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) を使った比較で、それぞれの依存値を以前の値と比較します。この引数を省略すると、エフェクトはコンポーネントの毎回のレンダー後に再実行されます。 +* **省略可能** `dependencies`: `setup` コード内で参照されるすべてのリアクティブな値のリストです。リアクティブな値には、props、state、コンポーネント本体に直接宣言されたすべての変数および関数が含まれます。リンタが [React 用に設定されている場合](/learn/editor-setup#linting)、すべてのリアクティブな値が依存値として正しく指定されているか確認できます。依存値のリストは要素数が一定である必要があり、`[dep1, dep2, dep3]` のようにインラインで記述する必要があります。React は、[`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) を使った比較で、それぞれの依存値を以前の値と比較します。この引数を省略すると、エフェクトはコンポーネントの毎回のコミット後に再実行されます。 #### 返り値 {/*returns*/} diff --git a/src/content/versions.md b/src/content/versions.md index d63767680..6bdcbead5 100644 --- a/src/content/versions.md +++ b/src/content/versions.md @@ -54,11 +54,14 @@ React 15 より前のバージョンについては [15.react.dev](https://15.re - [React 19 Deep Dive: Coordinating HTML](https://www.youtube.com/watch?v=IBBN-s77YSI) **Releases** +- [v19.2.1 (December, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1922-dec-11-2025) - [v19.2.1 (December, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1921-dec-3-2025) - [v19.2.0 (October, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1920-october-1st-2025) +- [v19.1.3 (December, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1913-dec-11-2025) - [v19.1.2 (December, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1912-dec-3-2025) - [v19.1.1 (July, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1911-july-28-2025) - [v19.1.0 (March, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1910-march-28-2025) +- [v19.0.2 (December, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1902-dec-11-2025) - [v19.0.1 (December, 2025)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1901-dec-3-2025) - [v19.0.0 (December, 2024)](https://github.com/facebook/react/blob/main/CHANGELOG.md#1900-december-5-2024) diff --git a/src/sidebarBlog.json b/src/sidebarBlog.json index 44ab4e62d..74a3a2e04 100644 --- a/src/sidebarBlog.json +++ b/src/sidebarBlog.json @@ -11,11 +11,18 @@ "path": "/blog", "skipBreadcrumb": true, "routes": [ + { + "title": "React Server Components におけるサービス拒否攻撃とソースコード露出", + "titleForHomepage": "RSC における追加の脆弱性", + "icon": "blog", + "date": "December 11, 2025", + "path": "/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components" + }, { "title": "React Server Components における重大なセキュリティ脆弱性", "titleForHomepage": "React Server Components の脆弱性", "icon": "blog", - "date": "December 03, 2025", + "date": "December 3, 2025", "path": "/blog/2025/12/03/critical-security-vulnerability-in-react-server-components" }, { diff --git a/yarn.lock b/yarn.lock index a07b2f280..a1ce77d11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1225,10 +1225,10 @@ unist-util-visit "^4.0.0" vfile "^5.0.0" -"@next/env@15.1.9": - version "15.1.9" - resolved "https://registry.yarnpkg.com/@next/env/-/env-15.1.9.tgz#3569b6dd6a9b0af998fc6e4902da6b9ed2fc36c9" - integrity sha512-Te1wbiJ//I40T7UePOUG8QBwh+VVMCc0OTuqesOcD3849TVOVOyX4Hdrkx7wcpLpy/LOABIcGyLX5P/SzzXhFA== +"@next/env@15.1.11": + version "15.1.11" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.1.11.tgz#599a126f7ce56decc39cea46668cb60d96b66bc6" + integrity sha512-yp++FVldfLglEG5LoS2rXhGypPyoSOyY0kxZQJ2vnlYJeP8o318t5DrDu5Tqzr03qAhDWllAID/kOCsXNLcwKw== "@next/eslint-plugin-next@12.0.3": version "12.0.3" @@ -5797,12 +5797,12 @@ next-tick@^1.1.0: resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== -next@15.1.9: - version "15.1.9" - resolved "https://registry.yarnpkg.com/next/-/next-15.1.9.tgz#eaab46d7a57c881fadf748d8ba2a8c65ec27ad8f" - integrity sha512-OoQpDPV2i3o5Hnn46nz2x6fzdFxFO+JsU4ZES12z65/feMjPHKKHLDVQ2NuEvTaXTRisix/G5+6hyTkwK329kA== +next@15.1.11: + version "15.1.11" + resolved "https://registry.yarnpkg.com/next/-/next-15.1.11.tgz#8a70a236e02d8dd62fb0569bedfd5e4290e7af55" + integrity sha512-UiVJaOGhKST58AadwbFUZThlNBmYhKqaCs8bVtm4plTxsgKq0mJ0zTsp7t7j/rzsbAEj9WcAMdZCztjByi4EoQ== dependencies: - "@next/env" "15.1.9" + "@next/env" "15.1.11" "@swc/counter" "0.1.3" "@swc/helpers" "0.5.15" busboy "1.6.0"