HTML 仕様の変更: 属性の < と > のエスケープ

Michał Bentkowski
Michał Bentkowski

公開日: 2025 年 6 月 12 日

2025 年 5 月 20 日に、HTML 仕様が更新され、属性内の <> がエスケープされるようになりました。これにより、ミューテーション XSS(mXSS)の脆弱性を防ぐことができます。この変更は Chrome 138 で導入され、2025 年 5 月 28 日にベータ版に昇格し、2025 年 6 月 24 日に安定版になります。

この投稿では、HTML 属性のエスケープ変更がウェブ デベロッパーに及ぼす影響と、発生する可能性のある破損について詳しく説明します。この変更の背後にあるセキュリティ上の理由については、Security Engineering ブログの関連投稿をご覧ください。

何が変更されたのですか?

属性 data-content の値が "<u>hello</u>"<div> 要素があるとします。div.outerHTML を読み取るとどうなりますか?

従来は、次のような HTML が生成されていました。

<div data-content="<u>hello</u>"></div>

変更後、HTML は次のようになります。

<div data-content="&lt;u&gt;hello&lt;/u&gt;"></div>

以前は、<> も属性でエスケープされていませんでした。これらの文字はどちらも常にエスケープされます。

変更されない点

この変更は、シリアル化中に HTML フラグメントが文字列表現に変換される方法のみを変更します。影響は、innerHTML プロパティまたは outerHTML プロパティにアクセスする場合、または要素で getHTML() メソッドが呼び出される場合に限定されます。これらのオペレーションは、既存の DOM 構造を受け取り、テキスト形式の HTML 表現を生成します。

この変更は HTML 解析には影響しません。次の HTML について考えてみましょう。

<div id="div1" data-content="<u>hello</u>"></div>
<div id="div2" data-content="&lt;u&gt;hello&lt;/u&gt;"></div>

どちらの div もまったく同じ方法で解析され、どちらの場合も div.dataset.content"<u>hello</u>" を返します。

破損しないもの

getAttributegetAttributeNSdatasetattributes などの DOM API を使用して属性値を取得すると、以前と同じデコードされた値が返されます。特に、<> はデコードされます。

次の例では、すべての console.log 行が "<u>" をログに記録します。

<div data-content="&lt;u&gt;"></div>
const div = document.querySelector("div");
// All of the following will log "<u>"
console.log(div.getAttribute("data-content"));
console.log(div.dataset.content);
console.log(div.attributes['data-content'].value);

何が破損する可能性があるか

innerHTML と outerHTML を使用して属性を取得する

innerHTML または outerHTML を使用して属性の値を抽出すると、コードが破損する可能性があります。少し複雑ですが、次の例について考えてみましょう。

<div data-content="<u>"></div>
const div = document.querySelector("div");
const content = div.outerHTML.match(/"([^"]+)"/)[1];
console.log(content);

この変更後、このコードの動作は異なります。以前は content"<u>" と同じでしたが、現在は "&lt;u&gt;" です。

なお、正規表現による HTML の解析は推奨されません。属性の値を取得する必要がある場合は、前のセクションで説明した DOM API を使用します。

エンドツーエンド テスト

Chromium を使用して HTML を生成する CI/CD パイプラインがあり、HTML を静的な想定値と比較するテストを作成している場合、いずれかの属性に < または > が含まれていると、これらのテストが破損する可能性があります。

これは想定される破損です。すべての < 文字と > 文字がそれぞれ &lt;&gt;, にエスケープされるように、想定される値を更新する必要があります。

概要

このブログ投稿では、HTML 仕様の変更について説明しました。この変更により、ブラウザは属性内の <> のエスケープを開始し、一部のミューテーション XSS を防ぐことでセキュリティを強化します。

この変更は、2025 年 6 月 24 日に Chromium(バージョン 138)と Firefox(バージョン 140)のすべてのユーザーが利用できるようになります。また、2025 年 9 月頃にリリースされる Safari 26 ベータ版にも含まれています。

この変更によりウェブサイトが機能しなくなり、簡単に修正できないと思われる場合は、https://issues.chromium.org/ でバグを報告してください。

その他の情報