🎄
ENCA 18日目: eval で CodeLike オブジェクトを実行可能に(進行中)
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"]
eval
で CodeLike
オブジェクトを実行可能に(進行中)
XSS 対策として Trusted Types が進行中です。Content Security Policy の設定をすることで innerHTML
や eval
などに対して直接文字列を渡せなくし、無害化する処理を必ず通ることが保証されます。
const sanitizedPolicy = trustedTypes.createPolicy("sanitized", {
createHTML(input) {/* */},
createScript(input) {/* */},
createScriptURL(input) {/* */},
});
const trustedScript = sanitizedPolicy.createScript("1 + 2");
eval(trustedScript);
ここで TrustedScript
というオブジェクトに対して eval
を実行できるようにするために ECMAScript 側での対応が必要となりました。プリミティブな文字列の他に、所謂 CodeLike
オブジェクトである場合でも eval
を実行出来るようにする変更が進行中です。
Discussion