[basecamp/lexxy] DOMPurifyによる画像キャプションのコロン削除問題を修正

basecamp/lexxy

背景

Lexxyでは、セキュリティ対策としてDOMPurifyを使用してHTMLコンテンツをサニタイズしています。しかし、画像のキャプション属性に「photographer: name」のようにコロンを含むテキストを設定すると、その内容が削除されてしまう問題が発生していました。

この問題は、DOMPurifyがデフォルトで属性値をURIとして検証し、コロンを含む文字列を未知のプロトコルスキームと判断してしまうことが原因でした。caption属性はALLOWED_ATTRに含まれていたものの、URI_SAFE_ATTRIBUTESには登録されていなかったため、URI検証が実行されていました。

技術的な変更内容

修正は、DOMPurifyの設定にADD_URI_SAFE_ATTRオプションを追加し、captionfilename属性をURI検証の対象外とすることで実現されました。

変更後:

export function buildConfig() {
  return {
    ALLOWED_TAGS: ALLOWED_HTML_TAGS.concat(Lexxy.global.get("attachmentTagName")),
    ALLOWED_ATTR: ALLOWED_HTML_ATTRIBUTES,
    ADD_URI_SAFE_ATTR: [ "caption", "filename" ],
    SAFE_FOR_XML: false // So that it does not strip attributes that contains serialized HTML (like content)
  }
}

ADD_URI_SAFE_ATTRに指定された属性は、DOMPurifyのURI検証をスキップし、任意のテキストコンテンツを保持できるようになります。これにより、以下のような画像キャプションが正しく処理されるようになりました。

<img src="photo.jpg" caption="photographer: John Doe" />

セキュリティへの影響

captionfilename属性は、実際にはURIとして解釈されることはなく、純粋なテキストデータとして扱われる属性です。そのため、これらをURI検証の対象外とすることで、セキュリティリスクが増加することはありません。むしろ、想定される用途(説明文やファイル名)に対して適切な処理が行われるようになります。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事構成の3要素(Title, Context, Technical Detail)が明確に記述されており、コードブロックの空行やファイル名指定などのカスタムMarkdown構文も正しく使用されています。対象読者であるエンジニアに適した技術レベルで書かれています。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ✓ PASS

技術的な正確性と表現の適切性

記事で引用されているコードはPRの変更内容を正確に反映しています。DOMPurifyに関する技術用語や、URI検証が問題の原因であるという説明も技術的に正確です。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ✓ PASS

元のPR情報との一致度

記事の内容はPRのタイトル、説明、コード変更と完全に一致しており、ハルシネーションは見られません。PR番号やリポジトリ名などの固有名詞も正確です。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除