Лучшая практика: законный межсайтовый скриптинг
В то время как межсайтовый скриптинг обычно считается негативным, я столкнулся с несколькими ситуациями, когда это необходимо.
Недавно я работал в рамках очень ограниченной системы управления контентом. Мне нужно было включить код базы данных на страницу, но на хост-сервере не было ничего доступного для использования. Я установил пару простых скриптов на своем собственном сервере, изначально думая, что я могу использовать 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.
Хотя это решение работает, кажется, что может быть лучший способ сделать то же самое. Каков наилучший способ заставить межсайтовый скриптинг работать специально с целью включения контента из совершенно другого домена?
Ответы
Ответ 1
У вас есть три варианта:
Ответ 2
Лично я хотел бы позвонить в другой домен на сервере и получить и проанализировать данные там для использования на вашей странице. Таким образом, вы избегаете каких-либо проблем, и вы получаете доступ к серверному языку/платформе для получения и анализа данных.
Не уверен, что это сработает для вашего конкретного сценария... трудно узнать даже с вашим подробным описанием...
Ответ 3
Вы можете попробовать easyXDM, включив очень маленький код, вы можете передавать данные или вызовы методов между документами разных доменов.
Ответ 4
Я уже сталкивался с этим прокси-сервер стороннего сервера YDN script. В нем говорится, что он создан для работы с API поиска Yahoo.
Будет ли он работать с любым доменом, если вы просто обрезаете код API Yahoo? Или вам нужно заменить его доменом, с которым вы хотите работать?
Ответ 5
Доступ к удаленному контенту 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]