🎄

ENCA 25日目: 正規表現の Well-known Symbols メソッドをプリミティブに対して実行しない(進行中)

2024/12/25に公開

正規表現の Well-known Symbols メソッド

前回の記事で触れていますが、文字列のメソッドの引数に正規表現を渡した際に Well-known Symbols メソッドが実行されます。6つのメソッドに対応する Well-known Symbols が5つあります。

文字列のメソッド 対応する正規表現の Well-known Symbols
String.prototype.match Symbol.match
String.prototype.matchAll Symbol.matchAll
String.prototype.replace Symbol.replace
String.prototype.replaceAll Symbol.replace(同上)
String.prototype.search Symbol.search
String.prototype.split Symbol.split

正規表現の Well-known Symbols メソッドをプリミティブに対して実行しない(進行中)

文字列のメソッドで呼ばれる正規表現の Well-known Symbols メソッドですが、渡ってくる引数がオブジェクトかどうかの判定をしておらず、プリミティブに対しても実行されてしまうことを見つけてしまいました。

つまりプロトタイプ汚染することによって、想定されていないコードを実行させることが出来てしまいます(Node.js REPL で試すと内部コードから呼び出されてクラッシュします)。

// プロトタイプ汚染
String.prototype[Symbol.split] = () => { throw new Error("bang!"); };

// throws Error
"foo bar".split(" ");

https://github.com/denoland/deno/issues/17473

これは問題があるだろうということで ECMA-262 に PR を出してみました。TC39 会議はメンバーしか参加できないため Deno Land Inc. に所属している Luca さんに依頼をしているのですが、どうやら忙しいようで保留されている状態にあります。進んでくれることを望みます。

https://github.com/tc39/ecma262/pull/3009

1人 ECMAScript Normative Changes Advent Calendar 2024 終わりに

これにて 1人 ECMAScript Normative Changes Advent Calendar 2024 は終わります。楽しんでいただけたでしょうか。少しでも ECMAScript に興味を持つ人が増え、TC39 会議の議題議事録を読む仲間が増えてくれれば嬉しく思います。

https://adventar.org/calendars/10903

……1人で毎日25記事書くのはとても大変でした。もうやりません。

Discussion