Хотя межсайтовый скриптинг обычно считается отрицательным, я сталкивался с несколькими ситуациями, когда это необходимо.
Я недавно работал в рамках очень ограниченной системы управления контентом. Мне нужно было включить код базы данных на страницу, но на хост-сервере не было ничего доступного. Я установил пару собственных сценариев на своем собственном сервере, изначально думая, что мог бы использовать AJAX для импорта содержимого моих сценариев непосредственно в шаблон CMS (таким образом, сохраняя динамические изображения, элементы меню, CSS и т. Д.). Я был не прав.
Из-за ограничений XMLHttpRequest
объектов невозможно получить контент из другого домена. Поэтому я подумал iFrame - хотя я и не фанат фреймов, я подумал, что могу создать фрейм, соответствующий ширине и высоте содержимого, чтобы он выглядел как собственный. Опять же, я был заблокирован межсайтовым скриптингом "защиты". Хотя я действительно мог загрузить удаленный файл в iFrame , я не смог выполнить JavaScript, чтобы изменить его размер на странице хоста или внутри загруженной страницы.
В этом конкретном сценарии я не смог указать поддомен на моем сервере. Я также не смог создать на сервере CMS сценарий, который мог бы прокси-контент с моего сервера, поэтому моей последней мыслью было использование удаленного JavaScript.
Удаленный JavaScript работает. Он ломается, когда у пользователя отключен JavaScript, что является недостатком; но это работает. Проблема, с которой я столкнулся при использовании удаленного JavaScript, заключалась в том, что мне пришлось использовать функцию JS document.write()
для вывода любого контента. Любой вывод, который не является JS, вызывает ошибки скрипта. В дополнение к использованию document.write()
для каждой строки, вы также должны убедиться, что содержимое экранировано - иначе вы получите больше ошибок скрипта.
Мое решение было следующим:
Мой сценарий получил параметр GET («страница»), а затем искал файл ({$page}.php
) и считал содержимое в переменную. Однако мне пришлось использовать неуклюжие методы буферизации, чтобы фактически выполнить включенные сценарии (для таких вещей, как взаимодействие с базой данных), а затем удалить окончательное содержимое всех символов разрыва строки (\n
) с последующим экранированием всех необходимых символов. Конечным результатом является то, что мой оригинальный скрипт (который выводит JavaScript) получает доступ к «стандартным» скриптам на моем сервере и преобразует их стандартный вывод в JavaScript для отображения в шаблоне CMS.
Хотя это решение работает, похоже, что может быть лучший способ выполнить то же самое. Каков наилучший способ заставить межсайтовый скриптинг работать специально для включения контента из совершенно другого домена?