Я думаю, что есть несколько других вариантов.
Между прочим, хорошими местами для реальных тестов XSS являются Шпаргалка XSS и HTML5 Security Cheetsheet (новее). Однако проблема в том, что вы хотите разрешить Javascript, но запретить bad Javascript. Это другая и более сложная цель, чем обычный способ предотвращения XSS путем предотвращения всех сценариев.
Хостинг в отдельном домене
Я видел, что это называется "тюрьма Ифраме".
Цель атак XSS - иметь возможность запускать код в том же контексте, что и ваш сайт, то есть в одном домене. Это связано с тем, что код сможет считывать и устанавливать файлы cookie для этого домена, инициировать действия пользователя или исправлять ваш дизайн, перенаправлять и т. Д.
Если, однако, у вас есть два отдельных домена - один для вашего сайта, а другой - только для ненадежного, загруженного пользователем контента, тогда этот контент будет изолирован от вашего основного сайта. Вы можете включить его в iframe, но при этом у него не будет доступа к файлам cookie с вашего сайта, нет доступа к редактированию или изменению дизайна или ссылок вне его iframe, а также к переменным сценариев вашего главного окна (так как находится в другом домене).
Конечно, он может устанавливать куки, сколько ему угодно, и даже читать те, которые он установил. Но они все равно будут изолированы от файлов cookie для вашего сайта. Он не сможет повлиять на файлы cookie вашего основного сайта или прочитать их. Он также может включать в себя другой код, который может раздражать / раздражать пользователя, например всплывающие окна, или может пытаться фишинг (вам нужно визуально прояснить в пользовательском интерфейсе вне фрейма, что обслуживаемый контент не является часть вашего сайта). Тем не менее, это все еще песочница с вашего основного сайта, где у вас есть личная полезная нагрузка - ваши сеансовые куки и целостность вашего всеобъемлющего дизайна страницы и сценариев, сохраняются. Это несёт не меньший, но не больший риск, чем любой сайт в Интернете, который вы можете встроить в iframe.
Использование подмножества Javascript
Были предложены подмножества Javascript, которые обеспечивают разделение сценариев - возможность загружать ненадежный код и не иметь возможности изменять или получать доступ к другому коду, если вы не предоставляете ему возможности для этого.
Посмотрите на такие вещи, как Google CAJA - цель которого - включить именно тот тип сервиса, который вы описали:
Caja позволяет веб-сайтам безопасно встраивать веб-приложения DHTML от третьих лиц и обеспечивает широкое взаимодействие между страницей встраивания и встроенными приложениями. В нем используется модель безопасности объектных возможностей, позволяющая использовать широкий спектр гибких политик безопасности, чтобы содержащаяся страница могла эффективно контролировать использование пользовательских данных встроенными приложениями и позволяла гаджетам предотвращать помехи между элементами пользовательского интерфейса гаджетов.
Одна из проблем здесь заключается в том, что люди, отправляющие код, должны будут программировать его с помощью CAJA API. Это все еще допустимый Javascript, но он не будет иметь доступа к DOM браузера, так как API CAJA обеспечивает доступ. Это затруднит для ваших пользователей портирование некоторого существующего кода. Также есть фаза компиляции. Поскольку Javascript не является безопасным языком, нет способа гарантировать, что код не сможет получить доступ к вашей DOM или другим глобальным переменным без запуска его через анализатор, поэтому CAJA делает это - он компилирует его из входных данных Javascript в выходные данные Javascript, применяя свою модель безопасности .