なぜ「XMLエスケープユーティリティ」が業務で重要になるのか
業務システムでは、外部システムとの連携や設定ファイル、ログ出力などで XML を扱う場面がとても多いです。 Web API のリクエスト/レスポンス、バッチ処理の設定、メッセージキューのペイロードなど、XML がまだまだ現役で使われています。
このとき、ユーザー入力や外部から渡された文字列をそのまま XML に埋め込んでしまうと、 XML の構文が壊れたり、意図しない意味で解釈されたりして、処理が失敗したりセキュリティ上の問題につながることがあります。
そこで必要になるのが XMLエスケープ です。 XMLエスケープとは、XML の構文に使われる特殊文字を「ただの文字」として扱えるように、安全な形に変換することです。 ここから、プログラミング初心者向けにステップバイステップで考えながら、 実務で使える XMLエスケープユーティリティを丁寧に解説していきます。
ステップ1 XMLエスケープの役割をイメージで理解する
「構文を壊さない」「意図しない意味にしない」が目的です
まず、XMLエスケープが何を守っているのかをイメージで押さえておきます。
XML は次のような構造を持ちます。
<message>
<text>ここに文字列が入る</text>
</message>
ここにユーザー入力をそのまま埋め込むと、次のような危険なケースが生まれます。
<text>こんにちは & さようなら</text>
この & は XML の世界では「エンティティの開始」を意味します。 & や < のような形で使われることを想定しているため、 単独の & は「不正な構文」として扱われ、XMLパーサがエラーを出してしまいます。
そこで、次のようにエスケープします。
<text>こんにちは & さようなら</text>
こうすると、XMLパーサは & を「アンパサンド(&)」という文字として扱い、 構文は壊れず、意図した通りの文字列として解釈されます。
XMLエスケープの目的は、 「XMLパーサにとって特別な意味を持つ文字を、安全なエンティティに変換すること」 だと理解しておくと分かりやすいです。
ステップ2 どの文字をエスケープすべきか整理する
XMLで特別扱いされる代表的な文字たち
XMLでエスケープすべき代表的な文字は次の通りです。
<(タグの開始)>(タグの終了)&(エンティティの開始)"(属性値の囲み)'(属性値の囲みに使われることがある)
これらの文字は、XMLの構文に直接関わるため、 そのまま文字列として使うと「タグ」「エンティティ」「属性の区切り」として解釈されてしまいます。
そのため、次のようなエンティティに変換します。
<→<>→>&→&"→"'→'
この変換を行うことで、XMLパーサはそれらを「ただの文字」として扱うようになります。
