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

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

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

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

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

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

  3. Используйте прокси-сервер 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]