🎄
ENCA 25日目: 正規表現の Well-known Symbols メソッドをプリミティブに対して実行しない(進行中)
正規表現の 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(" ");
これは問題があるだろうということで ECMA-262 に PR を出してみました。TC39 会議はメンバーしか参加できないため Deno Land Inc. に所属している Luca さんに依頼をしているのですが、どうやら忙しいようで保留されている状態にあります。進んでくれることを望みます。
1人 ECMAScript Normative Changes Advent Calendar 2024 終わりに
これにて 1人 ECMAScript Normative Changes Advent Calendar 2024 は終わります。楽しんでいただけたでしょうか。少しでも ECMAScript に興味を持つ人が増え、TC39 会議の議題、議事録を読む仲間が増えてくれれば嬉しく思います。
……1人で毎日25記事書くのはとても大変でした。もうやりません。
Discussion