Что должно остановить вредоносный код от подделки заголовка "Origin" для использования CORS?


как я понимаю, если клиентский скрипт работает на странице из foo.com хочет запросить данные у bar.com, в запросе необходимо указать заголовок Origin: http://foo.com, и бар должен отвечать Access-Control-Allow-Origin: http://foo.com.

что там, чтобы остановить вредоносный код с сайта roh.com от простого подмены заголовка Origin: http://foo.com запрос страницы из бара?

2 83

2 ответа:

браузеры контролируют установку , и пользователи не могут переопределить это значение. Так что вы не увидите Origin заголовок подделан из браузера. Злоумышленник может создать запрос curl, который вручную устанавливает Origin заголовок, но этот запрос будет поступать извне браузера и может не иметь специфической для браузера информации (например, куки).

помните: CORS-это не безопасность. Не полагайтесь на CORS для обеспечения безопасности вашего сайта. Если вы предоставляете защищенные данные, используйте файлы cookie или Токены OAuth или что-то другое, чем Origin заголовок для защиты этих данных. Элемент Access-Control-Allow-Origin заголовок в CORS только диктует, какие источники должны быть разрешены для выполнения запросов перекрестного происхождения. Больше ни на что не полагайтесь.

TLDR: ничто не мешает вредоносному коду подделать источник. Когда это произойдет, ваш сервер никогда не узнает об этом и будет выполнять просьбы. Иногда эти запросы стоят дорого. Поэтому не используйте CORS вместо любого типа безопасности.


Я недавно играл с CORS, и я задал себе тот же вопрос. Что я обнаружил, что браузер может быть достаточно умен, чтобы знать, поддельный запрос CORS, когда он видит один, но ваш сервер не такой умный.

первое, что я обнаружил, было то, что Origin заголовок-это HTTP запрещенное имя заголовка это не может быть изменено программно. Это означает, что вы можете изменить его примерно за 8 секунд с помощью изменить заголовки для Google Chrome.

чтобы проверить это, я настроил два клиентских домена и один серверный домен. Я включил белый список CORS на сервере, который разрешал запросы CORS от клиента 1, но не от клиента 2. Я протестировал обоих клиентов, и действительно запросы CORS клиента 1 были успешными, в то время как клиент 2 потерпел неудачу.

тогда я обманул клиента 2-х чтобы соответствовать клиента 1 по. Сервер получил поддельный Origin заголовок, и успешно прошел проверку белого списка (или не удалось, если вы стакан-полупустой вид парня). После этого сервер выполнял послушно, потребляя все ресурсы, которые он был предназначен для использования (вызовы базы данных, отправка дорогостоящих писем, отправка еще большего количества дорогостоящие SMS-сообщения и т. д.). Когда это было сделано, сервер с радостью отправил поддельный Access-Control-Allow-Origin заголовок обратно в браузер.

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

XMLHttpRequest не удается загрузить http://server.dev/test. Этот Заголовок 'Access-Control-Allow-Origin' имеет значение http://client1.dev это не равный к поставленному началу координат. Происхождение http://client2.dev поэтому доступ запрещен.

документация, которую я читал, не кажется точной. Вкладку "Сеть" в Chrome наглядно показывает, как заголовки запроса и ответа, как http://client1.dev, но вы можете видеть в ошибке, что Chrome каким-то образом знает, что реальное происхождение было http://client2.dev и правильно отклоняет ответ. что не имеет значения на данный момент потому что сервер уже принял подложный запрос и провел деньги.