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