Что должно остановить вредоносный код от подделки заголовка "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и правильно отклоняет ответ. что не имеет значения на данный момент потому что сервер уже принял подложный запрос и провел деньги.