Лучшая практика: законные межсайтовые сценарии - PullRequest
20 голосов
/ 09 сентября 2008

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

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

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

Ответы [ 5 ]

14 голосов
/ 10 сентября 2008

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

  1. Создание сценария прокси на стороне сервера .
  2. Создать удаленный скрипт для чтения в удаленном динамическом HTML. Используйте библиотеку вроде jQuery , чтобы упростить это. Вы можете использовать функцию загрузки для внедрения HTML, где это необходимо. РЕДАКТИРОВАТЬ То, что я изначально имел в виду, например, для # 2, использовало JSONP , что требует от сценария на стороне сервера распознавать "callback =?" пары.

  3. Используйте клиентский Flash-прокси и настройте файл crossdomain.xml в корневом каталоге вашего сервера.

2 голосов
/ 09 сентября 2008

Лично я бы позвонил в этот другой домен на сервере и получил бы и проанализировал там данные для использования на вашей странице. Таким образом вы избежите каких-либо проблем и получите возможность использовать серверную язык / платформу для получения и анализа данных.

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

1 голос
/ 06 июля 2009

Вы можете попробовать easyXDM , включив очень мало кода, вы можете передавать данные или вызовы методов между документами разных доменов.

0 голосов
/ 10 мая 2010

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]
0 голосов
/ 15 сентября 2008

Я уже сталкивался с этим прокси-скриптом на стороне сервера YDN ранее. Там написано, что он работает с поисковыми API Yahoo.

Будет ли он работать с любым доменом, если вы просто удалите код API Yahoo? Или вам нужно заменить его доменом, с которым вы хотите работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...