Лучший долгосрочный выбор: JSONP против EasyXDM - PullRequest
32 голосов
/ 09 сентября 2011

Что является лучшим долгосрочным выбором между JSONP и EasyXDM , чтобы позволить домену на http общаться с тем же доменом по https (кросс-протокол))?

Например, мне бы хотелось, чтобы http://mywebsite.com общался с https://mywebsite.com, потому что cookie-файл сеанса только через https.Я хотел бы отобразить имя пользователя на веб-сайте http без передачи этих данных по http.

EasyXDM пугает меня с помощью выпуска безопасности , а JSONP не очень ясно понимает меры предосторожности.

1 Ответ

74 голосов
/ 10 сентября 2011

Отказ от ответственности: я являюсь основным автором easyXDM .


На самом деле ответить на этот вопрос непросто, так как есть много вещей, которые следует учитывать.

Во-первых, давайте сравним easyXDM и JSONP вне рамок вопроса.

JSONP позволяет клиентской программе (Javascript, использующей BOM / DOM) взаимодействовать с серверная программа (.net, php и т. д. с использованием базы данных, хранилища сеансов и т. д.), и только клиент может инициировать обмен сообщениями (запрос / ответ, опрос или push, хотя для push вы можете легко установить IMG.src, сделайте XHR или сообщение FORM, так как вам не требуется ответ).
Клиент ограничен в объеме данных, которые он может отправить на сервер, и эти данные также должны быть отформатированы, чтобы соответствовать параметру строки запросаи сервер должен быть настроен для ответа на указанные данные.Для каждого сообщения выполняется сетевое отключение с учетом стоимости, которую оно несет.

easyXDM облегчает обмен сообщениями между любыми двумя клиентскими программами , используя транспортный стек на основе строк.Там не должно быть никаких программ на стороне сервера, и нет сетевого трафика.Обе стороны равны и могут инициировать обмен сообщениями, и оба могут сохранять состояние на клиенте (отсюда термин программы вместо простого Javascript ).Размер сообщений не ограничен, и до тех пор, пока данные могут быть сериализованы в строку, транспорт может их обрабатывать (easyXDM позволяет вам установить собственный сериализатор или использовать JSON).

ОсновнойРазница между этими двумя заключается в том, что один находится между клиентом и сервером, где только клиент может инициировать обмен сообщениями, а другой - между двумя равными клиентскими программами, где либо один может использовать XHR и другие средства для связи или ретрансляции данных всервер.

Что касается безопасности;JSONP требует, чтобы клиент полностью доверял серверу, ведь он позволяет ему запускать произвольный код в своей программе.Кроме этого, есть несколько проблем, но это серьезная проблема.
С easyXDM только информация (строка) и никакой код не передаются, и получатель должен проверить информацию и действовать в соответствии с ней.Таким образом, абсолютно отсутствует риск выполнения произвольного кода .Хотя приведенное выше верно, некоторые из компонентов, на которые easyXDM полагался при установлении канала, были уязвимы для XSS (специально созданный URL-адрес заставил бы клиента выполнять произвольный код), но они были закрыты.В настоящее время такие уязвимости не известны, и весь новый код тщательно проверяется.

Я сам использую easyXDM для нескольких требовательных проектов, и такие сайты, как LinkedIn, Twitter и Disqus , а также приложения, запущенные Nokia и другими, создали свои приложения поверх предоставляемой инфраструктуры обмена сообщениями.благодаря easyXDM, есть много людей, которые просмотрели код и проверили его, и которые используют его, ручаются за его безопасность.

В конце концов, это действительно вариант использования.Например, JSONP нельзя использовать для изменения размера окна в разных доменах, поскольку для этого требуется связь клиент / клиент .Но easyXDM можно использовать как для клиента / клиента, так и для клиента / server , если одна из сторон использует XHR.

В вашем случае ни одна из них на самом деле не требуется, если вам нужно простосделать небольшую часть информации доступной в незащищенном домене.

  • Перейдите через безопасный домен, установите cookie на незащищенном домене
  • Перейдите через безопасный домен, сделайте так, чтобы он перенаправлялк незащищенной передаваемой информации в его запросе
  • Перейдите через защищенный домен, сохраните его в файле window.name перед перенаправлением на незащищенный.

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

  • В незащищенном домене создайте случайный секрет, сохраните его и перенаправьте в незащищенный домен, передавший секрет.
  • На защищенном домене передайте секрет вместе с информацией (используя любое из средств, описанных выше)
  • на клиенте убедитесь, что информация содержит секрет.

Так как только две стороны могут иметь секрет, информация проверяется.

В заключение , на самом деле нет однозначного ответа, все зависит от ситуации. Так что выбирайте, но выбирайте с умом :) 1067 *

...