В нашем веб-приложении мы столкнулись с ситуацией, когда нам нужно выполнять междоменные вызовы AJAX из одного домена, который мы полностью контролируем в другом домене, который мы полностью контролируем. Я занимаюсь серфингом для лучшего решения, а два, которые приходят на ум, - это локальный прокси-файл (локальный файл с использованием php :: fopen) или jquery/JSONP.Каковы риски межсетевого обмена JSONP?
Когда я смотрю онлайн, я вижу, что люди регулярно говорят о том, как опасно использовать JSONP, потому что кто-то может вводить в него вредоносные данные. Дилемма заключается в том, что большинство аргументов против этого, похоже, не содержат много воды, поэтому я прихожу сюда, чтобы попросить Стек для разъяснения.
Каковы конкретные векторы атаки, которые будут открываться перекрестным доменом JSONP?
Из моего понимания единственного вектора JSONP точно такой же вектор, который открыл счет включения <script>
тега на сайте которого ЦСИ является любого сайта, который не контролируется вами: То, что они могли бы превратить злонамеренные и начать фермерские сессии пользователей/файлы 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 для включения содержимого файла, которому мы доверяем, из источника, которому мы доверяем. Это точная оценка?
РЕШЕНИЕ
Если оба конца доверяют, нет никакой опасности в JSONP (это в основном только
<script>
тег).Оба сценария/JSONP имеют одинаковые уязвимости безопасности, поскольку они автоматически выполняются, а не просто передаются как данные. Использование прокси-сервера на стороне сервера означает, что междоменное возвращение передается как данные и может быть отфильтровано для вредоносного содержимого. Если кросс-домен полностью доверен, JSONP/SCRIPT безопасен, если есть подозрение на риск, а затем передать его через прокси-сервер фильтра.
Вам необязательно создавать прокси-сервер, используя 'fopen'. Вы могли бы также использовать Apache 'mod_proxy' для обслуживания запросов из другого домена. –