Как я могу поместить в песочницу ненадежный пользовательский контент JavaScript?
Мне нужно разместить на своем сайте пользовательские скрипты (вроде какjsfiddle). Я хочу, чтобы скрипты выполнялись в браузерах посетителей безопасным способом, изолированным от страницы, на которой они обслуживаются. Поскольку код предоставляется пользователями, нет никаких гарантий, что он заслуживает доверия.
Прямо сейчас я могу думать о трех вариантах:
Serve the user-submitted content in an iframe from a different domain, and rely on the same-origin policy. This would require setting up an additional domain which I'd like to avoid if possible. I believe this is how jsfiddle does it. The script can still do some damage, changingtop.location.href
for example, which is less than ideal. http://jsfiddle.net/PzkUw/
Use the sandbox attribute. I suspect this is not well supported across browsers.
Sanitize the scripts before serving them. I would rather not go there.
Есть ли другие решения или рекомендации по вышеуказанному?
Update
Если, как я подозреваю, первый вариант является лучшим решением,what can a malicious script do other than change the top window location, and how can I prevent this? Я могу манипулировать или отклонять определенные сценарии на основе статического анализа кода, но этожесткий учитывая количество способов доступа к объектам и сложность статического анализа javascript в целом. По крайней мере, для этого потребуется полноценный синтаксический анализатор и ряд сложных правил (некоторые, но я подозреваю, что не все, из которых присутствуют в JSLint).