Подтвердить что ты не робот

Лучшая практика: законный межсайтовый скриптинг

В то время как межсайтовый скриптинг обычно считается негативным, я столкнулся с несколькими ситуациями, когда это необходимо.

Недавно я работал в рамках очень ограниченной системы управления контентом. Мне нужно было включить код базы данных на страницу, но на хост-сервере не было ничего доступного для использования. Я установил пару простых скриптов на своем собственном сервере, изначально думая, что я могу использовать 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.

Хотя это решение работает, кажется, что может быть лучший способ сделать то же самое. Каков наилучший способ заставить межсайтовый скриптинг работать специально с целью включения контента из совершенно другого домена?

4b9b3361

Ответ 1

У вас есть три варианта:

  • Создайте серверный прокси-сервер script.
  • Создайте удаленный script для чтения в удаленном динамическом HTML. Используйте библиотеку, например jQuery, чтобы сделать это проще. Вы можете использовать функцию загрузки, чтобы при необходимости добавить HTML. EDIT. Я предположил, например, что # 2 использовал JSONP, для чего серверная сторона script признать "callback =?" пары.

  • Используйте клиентский Flash-прокси и настройте crossdomain.xml на веб-сервере сервера.

Ответ 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]