Что должно остановить вредоносный код от подделки заголовка "Origin" для использования CORS?
как я понимаю, если клиентский скрипт работает на странице из foo.com хочет запросить данные у bar.com, в запросе необходимо указать заголовок Origin: http://foo.com
, и бар должен отвечать Access-Control-Allow-Origin: http://foo.com
.
что там, чтобы остановить вредоносный код с сайта roh.com от простого подмены заголовка Origin: http://foo.com
запрос страницы из бара?
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
и правильно отклоняет ответ. что не имеет значения на данный момент потому что сервер уже принял подложный запрос и провел деньги.