不正タグ/属性の除去 (OptionOutputAsXml)

HtmlAgilityPack(HAP)における「クリーニングとサニタイズ」の処理の一環として、「不正タグ/属性の除去」は非常に重要な役割を担います。特にOptionOutputAsXmlプロパティは、この目的において動作を制御する重要な設定です。以下に、このプロパティの概要とそれによる不正なタグ・属性の除去のメカニズムについて詳述します。


1. OptionOutputAsXml の概要

HtmlDocument.OptionOutputAsXmlは、HTMLドキュメントをXML準拠の形式で出力するかどうかを指定するbool型のプロパティです。

csharp
HtmlDocument doc = new HtmlDocument(); doc.OptionOutputAsXml = true;

この設定を有効にすると、HTMLの構文が自動的にXMLとして有効な構造に変換され、不正な要素が排除されたり、補完されたりします。


2. 不正タグ・属性の除去との関係

a. HTMLとXMLの構文の違い

HTMLは寛容なパーサ仕様により、閉じタグのない要素や入れ子の不整合などを許容しますが、XMLはこれを許容しません。そのため、OptionOutputAsXml = trueに設定した場合、以下のような処理が行われます:

  • 閉じタグがない要素は補完されます。

  • 不正な構造のタグは修正または削除されます。

  • 重複・不正な属性名や未定義属性などは除去されることがあります。

  • **不正な文字(制御文字や無効なUnicode)**はエスケープまたは削除されます。

b. 例:属性のクリーニング

以下のようなHTML片:

html
<div onclick="alert('xss')" invalidAttr="bad"></div>

OptionOutputAsXmlを有効にした上で保存・出力した場合、不正または非XML準拠の属性(invalidAttrなど)が出力から除去される可能性があります。


3. 注意点

  • セキュリティ上の完全なサニタイズではないOptionOutputAsXmlは構文的な整合性を強制するための機能であり、XSSなどのセキュリティ対策としてのフィルタリングを目的としたものではありません。そのため、JavaScriptイベント属性(例:onclick)などは除去されない場合もあります。

    • → 別途フィルタリングロジックの実装が推奨されます。

  • 元のHTML構造が大きく変更される可能性があるため、デザインやレイアウトが影響を受けることがあります。


4. 補足:サニタイズ処理との併用

より安全なHTMLのクリーニングを行うには、以下の手法と組み合わせることが推奨されます:

  • 明示的に許可タグ・属性のみを抽出するフィルタロジックの実装

  • 正規表現によるスクリプト除去(慎重に扱う必要あり)

  • 外部ライブラリ(例えば AngleSharp + HtmlSanitizer など)との併用


まとめ

機能 説明
OptionOutputAsXml HTML出力時にXML準拠の構文へ変換する設定
不正タグ除去 XMLとして不正な構造・属性を除去・修正
サニタイズ目的 限定的な構文的サニタイズに対応。セキュリティ対策としては不十分
実践的対応 必要に応じて手動フィルタリングや外部ライブラリを併用

ChatGPT4o 生成日:2025/06/23