Каковы риски междоменной связи JSONP? - PullRequest
8 голосов
/ 01 сентября 2010

В нашем веб-приложении мы столкнулись с ситуацией, когда нам необходимо выполнять междоменные вызовы AJAX из одного домена, который мы полностью контролируем, в другой домен, который мы полностью контролируем.Я искал лучшее решение, и на ум приходят два локальных файловых прокси (локальных файла с использованием php :: fopen) или jquery / JSONP.

Когда я смотрю в Интернете, я вижу людейобычно говорят о том, как опасно использовать JSONP, потому что кто-то может внедрить в него вредоносные данные.Дилемма состоит в том, что большинство аргументов против этого, кажется, не содержат много воды, поэтому я прихожу сюда, чтобы попросить Стек дать разъяснения.

Каковы конкретные векторы атаки, которые будут открыты междоменной областью JSONP?

Насколько я понимаю, единственным вектором для JSONP является точно такой же вектор, которыйоткрылся включением тега <script> на вашем сайте, src которого является любым сайтом , который не контролируется вами: чтобы они могли стать вредоносными и начать обрабатывать пользовательские сеансы / файлы cookie / данные.Если это так, то может показаться, что дело не в протоколе (JSONP), а в источнике , из которого собираются данные.

Потому что, будь то прокси на стороне сервера, тег <script> или ajax / JSONP, есть риск, что я размещу на своей странице чужой контент, и они могут начать обрабатывать пользовательские сеансы, если ония чувствовал себя обязанным (таким образом, это именно то, что Google Analytics делает с помощью тега скрипта).

Многие векторы, которые я слышу онлайн, зависят от неправильной проверки пользовательских форм и данных.Например, JSONP используется для извлечения некоторого файла, который помещает данные в форму, а затем форма отправляется для вставки базы данных.Если данные из этой формы являются доверенными, поскольку они получены из надежного источника (данные JSONP) и вставлены без проверки, то опять-таки это не JSONP по ошибке, а скорее неправильно проверенный ввод пользователя.Пользователь мог сделать точно такие же изменения в этой форме, используя Firebug, но в последний раз я проверял, что никто не называет Firebug вектором безопасности.

Последний элемент - это представление о том, что при использовании прокси на стороне сервера большевозможность фильтровать результаты перед передачей их клиенту.Тем не менее, будь то PHP или Javascript, я мог бы отфильтровать результаты, чтобы удалить такие вещи, как onclick или iframe.Конечно, кто-то на стороне клиента может изменить мою функцию javascript, чтобы удалить фильтрацию, но фильтрация будет влиять только на их конкретный опыт клиента и не будет изменяться для других пользователей, что предотвращает постоянную многопользовательскую XSS-атаку.

Очевидно, что у прокси на стороне сервера есть некоторые преимущества, поскольку это упростит регистрацию потенциальных XSS-атак, но с точки зрения предотвращения самой атаки, как PHP, так и Javascript, похоже, имеют адекватные утилиты.В некотором смысле кажется, что JSONP на самом деле более безопасен, чем простой тег <script>, потому что по крайней мере с JSONP результат проходит через функцию, что означает его некоторую фильтрацию, а не просто полное доверие, как это происходит с <script>.

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

РЕШЕНИЕ

  1. Если оба конца являются доверенными, в JSONP нет никакой опасности (в основном это просто * 1035)* тег).

  2. Оба скрипта / JSONP содержат одинаковые уязвимости, поскольку они выполняются автоматически, а не просто как данные.Использование прокси-сервера на стороне сервера означает, что междоменный возврат передается как данные и может быть отфильтрован на наличие вредоносного содержимого.Если кросс-домен полностью доверенный, то JSONP / SCRIPT безопасен, если есть подозрение на риск, пропустите его через прокси-фильтр.

Ответы [ 2 ]

6 голосов
/ 01 сентября 2010

Существует БОЛЬШАЯ разница между server-side-proxy и <script>/JSONP. В первом случае вы загружаете данные , в последнем случае вы загружаете и автоматически выполняете код

Когда вы создаете прокси на стороне сервера, код javascript может использовать XmlHttpRequest для загрузки данных . Эти данные не будут выполняться автоматически; Вы должны явно сделать что-то глупое, например eval(), чтобы заставить его выполнить. Даже если формат данных - JSON, а другой сервер был скомпрометирован, а ваш собственный прокси-сервер на стороне сервера не уловил компрометацию, у вас все равно есть линия защиты, доступная вашему клиентскому коду. Например, вы можете проанализировать JSON с помощью safe JSON parser и отклонить вредоносный скрипт.

Но когда вы используете JSONP или тег <script>, вы напрямую включаете чей-либо код . Поскольку его код (а не данные), браузер автоматически выполняет его, не давая вам возможности проверить или изменить его.

Подводя итог, серверный прокси дает вам две дополнительные линии защиты -

  1. Возможность проверки данных на сервере на наличие вредоносного контента
  2. Возможность проверять данные в javascript перед выполнением, если вам вообще нужно его выполнить.
1 голос
/ 01 сентября 2010

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

Еще одна проблема, с которой вы столкнетесь, заключается в том, что некоторые пользователи блокируют сторонние скрипты в качестве меры безопасности. Это также заблокирует ваши запросы JSONP. Подход прокси на стороне сервера не имеет этой проблемы.

...