Хотя межсайтовый скриптинг обычно считается отрицательным, я столкнулся с несколькими ситуациями, когда это необходимо.
Недавно я работал в рамках очень ограниченной системы управления контентом. Мне нужно было включить код базы данных на странице, но сервер хостинга не имел ничего доступного. Я установил пару скриптов на моем собственном сервере, изначально думая, что могу использовать 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.
Хотя это решение работает, кажется, что может быть лучший способ выполнить одно и то же. Каков наилучший способ создания межсайтового скриптинга специально для целей включения контента из совершенно другого домена?
У вас есть три варианта:
Создайте удаленный скрипт для чтения в удаленном динамическом HTML. Используйте библиотеку jQuery, чтобы сделать это проще. Вы можете использовать функцию загрузки, чтобы при необходимости добавить HTML. EDIT. Для чего я изначально имел в виду, например, №2, использовался JSONP , который требует, чтобы скрипт на стороне сервера распознавал «callback =?» пары.
Используйте прокси-сервер Flash на стороне клиента и настройте файл crossdomain.xml на веб-сервере вашего сервера.
Лично я хотел бы позвонить в этот другой домен на сервере и получить и проанализировать данные там для использования на вашей странице. Таким образом, вы избегаете каких-либо проблем, и вы получаете доступ к серверному языку / платформе для получения и анализа данных.
Не уверен, что это сработает для вашего конкретного сценария … трудно узнать даже с вашим подробным описанием …
Вы можете попробовать easyXDM , включив очень маленький код, вы можете передавать данные или вызовы методов между документами разных доменов.
Раньше я сталкивался с этим прокси-сервером на стороне сервера YDN . В нем говорится, что он создан для работы с API поиска Yahoo.
Будет ли он работать с любым доменом, если вы просто обрезаете код API Yahoo? Или вам нужно заменить его доменом, с которым вы хотите работать?
Доступ к удаленному контенту iframe можно получить с помощью локального javascript.
Удаленный сервер просто должен установить document.domain
страницы.
Например:
Сайт A содержит iframe с src='Site B/home.php'
home.php выглядит так:
[php stuff]...[/php] [script type='text/javascript']document.domain='Site A'[/script]