Лучший долгосрочный выбор: JSONP против EasyXDM

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

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

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


person Malartre    schedule 09.09.2011    source источник


Ответы (1)


Отказ от ответственности: я являюсь основным автором 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 можно использовать как для клиента/клиента, так и для клиента/сервера, если одна из сторон использует XHR.

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

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

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

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

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

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

person Sean Kinsey    schedule 10.09.2011
comment
Вау, это отличный ответ! Я не хочу хранить файл cookie или имя клиента в небезопасном домене. Я думал, что небезопасный домен может вызвать безопасный домен с помощью EasyXDM и получить его информацию таким ограниченным способом, без передачи какой-либо информации через небезопасный http. Еще раз большое спасибо. - person Malartre; 12.09.2011
comment
Отличный ответ! Я бы просто возражал против одной вещи, так как я лично должен был ее решить. Когда вы описываете свой способ проверки подлинности в конце и заключаете: поскольку секрет может быть только у двух сторон, информация проверяется. это на самом деле не правильно. Кто-то в принципе может внедрить безопасный iframe в небезопасную среду. Приложение, внедряющее ваш безопасный iframe, должно подписывать свои запросы с помощью секрета сеанса, чтобы убедиться, что они исходят из приложения. Ваш сервер может проверить как файл cookie сеанса, так и подпись приложения, прежде чем что-то делать. - person Gregory Magarshak; 04.02.2012