jQuery 3.5.0 がリリース。セキュリティ修正あり

jQuery 公式サイトにて jQuery 3.5.0 のリリースがアナウンスされました。すでに npm などでは使用可能になっています。今回のリリースにはセキュリティ関連の修正も含まれるため、jQuery を使用している場合は早めのアップデート対応が推奨されます。

jQuery 3.4.1 のリリースから、約 1年程経ちましたが、先日、jQuery 公式サイトにて jQuery 3.5.0 のリリースがアナウンスされました。

すでに npm などでは使用可能になっています。Google など、サードパーティの CDN から配信開始されるまでにはまだ少し時間がかかる可能性がありますが(本記事執筆時点ではまだ配信されていません)、順次使用可能になると思われます。

今回のリリースには セキュリティ関連の修正も含まれているため、早めの対応が必要かと思います。

jQuery 3.5.0 has been released! As usual, the release is available on our cdn and the npm package manager. Other third party CDNs will probably have it soon as well, but remember that we don't control their release schedules and they will need some time.

We hope you're staying healthy and safe while so many of us are stuck at home. With a virus ravaging the planet, we realize that jQuery may not be a high priority for you or the sites you manage. When you do have a moment, we recommend that you review this new version and upgrade.

jQuery 3.5.0 Released! - Official jQuery Blog より引用

『COVID-19(新型コロナウイルス) で大騒ぎの時に Web サイトの管理とか優先順位は低いと思うけど、時間のあるときには対応しといてね』 という感じでリリースの内容も今のご時世を反映したものに。

Security Fix


以降、英語部分はすべて 「jQuery 3.5.0 Released! - Official jQuery Blog」 より引用。日本語訳は意訳を含むので詳しくは元のリリースを参照してください。

The main change in this release is a security fix, and it's possible you will need to change your own code to adapt. Here's why: jQuery used a regex in its jQuery.htmlPrefilter method to ensure that all closing tags were XHTML-compliant when passed to methods. For example, this prefilter ensured that a call like jQuery("<div class='hot' />") is actually converted to jQuery("<div class='hot'></div>"). Recently, an issue was reported that demonstrated the regex could introduce a cross-site scripting (XSS) vulnerability.

簡単に言うと、jQuery.htmlPrefilter が正規表現を使用して行っていた HTML タグの変換(例えば、jQuery("<div class='hot' />") のような入力が jQuery("<div class='hot'></div>") のように変換されることで、XHTML に準拠した HTML タグの出力が可能だった) に関して、この正規表現が原因でクロスサイトスクリプティング(XSS) の脆弱性を引き起こす可能性があることがわかったと。

The HTML parser in jQuery <=3.4.1 usually did the right thing, but there were edge cases where parsing would have unintended consequences. The jQuery team agreed it was necessary to fix this in a minor release, even though some code relies on the previous behavior and may break. The jQuery.htmlPrefilter function does not use a regex in 3.5.0 and passes the string through unchanged.

ということで、jQuery 3.5.0 では、jQuery.htmlPrefilter は正規表現を使用せず、与えられた文字列をそのまま通過させることにしたとのこと。

If you absolutely need the old behavior, using the latest version of the jQuery migrate plugin provides a function to restore the old jQuery.htmlPrefilter. After including the plugin you can call jQuery.UNSAFE_restoreLegacyHtmlPrefilter() and jQuery will again ensure XHTML-compliant closing tags.

どうしても旧来の動作 (jQuery 3.4.1 以前の動作) が必要な場合は、最新バージョンの jQuery migrate プラグインを使用することで、旧来の jQuery.htmlPrefilter を復元することが可能です。プラグインをインクルードした上で、jQuery.UNSAFE_restoreLegacyHtmlPrefilter() を呼び出すと、旧来のように jQuery が XHTML に準拠した HTML タグの出力を行ってくれます。

However, to sanitize user input properly, we also recommend using dompurify with the SAFE_FOR_JQUERY option to sanitize HTML from a user. If you don't need the old behavior, but would still like to sanitize HTML from a user, dompurify should be used without the SAFE_FOR_JQUERY option, starting in jQuery 3.5.0. For more details, please see the 3.5 Upgrade Guide.

ただし、これによって jQuery 3.5.0 で行われたセキュリティ修正が失われてしまいますので、ユーザーからの入力を適切にサニタイズするためには、例えば SAFE_FOR_JQUERY オプションと合わせて DOMPurify を使用することをお勧めします。

なお、jQuery 3.5.0 以降で DOMPurify を使う場合は、SAFE_FOR_JQUERY オプションなしで使用する必要があります。詳細については、jQuery 3.5 アップグレードガイドを参照してください。