組み込みの [details] 機能に最大ネスト深度の制限を追加するか、管理者がこの制限を設定できるサイト設定を導入することを提案します。
問題点
最近、私のDiscourseフォーラムで、あるユーザーが24階層にネストされた [details] セクションを含む投稿を作成しました。
これにより、いくつかの問題が発生しました。
- ブラウザのパフォーマンス: 複数の階層を展開すると、Firefoxが極端に遅くなったり、応答しなくなったりするとの報告がありました。
- Markdownエンドポイントのタイムアウト: トピックの
.mdエンドポイントへのアクセスが極端に遅くなりました。リクエストが19.8秒や31.1秒かかることを確認しました。 - サーバーエラー: Markdownエンドポイントが「Oops」エラーページを返すことがありました。また、Markdown変換中にPitchforkワーカーのタイムアウト警告がDiscourseログに表示されました。
- リソース枯渇のリスク: 検索エンジンやAIクローラーは頻繁に
.mdエンドポイントをリクエストするため、深くネストされた投稿は高コストな処理を繰り返しトリガーし、サーバーリソースを消費する可能性があります。
問題のある投稿を削除した後、MarkdownエンドポイントはHTTP 200を返し、約1.7秒で応答するようになりました。
影響を受けたトピックは以下の通りです。
https://meta.appinn.net/t/topic/87672
(問題のある返信はすでに削除されています。)
改善提案
以下のいずれかの対応が有効だと考えます。
[details]のネストを、2階層または3階層などの合理的な深度に制限する。details_max_nesting_depthのようなサイト設定を追加し、管理者が最大ネスト深度を設定できるようにする。
後方互換性を保つため、設定のデフォルト値は無制限にしつつ、必要に応じて管理者が制限を強制できるようにすることも可能です。
ユーザーが設定された制限を超えた場合、Discourseは明確な検証メッセージとともに投稿を拒否できます。
暫定ワークアラウンド: プラグイン
[details] のネストを最大2階層に制限する小さなプラグインを作成しました。
GitHub - scavin/discourse-details-depth-limit · GitHub
このプラグインはサーバーサイドで投稿を検証し、2階層を超えるネストされた折りたたみセクションを含む投稿を拒否します。
ローカルのDiscourse開発環境で正常に動作することを確認済みです。
同様の問題に直面している管理者にとって、公式のソリューションが利用可能になるまでの暫定ワークアラウンドとして、このプラグインが役立つかもしれません。
組み込みのDetailsプラグインに設定可能な制限を導入することは、意図しないまたは過度なネストに対する有用なセーフガードになると考えます。
