公開日: 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="<u>hello</u>"></div>
以前は、<
も >
も属性でエスケープされていませんでした。これらの文字はどちらも常にエスケープされます。
変更されない点
この変更は、シリアル化中に HTML フラグメントが文字列表現に変換される方法のみを変更します。影響は、innerHTML
プロパティまたは outerHTML
プロパティにアクセスする場合、または要素で getHTML()
メソッドが呼び出される場合に限定されます。これらのオペレーションは、既存の DOM 構造を受け取り、テキスト形式の HTML 表現を生成します。
この変更は HTML 解析には影響しません。次の HTML について考えてみましょう。
<div id="div1" data-content="<u>hello</u>"></div>
<div id="div2" data-content="<u>hello</u>"></div>
どちらの div
もまったく同じ方法で解析され、どちらの場合も div.dataset.content
は "<u>hello</u>"
を返します。
破損しないもの
getAttribute
、getAttributeNS
、dataset
、attributes
などの DOM API を使用して属性値を取得すると、以前と同じデコードされた値が返されます。特に、<
と >
はデコードされます。
次の例では、すべての console.log
行が "<u>"
をログに記録します。
<div data-content="<u>"></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>"
と同じでしたが、現在は "<u>"
です。
なお、正規表現による HTML の解析は推奨されません。属性の値を取得する必要がある場合は、前のセクションで説明した DOM API を使用します。
エンドツーエンド テスト
Chromium を使用して HTML を生成する CI/CD パイプラインがあり、HTML を静的な想定値と比較するテストを作成している場合、いずれかの属性に <
または >
が含まれていると、これらのテストが破損する可能性があります。
これは想定される破損です。すべての <
文字と >
文字がそれぞれ <
と >,
にエスケープされるように、想定される値を更新する必要があります。
概要
このブログ投稿では、HTML 仕様の変更について説明しました。この変更により、ブラウザは属性内の <
と >
のエスケープを開始し、一部のミューテーション XSS を防ぐことでセキュリティを強化します。
この変更は、2025 年 6 月 24 日に Chromium(バージョン 138)と Firefox(バージョン 140)のすべてのユーザーが利用できるようになります。また、2025 年 9 月頃にリリースされる Safari 26 ベータ版にも含まれています。
この変更によりウェブサイトが機能しなくなり、簡単に修正できないと思われる場合は、https://issues.chromium.org/ でバグを報告してください。