-
Notifications
You must be signed in to change notification settings - Fork 150
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Option to disable the code execution from string (eval and function) #605
Labels
Comments
Hi @simontom, How about something like this: engine.Execute(@"(() => {
const AsyncFunction = (async () => {}).constructor;
const ctor = (function () { throw new Error('Function constructors are disabled'); }).bind();
Object.defineProperty(Function.prototype, 'constructor', { value: ctor });
Object.defineProperty(AsyncFunction.prototype, 'constructor', { value: ctor });
Function = new Proxy(Function, { construct: ctor, apply: ctor });
})()"); Please let us know if that works for you. Thanks! |
Alright, folks, it seems it's working like a charm 🪄 💚 test('test 1', async (t) => {
// Disable Function constructor (works like a charm)
const AsyncFunction = (async () => {}).constructor;
const newThrowingCtor = (function () {
throw new Error('Function constructors are disabled');
}).bind();
Object.defineProperty(Function.prototype, 'constructor', {value: newThrowingCtor});
Object.defineProperty(AsyncFunction.prototype, 'constructor', {value: newThrowingCtor});
Function = new Proxy(Function, {construct: newThrowingCtor, apply: newThrowingCtor});
try {
const FuncCtor = (function () {}).constructor;
const log = new FuncCtor('str', 'console.log(str);');
log('Hello, world! 1');
} catch (e) {
console.log(e);
}
try {
let AsyncFuncCtor = (async function () {}).constructor;
const fetchURL = new AsyncFuncCtor('url', 'return await fetch(url);');
await fetchURL("https://www.google.com")
.then((res) => res.text())
.then((text) => text.slice(0, 100))
.then(console.log);
} catch (e) {
console.log(e);
}
try {
const log = new Function('str', 'console.log(str);');
log('Hello, world! 2');
} catch (e) {
console.log(e);
}
});
IMHO, an option / flag might be a better solution for future handling of such security 💡 |
Thanks a bunch for your lightning-fast help 🙇 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey folks,
our scenario is "customer scriptable multitenant" runtime. We want to be very cautious what to allow.
In order to make it a bit more safer,
we need the ClearScript API to disable
eval
and other ECMAScript APIs that convertstrings
into code (e.g., theFunction
CTOR).I see there is some flag in V8 (pro'ly) resulting right in the behaviour we crave for: "--disallow-code-generation-from-strings"
We were able "disable"
eval
exectuting the following script:This is what I've tried with
function
CTOR so farThe text was updated successfully, but these errors were encountered: