🎄

ENCA 18日目: eval で CodeLike オブジェクトを実行可能に(進行中)

2024/12/18に公開

eval はプリミティブな文字列しか実行しない

eval はプリミティブな文字列のみを実行します。それ以外が渡ってきた場合は単にそのまま返す仕様となっています。

// プリミティブな文字列は実行する
console.log(eval("1 + 2")); // 3

// それ以外はそのまま返す
console.log(eval(42)); // 42
console.log(eval({ foo: "foo" })); // { foo: "foo" }

余談ですが文字列のプリミティブラッパーオブジェクトも素通りします。

console.log(new String("1 + 2")); // [String: "1 + 2"]

evalCodeLike オブジェクトを実行可能に(進行中)

XSS 対策として Trusted Types が進行中です。Content Security Policy の設定をすることで innerHTMLeval などに対して直接文字列を渡せなくし、無害化する処理を必ず通ることが保証されます。

const sanitizedPolicy = trustedTypes.createPolicy("sanitized", {
  createHTML(input) {/* */},
  createScript(input) {/* */},
  createScriptURL(input) {/* */},
});
const trustedScript = sanitizedPolicy.createScript("1 + 2");
eval(trustedScript);

ここで TrustedScript というオブジェクトに対して eval を実行できるようにするために ECMAScript 側での対応が必要となりました。プリミティブな文字列の他に、所謂 CodeLike オブジェクトである場合でも eval を実行出来るようにする変更が進行中です。

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

Discussion