Каковы риски безопасности при использовании междоменного XMLHttpRequest?
Во многих местах, которые я видел, люди говорили о междоменном XMLHttpRequest, что невозможно по некоторым причинам безопасности. Тем не менее, я не нашел сообщение, указывающее, каковы эти причины безопасности на самом деле?
Люди упоминали, что JSONP является одной из хороших альтернатив. Другой альтернативой было бы использовать Origin
а также Access-Control-Allow-Origin
заголовки.
Тем не менее, я просто хочу знать, какие проблемы безопасности могут возникнуть из-за использования междоменного XMLHttpRequest?
3 ответа
Я думаю, что было бы лучше ответить на ваш вопрос, например, ПОЧЕМУ это было бы ужасно плохо.
Вы идете на мой сайт (example.org). Я загружаю скрипт, который делает клиентский AJAX-запрос на facebook.com/messages/from/yourgirlfriend. Вы вошли в Facebook, и ваш браузер сообщает Facebook, что мой запрос на самом деле вы. Facebook с радостью отправляет мне запрос на сообщение о странных сексуальных вещах, которые вы хотите попробовать. Теперь я знаю о вас то, что вы, вероятно, не хотели, чтобы я знал.
Это, конечно, дикое преувеличение, и, к счастью, невозможно из-за той же политики происхождения.
Разве ты не чувствуешь себя безопаснее сейчас?
Без этих "соображений безопасности" весь Интернет, как вы знаете, не мог бы существовать. На самом деле я выйду на передний план и скажу, что нет правила, более важного для безопасности Интернета, чем политика того же происхождения.
Ни одна веб-страница не может иметь аутентификацию без этих правил, Google, учетные записи веб-почты, так что ничего из этого не может существовать. Это было бы так, как если бы у вас был XSS на каждом домене. Вы можете выполнить XHR против gmail.com и прочитать чью-либо электронную почту. Токены CSRF не будут работать, потому что вы можете прочитать любую страницу и подделать запрос.
Единой политики одного и того же происхождения не существует, но правила четко изложены в справочнике по безопасности браузера Google. Это очень логично, и правила для различных платформ очень похожи, потому что именно так должен работать Интернет.
Делая Access-Control-Allow-Origin: *
Вы утрачиваете свои права, предоставленные вам веб-браузерами для этой страницы. Это имеет серьезные последствия для безопасности. Вы не сможете защитить себя от CSRF с помощью токенов. Capthca может смягчить эту проблему, также может помочь проверка реферера (она будет пустой, если источником является HTTPS). Вы должны прочитать шпаргалку по профилактике CSRF.
Если это было разрешено, злоумышленник, которому удалось внедрить Javascript на вашу страницу (с помощью эксплойта / социальной инженерии), может отправлять данные (обычно конфиденциальные), полученные от ваших клиентов, без их ведома (поскольку запросы XMLHttpRequests не требуют действий пользователя для выполнения и они молчат). Это мера безопасности браузера.
JSONP - это всего лишь обход этой меры безопасности, когда вы предоставляете адресату обратный вызов и поручаете ему все, что вам вернут через этот обратный вызов.
РЕДАКТИРОВАТЬ: Примеры угроз безопасности: вы входите в свою учетную запись электронной почты через Интернет (например, Gmail или Yahoo). Вы продолжаете просмотр (в другой вкладке или даже в текущей вкладке) на другой вредоносный сайт. Этот вредоносный сайт пытается сделать XHR для того же сайта вашей учетной записи электронной почты. Поскольку XHR зависит от вашего поведения, и поскольку это запрос на стороне клиента / браузера, этот запрос будет иметь тот же сеанс, который вы использовали для входа в систему, и, следовательно, этот веб-сайт может делать с вашей учетной записью все, что угодно (отправлять спам через ваша учетная запись, загрузить ваши контакты,... и т. д.). Другой пример: на форуме кому-то удается внедрить Javascript с XHR на другой сайт. Теперь он может украсть список контактов (и, возможно, затем удалить их) у всех людей, которые посещают его пост на форуме (используя тот же сеанс вашей электронной почты в сети). Не говоря уже о том, что он может поделиться сессией участников форума, посетивших его пост, чтобы получить любые данные, которые они имеют на форуме (личные сообщения /friends..etc). Затем он может отправить эти данные на свой сервер, чтобы сохранить их.