リクエスト詳細
🐛 バグ報告
対応完了
対象アプリ: 合体ドロップ
タイトル画面のトップスコア表示でプレイヤー名に含まれる"</script>"がJS埋め込みを破壊
1. 不具合の内容
pages/play.php で $today_top_scores / $weekly_top_scores / $alltime_top_scores (各モードの1位プレイヤー名とスコア、v1.80.0の機能) を JS へ渡すために json_encode() し、$json_flags = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES を使ってインラインの <script> ブロックへ埋め込んでいます。この配列には scores.player_name (VARCHAR(40)、ユーザーが自由入力するニックネーム) がそのまま含まれます。
2. 根拠・発生しそうな条件
JSON_UNESCAPED_SLASHES を指定すると json_encode はスラッシュ "/" をエスケープしません。もしプレイヤー名に "</script>" という文字列が含まれていた場合 (スコア登録時にニックネームとして入力可能、サーバー側で HTML エスケープはしても JSON エンコード時のスラッシュエスケープは別問題)、埋め込まれた JSON 内の "<\/script>" が "</script>" のまま出力され、ブラウザの HTML パーサーがそこで <script> タグを終了してしまいます。結果としてタイトル画面の初期化用スクリプトの残りが実行されず、以降のゲーム初期化 JS が壊れ、その名前が1位を取っているモードのタイトル/プレイ画面を開いた全ユーザーでゲームが起動できなくなる可能性があります (ページ全体が真っ白または操作不能になる)。過去にも同種のニックネーム由来の表示不整合は無く、今回追加されたトップスコア埋め込み機能 (v1.80.0) 特有の経路です。
3. 期待動作
プレイヤー名にどのような文字列 ("</script>" や HTML タグに類する文字列を含む) が入っていても、タイトル・プレイ画面の JS 埋め込みが破壊されず、常に正しくゲームが初期化されること。
4. 修正方針
- pages/play.php でユーザー入力を含むデータ (today_top_scores, weekly_top_scores, alltime_top_scores など) を <script> ブロックへ埋め込む際は、json_encode に JSON_UNESCAPED_SLASHES を使わない、または json_encode の結果に対して str_replace('</script>', '<\/script>', $json) のような安全なエスケープ処理を追加してから出力する。
- 同様のパターンで他ページ (図鑑・ランキングなど) にもユーザー入力を含むデータを JSON_UNESCAPED_SLASHES 付きでインライン <script> に出力している箇所があれば同じ修正を適用する。
- 併せて、既存の自動テスト・回帰テストに "</script>" を含むプレイヤー名でスコア送信し、タイトル/プレイ画面のHTMLが破壊されないことを確認するケースを追加する。
pages/play.php で $today_top_scores / $weekly_top_scores / $alltime_top_scores (各モードの1位プレイヤー名とスコア、v1.80.0の機能) を JS へ渡すために json_encode() し、$json_flags = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES を使ってインラインの <script> ブロックへ埋め込んでいます。この配列には scores.player_name (VARCHAR(40)、ユーザーが自由入力するニックネーム) がそのまま含まれます。
2. 根拠・発生しそうな条件
JSON_UNESCAPED_SLASHES を指定すると json_encode はスラッシュ "/" をエスケープしません。もしプレイヤー名に "</script>" という文字列が含まれていた場合 (スコア登録時にニックネームとして入力可能、サーバー側で HTML エスケープはしても JSON エンコード時のスラッシュエスケープは別問題)、埋め込まれた JSON 内の "<\/script>" が "</script>" のまま出力され、ブラウザの HTML パーサーがそこで <script> タグを終了してしまいます。結果としてタイトル画面の初期化用スクリプトの残りが実行されず、以降のゲーム初期化 JS が壊れ、その名前が1位を取っているモードのタイトル/プレイ画面を開いた全ユーザーでゲームが起動できなくなる可能性があります (ページ全体が真っ白または操作不能になる)。過去にも同種のニックネーム由来の表示不整合は無く、今回追加されたトップスコア埋め込み機能 (v1.80.0) 特有の経路です。
3. 期待動作
プレイヤー名にどのような文字列 ("</script>" や HTML タグに類する文字列を含む) が入っていても、タイトル・プレイ画面の JS 埋め込みが破壊されず、常に正しくゲームが初期化されること。
4. 修正方針
- pages/play.php でユーザー入力を含むデータ (today_top_scores, weekly_top_scores, alltime_top_scores など) を <script> ブロックへ埋め込む際は、json_encode に JSON_UNESCAPED_SLASHES を使わない、または json_encode の結果に対して str_replace('</script>', '<\/script>', $json) のような安全なエスケープ処理を追加してから出力する。
- 同様のパターンで他ページ (図鑑・ランキングなど) にもユーザー入力を含むデータを JSON_UNESCAPED_SLASHES 付きでインライン <script> に出力している箇所があれば同じ修正を適用する。
- 併せて、既存の自動テスト・回帰テストに "</script>" を含むプレイヤー名でスコア送信し、タイトル/プレイ画面のHTMLが破壊されないことを確認するケースを追加する。
💬 返信 (3)
🛠 開発を開始しました (バグ修正 (vegetable-drop))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「合体ドロップ」のバグ修正を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
ご要望いただいた「合体ドロップ」のバグ修正を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
Echo
Iris