Если вы откроете сетевую панель на любой веб-странице, содержащей сценарии, изображения, таблицы стилей или шрифты, вы увидите, что все эти запросы выполняются с использованием метода GET
HTTP. Например, так выглядит запрос файла, загруженного тегом <script>
:
А это пример загруженного файла по тегу <img>
выглядит так:
Браузер просто слепо поверит вам, что если вы загружаете такой ресурс откуда угодно, вы знаете, что вы выполняются, и он получит его для вас (иначе такие вещи, как CDN, не будут работать) в отличие от запроса XHR !
Запросы XHR (включая fetch
вызовы) проверяются на соответствие CORS политика, я полагаю, вы знакомы с тем, что это такое. JavaScript не сможет выполнять какие-либо запросы XHR для ресурса, который находится в другом домене (или порте et c.).
Итак, у вас есть два типа политик запросов:
- Все, что вы получаете с помощью XHR, будет проверено на соответствие CORS, но вы можете выбрать любой метод HTTP-запроса, который хотите
- Все, что вы загружаете, используя
img
, script
, link
et c не будет проверяться на соответствие политике CORS , но вы ограничены GET
только HTTP-запросами . Браузер также отправит все файлы cookie, в данном случае в первую очередь файлы cookie.
Это означает, что если вы обслуживаете массив JSON, используя GET
, вы можете использовать script
тег, чтобы получить его для вас независимо от того, в каком домене вы находитесь . Затем, используя трюк, упомянутый в статье, вы можете выполнить массив (звучит странно, но да) и получить конфиденциальную информацию.
Если вы используете POST
, злоумышленник не может использовать тег script
(или любой другой) для выполнения этого запроса, поскольку он использует запросы GET
для извлечения ресурсов.
Вы могли подумать А, но я могу использовать form
для этого! , но вы столкнетесь с теми же проблемами CORS. Если вы просто отправите form
, данные JSON загрузятся на текущую страницу, и вы, как злоумышленник, не сможете получить их, поскольку ваш скрипт больше не существует на странице.
Вы мог подумать А, я просто установил цель form
на iframe
! , но JavaScript не позволит вам получить доступ к чему-либо в этом iframe
.
Имеет ли это смысл ?