Same-Origin Policy: Как браузер изолирует сайты друг от друга
• Same-Origin Policy (SOP) — это защитный механизм браузера, который ограничивает взаимодействие сайтов с ресурсами другого источника. Без него любая открытая страница могла бы попытаться прочитать вашу почту, личный кабинет или внутренние сервисы компании.
• Источник (origin) определяется сразу тремя частями адреса:
протокол + домен + порт
• Например, страницы
https://example.com/profile и https://example.com/settings относятся к одному источнику, отличается только путь.• А эти адреса уже имеют разные источники:
• http://example.com другой протокол • https://api.example.com другой домен•
https://example.com:8443 другой порт• Представим, что пользователь авторизован на
bank.example, а затем открыл вредоносный сайт evil.example. Скрипт на нём пытается получить данные банковского аккаунта:fetch("https://bank.example/account")• SOP не позволит скрипту прочитать ответ, если банк явно не разрешил такой доступ. По той же причине страница обычно не может прочитать содержимое чужого iframe, получить чужой localStorage или обратиться к DOM другого сайта.
• При этом политика не запрещает всё подряд. Переходы по ссылкам, отправка форм и загрузка изображений с других источников часто разрешены, а вот чтение полученных данных ограничивается.
• Если сайту действительно требуется предоставить доступ другому источнику, используется CORS. Сервер возвращает специальный заголовок:
Access-Control-Allow-Origin: https://app.example.com
• Важно понимать, что SOP работает именно в браузере. Она не мешает обращаться к серверу через curl, собственный скрипт или другой сервер и не заменяет нормальную проверку прав доступа.
• Также SOP сама по себе не защищает от XSS и CSRF: внедрённый XSS-скрипт выполняется от имени доверенного сайта, а некоторые межсайтовые запросы браузер всё равно разрешает отправлять.
• В следующем посте разберём CORS и узнаем, как сервер может безопасно ослабить ограничения Same-Origin Policy. Удачи!
#ВебБезопасность #SOP #Браузеры
• Поддержать автора монеткой: @v_meshke
