Мне нужно обслуживать созданные пользователем сценарии на моем сайте (вроде jsfiddle). Я хочу, чтобы скрипты запускались в браузерах посетителей безопасным образом, изолированным от страницы, на которой они были отправлены. Поскольку код отправляется пользователями, нет гарантии, что он заслуживает доверия.
Сейчас я могу представить три варианта:
- Подавать контент, отправленный пользователем в iframe из другого домена, и полагаться на политику одного и того же происхождения. Это потребует установки дополнительного домена, который я бы хотел избежать, если это возможно. Я считаю, что это так, как это делает jsfiddle. script может по-прежнему наносить некоторый урон, изменяя, например,
top.location.href
, что меньше идеала. http://jsfiddle.net/PzkUw/ - Используйте атрибут sandbox. Я подозреваю, что это плохо поддерживается в браузерах.
- Санируйте скрипты перед их обслуживанием. Я бы предпочел не идти туда.
Есть ли другие решения или рекомендации по вышеуказанному?
Обновление
Если, как я подозреваю, первый вариант - лучшее решение, , что может сделать вредоносное script, кроме изменения местоположения верхнего окна, и как я могу предотвратить это? Я могу манипулировать или отклонять определенные сценарии на основе анализа статического кода, но это hard, учитывая количество способов доступа к объектам и сложность анализа javascript в целом статически. По крайней мере, для этого потребуется полномасштабный парсер и ряд сложных правил (некоторые, но я подозреваю не все, из которых присутствуют в JSLint).