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.
『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 tojQuery("<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 calljQuery.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 theSAFE_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 アップグレードガイドを参照してください。
ということで、重要そうなところだけ簡単に日本語にしてみました。色々と大変な時期だとは思いますが、早めの確認をおすすめします。