2010-08-25 2 views
2

Как и многие разработчики, я хочу, чтобы JavaScript, обслуживаемый сервером «A», разговаривал с веб-службой на сервере «B», но меня замешал текущий инкарнация same origin policy. Наиболее безопасным средством преодоления этого (что я могу найти) является серверный скрипт, который находится на сервере «А» и действует как прокси-сервер между ним и «В». Но если я хочу развернуть этот JavaScript в различных клиентских средах (RoR, PHP, Python, .NET и т. Д.) И не могу писать сценарии прокси для всех из них, что мне делать?Безопасная реализация скрипта для взлома XSS?

Использование JSONP, some people say. Ну, Doug Crockford указал on his website и in interviews, что взлом скрипта сценария (используемый JSONP) является небезопасным способом обойти одну и ту же политику происхождения. Нет никакого способа, чтобы скрипт служил «А», чтобы убедиться, что «В» - это тот, кто они говорят, и что возвращаемые данные не являются вредоносными или будут захватывать конфиденциальные данные пользователя на этой странице (например, номера кредитных карт) и передайте его подлым людям. Это похоже на разумную проблему, но что, если я просто использую скрипт-скрипт для взлома сам по себе и строго передаю JSON? Это безопасно? Если нет, почему бы и нет? Будет ли более безопасным использование HTTPS? Будут оценены примеры сценариев.

Дополнение: Поддержка IE6 не требуется. Сторонние расширения браузера не являются опцией. Давайте рассмотрим достоинства и риски взлома тэга сценария, пожалуйста.

+0

Что вы подразумеваете под 'what, если я просто использую скрипт-тег hack сам по себе и общаюсь строго в JSON?'? –

+0

Сценарий, созданный с помощью «A», будет содержать инструкцию, которая добавит тег сценария к DOM клиента. Этот тег скрипта будет включать вызов AJAX, который будет извлекать чистые данные JSON из «B» в другом домене. Если скрипт, обслуживаемый «A», анализирует ответ как JSON, не будет ли какое-либо заполнение JavaScript (иначе говоря, JSONP, вредоносным или иным образом) приведет к ошибке синтаксического анализа? – Adam

ответ

0

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

Если бы я потрудился проверить мое предположение, прежде чем публиковать вопрос, я бы знал, что это атрибут источника добавленного тега, который не ограничен. JSONP делает это еще дальше, установив протокол, который обертывает традиционные ответы веб-службы JSON в функции обратного вызова.

Независимо от того, как используется взломать тег сценария, однако нет возможности отображать ответ на вредоносный код, поскольку браузеры выполняют все JavaScript-запросы.И ни IE, ни Firefox, ни браузеры Webkit не проверяют SSL-сертификаты в этом сценарии. Даг Крокфорд, насколько я могу судить, прав. Не существует безопасного способа выполнить перекрестный доменный скриптинг с JavaScript 1.8.5.

2

В настоящее время разработчики браузера разделены на то, как должен работать JavaScript JavaScript. Безопасным и простым в использовании optoin является Flash Crossdomain.xml file. На большинстве языков есть Cross Domain Proxies, написанный для них, и они с открытым исходным кодом.

Более гнусным решением было бы использовать xss, как используется для распространения Sammy Worm. XSS можно использовать для «чтения» удаленного домена с помощью xmlhttprequest. XSS не требуется, если другие домены добавили <script src="https://YOUR_DOMAIN"></script>. Подобный скриптовый тег позволяет оценить ваш собственный JavaScript в контексте другого домена, который идентичен XSS.

Также важно отметить, что даже с ограничениями на одну и ту же политику происхождения вы можете заставить браузер передавать запросы в любой домен, вы просто не можете прочитать ответ. Это основа CSRF. Вы можете писать невидимые теги изображений на страницу динамически, чтобы заставить браузер отключить неограниченное количество запросов GET. Это использование тегов изображений заключается в том, как злоумышленник получает documnet.cookie с использованием XSS в другом домене. CSRF POST использует работу, создавая форму, а затем вызывает .submit() на объекте формы.

Чтобы понять ту же политику оргина, CSRF и XSS лучше, вы должны прочитать Google Browser Security Handbook.

0

Что делать, если я просто использую скрипт-скрипт для взлома сам по себе и строго связан с JSON? Это безопасно? Если нет, почему бы и нет?

Допустим, у вас есть два сервера - frontend.com и backend.com. frontend.com включает в себя тег <script>: <script src="http://backend.com/code.js"></script>.

, когда браузер оценивает code.js считается частью frontend.com и НЕ является частью backend.com. Итак, если код.js содержит код XHR для связи с backend.com, , он не сработает.

Будет ли более безопасным использование HTTPS? Будут оценены примеры сценариев.

Если вы просто конвертируется ваш <script src="https://backend.com/code.js> в протокол HTTPS, это будет НЕ быть любым безопасным. Если остальной частью вашей страницы является http, тогда злоумышленник может легко создать man-in-the-middle страницу и изменить https на http - или, что еще хуже, включить свой собственный файл javascript.

Если вы преобразуете всю страницу и все ее компоненты в https, это будет более безопасно. Но если вы достаточно параноичны для этого, вы также должны быть параноидальными, чтобы не зависеть от внешнего сервера для данных. Если злоумышленник компрометирует backend.com, он эффективно получил достаточное количество рычагов на frontend.com, frontend2.com и на всех ваших сайтах.

Одним словом, https полезен, но это не поможет вам, если ваш серверный сервер будет скомпрометирован.

Итак, какие у меня варианты?

  1. Добавить прокси-сервер на каждом из клиентских приложений. Вам не нужно писать какой-либо код, ваш веб-сервер может автоматически сделать это за вас. Если вы используете Apache, смотрите mod_rewrite
  2. Если ваши пользователи используют последние браузеры, вы можете рассмотреть возможность использования Cross Origin Resource Sharing.
  3. Как указал Ладья, вы также можете использовать Flash + Crossdomain. Или вы можете использовать Silverlight и его эквивалент Crossdomain. Обе технологии позволяют вам общаться с javascript - поэтому вам просто нужно написать служебную функцию, а затем нормальный js-код будет работать. Я считаю, что YUI уже предоставляет флэш-обертку для этого - проверить YUI3 IO

Что вы порекомендуете?

Моя рекомендация - создать прокси-сервер и использовать https на вашем веб-сайте.

1

Взгляните на easyXDM, это чистая библиотека javascript, которая позволяет вам общаться через границу домена без какого-либо взаимодействия на стороне сервера. Он даже поддерживает RPC из коробки.
Он поддерживает все «современные» браузеры, а также IE6 с временем проезда < 15ms.

Обычная утилита заключается в том, чтобы использовать ее для предоставления конечной точки ajax, позволяя вам выполнять кросс-доменную ajax с небольшим усилием (проверьте небольшой образец на первой странице).