Когда можно безопасно включить CORS?

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

Access-Control-Allow-Origin: * 

Это позволяет сторонним сайтам вызывать мой сервис через AJAX. Все в порядке до сих пор.

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

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

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

Итак, мои вопросы:

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

В ответ на ваш второй вопрос (если сервер с поддержкой CORS устанавливает session_token через файл cookie …?), Файл cookie сохраняется под доменом сервера CORS. JS-код главной веб-страницы не может получить доступ к файлу cookie, даже через document.cookie . Куки- .withCredentials отправляются только на сервер, когда .withCredentials свойство .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 получить доступ к данным ответа.

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

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

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

Interesting Posts

Не удается подключиться к определенным сайтам

Невозможно изменить значение членов структуры внутри общих коллекций

Остановить распространение событий мыши в угловом

Создание случайных чисел в массиве

Правильный способ передачи нескольких значений для одного имени параметра в запросе GET

Космические лучи: какова вероятность того, что они повлияют на программу?

Проверьте, подключено ли устройство

TabControl с кнопкой Добавить новую вкладку (+)

Какой самый простой способ сделать ваш браузер обновлять страницу каждый раз, 5 секунд?

Определено ли поведение беззнакового целочисленного вычитания?

Как я могу заставить wget переименовать загруженные файлы, чтобы не включать строку запроса?

Graphviz + Doxygen для создания диаграмм classов UML

Как увидеть, какие плагины делают Vim медленным?

Поиск Midnight Commander исключает?

jQuery отключить параметры SELECT на основе выбранного радио (нужна поддержка для всех браузеров)

Давайте будем гением компьютера.