2012-03-15 3 views
52

Я разрабатываю веб-API JSON/REST, для которого я специально хочу, чтобы сторонние веб-сайты могли позвонить мне через AJAX. Таким образом, моя служба посылает знаменитый CORS заголовок:Когда безопасно использовать CORS?

Access-Control-Allow-Origin: * 

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

Однако подразделение моего веб-ави не является общедоступным и требует аутентификации (довольно стандартный материал с OAuth и cookie access_token). Безопасно ли включить CORS на эту часть моего сайта?

С одной стороны, было бы здорово, если бы на сторонних сайтах могли быть клиенты ajax, которые также взаимодействуют с этой частью моего сервиса. Однако причина, по которой вначале существует одна и та же политика происхождения, заключается в том, что это может быть рискованным. Вы не хотите, чтобы какой-либо веб-сайт посещал вас, чтобы иметь доступ к вашему частному контенту.

Сценарий, который я боюсь, заключается в том, что пользователь входит в мой веб-сайт, либо на веб-сайте, либо через веб-сайт, которому он доверяет, и он забывает выйти из системы. Будет ли это позволять каждому другому веб-сайту, который он впоследствии откроет для доступа к своему частному контенту, используя существующую сессию?

Так мои вопросы:

  • Является ли это когда-нибудь безопасно включить CORS на непубличной содержание?
  • Если сервер с поддержкой CORS устанавливает session_token через файл cookie, будет ли этот файл cookie сохранен в домене сервера CORS или основного сервера веб-страниц?
+2

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

+1

Idealy, я бы хотел, чтобы все ресурсы были доступны из любого источника, если разрешает безопасность. Пользователь по-прежнему должен предоставить действительные учетные данные. Я просто хочу убедиться, что я не открываю дверь для межсайтовых скриптовых атак со вредоносных сайтов. – Jeroen

ответ

29

В ответ на ваш второй вопрос (если сервер с поддержкой CORS устанавливает session_token через файл cookie ...?), Файл cookie сохраняется под доменом сервера CORS. JS-код главной веб-страницы не может получить доступ к файлу cookie, даже через document.cookie. Куки-файлы отправляются только на сервер, когда установлено свойство .withCredentials, и даже тогда он принимается только тогда, когда сервер устанавливает заголовок Access-Control-Allow-Credentials.

Ваш первый вопрос немного более открытый. Это довольно безопасно, но есть способы обойти вещи. Например, злоумышленник может использовать метод отравления DNS, чтобы вызвать запрос предполетной атаки на фактический сервер, но отправить фактический запрос CORS на сервер-изгоев.Вот еще некоторые ресурсы по безопасности CORS:

Наконец, ваше беспокойство вокруг предоставления любого доступа сайта к данным CORS. Чтобы защитить от этого, вы не должны использовать заголовок Access-Control-Allow-Origin: *. Вместо этого вы должны отследить исходное значение пользователя. Например:

Access-Control-Allow-Origin: http://www.example.com 

Этот заголовок позволит только http://www.example.com получить доступ к данным отклика.

+2

Можете ли вы пояснить, как эхо отзыва заголовка «origin» добавляет безопасность? Я думаю, что любой вредоносный веб-сайт/скрипт мог бы легко установить и этот заголовок? Или вы хотите сохранить какой-то белый список? – Jeroen

+3

Да, сохранение белого списка приемлемого происхождения является одним из решений. Другим является привязка идентификатора сеанса пользователя к определенному происхождению. Таким образом, если другое происхождение каким-то образом повторяет запрос с учетными данными пользователя, оно не будет выполнено. – monsur

+0

Я думаю, вы хотите сказать, что атакующий перехватил предполетный бал, а не фактический запрос. Также обратите внимание, что GET не доставляются в полете. – csauve

15

Целью CORS является разрешение запросов на перекрестный запрос для запросов XHR, предоставляя серверу полномочия определять, к какому источнику имеет доступ к какому ресурсу. В частности, CORS представила поле заголовка Origin, которое позволяет серверу рассказать о регулярных и возможных запросах XHR. Это поле заголовка не может быть задано или изменено пользователем, но установлено браузером для запросов XHR.

Итак, если у вас есть API, который предназначен для использования только XHR, вы можете (и должны) потребовать, чтобы запрос соответствовал CORS. Особенно, если запросы могут также изменять состояние вашего сервера, так как иначе вы были бы уязвимы для CSRF.

Обратите внимание, что атаки CSRF возможны независимо от CORS, используя другие методы для создания запросов GET и POST. CORS разрешает доступ к ответу сервера XHR-запросов с помощью JavaScript, если сервер разрешает его.

Смежные вопросы