<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Nov 23, 2014 at 12:27 PM, Michał Wadas <span dir="ltr"><<a href="mailto:michalwadas@gmail.com" target="_blank">michalwadas@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">literal_eval description:<br>
>The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.<br></blockquote><div>Also known as JSON.parse.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
My proposition is "safe eval".<br>
Safe eval ( eval.safe(string: code, callback) ) should perform theses steps:<br>
- Create isolated realm without capabilities to perform almost any IO<br>
(implementation dependant - no XHR, no importScript, no require)<br>
- evaluate code in context of created realm<br>
- post result of last evaluated expression back to creator realm using<br>
structured-clone algorithm<br>
- call callback with returned data<br>
<br>
Pros:<br>
+ sandbox offered by language<br>
+ easy to run in other thread<br>
+ quite easy to polyfill<br>
+ servers can send computations to users<br>
+<br>
Cons:<br>
- Realm creation can be costly (but implementations can solve this<br>
problem in many ways)<br>
- proposal does not include support for asynchronous operations</blockquote><div>evalSandboxed would perhaps be a better term.</div><div><br></div><div>Btw. you can do a sort of sandboxed eval today by overriding all names found in window. There are some caveats however. The so sandboxed code can still access (and change) object internals, such as "mystring".constructor.prototype.asdf = function(){ console.log("gotcha"); }.</div><div><br></div><div>A sandboxes primary purpose isn't just to restrict access to global symbols, it's also to prevent it from corrupting the surrounding codes internals. One way to do that of course would be to have the so sandboxed code run in total isolation on a separate VM instance, however there's some issues with that too.</div><div><br></div><div>It would often be the case that you'd want to provide an interface to the sandboxed code. So sandboxing alone isn't quite sufficient, you'd also need to have a suitable API/syntax to describe interfaces, safe to pass to the sandboxed code, such that the sanboxed code cannot corrupt any piece of those interfaces.</div></div></div></div>