Инструменты пользователя

Инструменты сайта

  • Показать страницу
  • История страницы
  • Ссылки сюда
  • Оставить на чай
  • Экспорт в PDF
  • Наверх

  • software:development:web:docs:web:security:same-origin_policy

    Различия

    Показаны различия между двумя версиями страницы.

    Ссылка на это сравнение

    Следующая версия
    Предыдущая версия
    software:development:web:docs:web:security:same-origin_policy [2023/08/30 12:02] – создано vladpolskiysoftware:development:web:docs:web:security:same-origin_policy [2023/08/30 14:27] (текущий) – [Доступ к API сценариев из разных источников] vladpolskiy
    Строка 8: Строка 8:
      
     В следующей таблице приведены примеры сравнения происхождения с URL-адресом ''http://store.company.com/dir/page.html'': В следующей таблице приведены примеры сравнения происхождения с URL-адресом ''http://store.company.com/dir/page.html'':
     +{{tablelayout?rowsHeaderSource=Auto}}
     +|**URL-адрес**|**Исход**|**Причина**|
     +|http://store.company.com/dir2/other.html|То же происхождение|Только путь отличается|
     +| http://store.company.com/dir/inner/another.html|То же происхождение|Только путь отличается|
     +| https://store.company.com/page.html| Отказ|Другой протокол|
     +| http://store.company.com:81/dir/page.html|Отказ|Другой порт %%(http://по умолчанию это порт 80)%% |
     +| http://news.company.com/dir/page.html|Отказ|Другой хост|
      
    -|**URL-адрес** |**Исход** |**Причина**| 
    -|http://store.company.com/dir2/other.html |То же происхождение |Только путь отличается| 
    -|http://store.company.com/dir/inner/another.html |То же происхождение |Только путь отличается| 
    -|https://store.company.com/page.html |Отказ |Другой протокол| 
    -|http://store.company.com:81/dir/page.html |Отказ |Другой порт (http://по умолчанию это порт 80)| 
    -|http://news.company.com/dir/page.html |Отказ |Другой хост| 
     =====Унаследованное происхождение===== =====Унаследованное происхождение=====
    -Скрипты, выполняемые на страницах с URL-адресом about:blankили javascript:, наследуют источник документа, содержащего этот URL-адрес, поскольку эти типы URL-адресов не содержат информации об исходном сервере.+Скрипты, выполняемые на страницах с URL-адресом ''about:blank'' или ''javascript:'', наследуют источник документа, содержащего этот URL-адрес, поскольку эти типы URL-адресов не содержат информации об исходном сервере.
      
    -Например, about:blankчасто используется как URL-адрес новых пустых всплывающих окон, в которые родительский скрипт записывает контент (например, через механизм Window.open()). Если это всплывающее окно также содержит JavaScript, этот сценарий унаследует то же происхождение, что и сценарий, который его создал.+Например, ''about:blank'' часто используется как URL-адрес новых пустых всплывающих окон, в которые родительский скрипт записывает контент (например, через механизм ''[[software:development:web:docs:Web:API:Window:open|Window.open()]]''). Если это всплывающее окно также содержит JavaScript, этот сценарий унаследует то же происхождение, что и сценарий, который его создал.
      
    -data:URL-адреса получают новый, пустой контекст безопасности.+''data:'' URL-адреса получают новый, пустой контекст безопасности.
      
    -Происхождение файлов +=====Происхождение файлов===== 
    -Современные браузеры обычно рассматривают происхождение файлов, загружаемых с использованием file:///схемы, как непрозрачное происхождение . Это означает, что если файл включает в себя другие файлы из той же папки (скажем), не предполагается, что они происходят из того же источника и могут вызвать ошибки CORS .+Современные браузеры обычно рассматривают происхождение файлов, загружаемых с использованием ''%%file:///%%'' схемы, как непрозрачное происхождение . Это означает, что если файл включает в себя другие файлы из той же папки (скажем), не предполагается, что они происходят из того же источника и могут вызвать ошибки [[software:development:web:docs:Glossary:CORS|CORS]].
      
    -Обратите внимание, что в спецификации URL указано, что происхождение файлов зависит от реализации, и некоторые браузеры могут рассматривать файлы в одном и том же каталоге или подкаталоге как имеющие одинаковое происхождение, даже если это имеет последствия для безопасности .+Обратите внимание, что в [[https://url.spec.whatwg.org/#origin|спецификации URL]] указано, что происхождение файлов зависит от реализации, и некоторые браузеры могут рассматривать файлы в одном и том же каталоге или подкаталоге как имеющие одинаковое происхождение, даже если это имеет [[software:development:web:docs:Web:security:advisories:mfsa2019-21#CVE-2019-11730: политика одинакового происхождения рассматривает все файлы в каталоге как имеющие одинаковое происхождение.|последствия для безопасности]] 
     +.
      
    -Изменение происхождения+=====Изменение происхождения===== 
     +<WRAP left round important 100%>
     Предупреждение. Описанный здесь подход (с использованием document.domainустановщика) устарел, поскольку он подрывает защиту безопасности, обеспечиваемую той же политикой происхождения, и усложняет модель происхождения в браузерах, что приводит к проблемам совместимости и ошибкам безопасности. Предупреждение. Описанный здесь подход (с использованием document.domainустановщика) устарел, поскольку он подрывает защиту безопасности, обеспечиваемую той же политикой происхождения, и усложняет модель происхождения в браузерах, что приводит к проблемам совместимости и ошибкам безопасности.
     +</WRAP>
      
    -Страница может изменить свое происхождение с некоторыми ограничениями. Сценарий может установить значение document.domainдля своего текущего домена или супердомена своего текущего домена. Если установлен супердомен текущего домена, более короткий супердомен используется для проверок того же происхождения. 
      
    -Например, предположим, что сценарий из документа at http://store.company.com/dir/other.htmlвыполняет следующее:+Страница может изменить свое происхождение с некоторыми ограничениями. Сценарий может установить значение [[software:development:web:docs:Web:API:Document:domain|document.domain]] для своего текущего домена или супердомена своего текущего домена. Если установлен супердомен текущего домена, более короткий супердомен используется для проверок того же происхождения.
      
    -JS +Например, предположим, что сценарий из документа at ''http://store.company.com/dir/other.html'' выполняет следующее:
    -Скопировать в буфер обмена+
      
     +<code javascript JS>
     document.domain = "company.com"; document.domain = "company.com";
    -После этого страница может пройти проверку того же происхождения с помощью http://company.com/dir/page.html(при условии, что http://company.com/dir/page.htmlдля нее установлено document.domainзначение " company.com", чтобы указать, что она желает это разрешить - см. document.domainдополнительную информацию). Однако неcompany.com удалось установить , поскольку это не супердомен .document.domainothercompany.comcompany.com+</code>
      
    -Номер порта проверяется браузером отдельно. Любой вызов document.domain, включая document.domain = document.domain, приводит к перезаписи номера порта на null. Следовательноневозможно поговорить company.com:8080, company.comтолько установив document.domain = "company.com"первое. Он должен быть установлен в обоих, чтобы оба номера портов были null.+После этого страница может пройти проверку того же происхождения с помощью http://company.com/dir/page.html(при условии, что ''http://company.com/dir/page.html'' для нее установлено ''document.domain'' значение ''"company.com"'', чтобы указать, что она желает это разрешить - смdocument.domainдополнительную информацию)Однако не ''company.com'' удалось установить , поскольку это не супердомен ''.document.domainothercompany.comcompany.com''
      
    -Механизм имеет некоторые ограничения. Например, он выдаст " SecurityError" DOMExceptionесли включен или документ находится в изолированной программной среде , и изменение источника таким образом не влияет на проверки происхожденияиспользуемые многими веб-API (например , , , )Более полный список случаев сбоя можно найти в Document.domain > Отказы .document-domain Permissions-Policy<iframe>localStorageindexedDBBroadcastChannelSharedWorker+Номер порта проверяется браузером отдельно. Любой вызов ''document.domain'', включая ''document.domain = document.domain'', приводит к перезаписи номера порта на ''null''. Следовательно, невозможно поговорить ''company.com:8080''''company.com'' только установив ''document.domain = "company.com"'' первое. Он должен быть установлен в обоих, чтобы оба номера портов были ''null''.
      
    -Примечание. При использовании document.domainсубдомена для доступа к своему родительскому элементу необходимо установить document.domainодно и то же значение как в родительском домене, так и в субдомене. Это необходимодаже если при этом родительский домен возвращается к исходному значениюНевыполнение этого требования может привести к ошибкам разрешения.+Механизм имеет некоторые ограниченияНапример, он выдаст ''"SecurityError"'' [[software:development:web:docs:Web:API:DOMException|DOMException]], если включен или документ находится в изолированной программной среде , и изменение источника таким образом не влияет на проверки происхожденияиспользуемые многими веб-API (например , , , )Более полный список случаев сбоя можно найти в [[software:development:web:docs:Web:API:Document:domain#failures|Document.domain > Отказы]][[software:development:web:docs:Web:HTTP:Headers:Permissions-Policy:document-domain|document-domain]]  
     +[[software:development:web:docs:Web:HTTP:Headers:Permissions-Policy|Permissions-Policy]]  
     +[[software:development:web:docs:Web:HTML:Element:iframe|<iframe>]]  
     +[[software:development:web:docs:Web:API:Window:localStorage|localStorage]] 
     +[[software:development:web:docs:Web:API:IndexedDB_API|indexedDB]] 
     +[[software:development:web:docs:Web:API:BroadcastChannel|BroadcastChannel]] 
     +[[software:development:web:docs:Web:API:SharedWorker|SharedWorker]]
      
    -Доступ к сети из разных источников +<WRAP left round important 100%> 
    -Политика одного и того же источника контролирует взаимодействие между двумя разными источникаминапример, когда вы используете XMLHttpRequestили <img>элемент. Эти взаимодействия обычно делятся на три категории:+Примечание. При использовании ''document.domain'' субдомена для доступа к своему родительскому элементу необходимо установить ''document.domain'' одно и то же значение как в родительском домене, так и в субдомене. Это необходимодаже если при этом родительский домен возвращается к исходному значению. Невыполнение этого требования может привести к ошибкам разрешения. 
     +</WRAP>
      
    -Запись между источниками обычно разрешена. Примерами являются ссылки, перенаправления и отправки форм. Некоторые HTTP-запросы требуют предварительной проверки . +=====Доступ к сети из разных источников===== 
    -Обычно допускается встраивание перекрестного происхождения . (Примеры перечислены ниже.) +Политика одного и того же источника контролирует взаимодействие между двумя разными источниками, например, когда вы используете [[software:development:web:docs:Web:API:XMLHttpRequest|XMLHttpRequest]] или [[software:development:web:docs:Web:HTML:Element:img|<img>]] элемент. Эти взаимодействия обычно делятся на три категории: 
    -Чтение из перекрестного источника обычно запрещено, но доступ для чтения часто теряется из-за внедрения. Например, вы можете прочитать размеры встроенного изображения, действия встроенного скрипта или доступность встроенного ресурса .+ 
     +  * Запись между источниками обычно разрешена. Примерами являются ссылки, перенаправления и отправки форм. Некоторые HTTP-запросы требуют [[software:development:web:docs:Web:HTTP:CORS#preflighted_requests|предварительной проверки]]
     +  Обычно допускается встраивание перекрестного происхождения . (Примеры перечислены ниже.) 
     +  Чтение из перекрестного источника обычно запрещено, но доступ для чтения часто теряется из-за внедрения. Например, вы можете прочитать размеры встроенного изображения, действия встроенного скрипта или доступность [[https://bugzil.la/629094|встроенного ресурса]].
     Вот несколько примеров ресурсов, которые могут быть встроены из разных источников: Вот несколько примеров ресурсов, которые могут быть встроены из разных источников:
      
    -JavaScript с <script src="…"></script>. Подробности синтаксических ошибок доступны только для сценариев того же происхождения. +  * JavaScript с ''<script src="…"></script>''. Подробности синтаксических ошибок доступны только для сценариев того же происхождения. 
    -CSS применяется с <link rel="stylesheet" href="…">. Из-за смягченных правил синтаксиса CSS для CSS с перекрестным происхождением требуется правильный Content-Typeзаголовок. Браузеры блокируют загрузку таблицы стилей, если это загрузка из разных источников, где тип MIME неверен и ресурс не начинается с допустимой конструкции CSS. +  CSS применяется с ''<link rel="stylesheet" href="…">''. Из-за смягченных правил синтаксиса CSS для CSS с перекрестным происхождением требуется правильный ''Content-Type'' заголовок. Браузеры блокируют загрузку таблицы стилей, если это загрузка из разных источников, где тип MIME неверен и ресурс не начинается с допустимой конструкции CSS. 
    -Изображения, отображаемые <img>+  Изображения, отображаемые [[software:development:web:docs:Web:HTML:Element:img|<img>]]
    -СМИ играют <video>и <audio>+  СМИ играют [[software:development:web:docs:Web:HTML:Element:video|<video>]] и [[software:development:web:docs:Web:HTML:Element:audio|<audio>]]
    -Внешние ресурсы, встроенные в <object>и <embed>+  Внешние ресурсы, встроенные в [[software:development:web:docs:Web:HTML:Element:object|<object>]] и [[software:development:web:docs:Web:HTML:Element:embed|<embed>]]
    -Шрифты, примененные с помощью @font-face. Некоторые браузеры допускают использование шрифтов из разных источников, другие требуют использования шрифтов одного и того же происхождения. +  Шрифты, примененные с помощью [[software:development:web:docs:Web:CSS:@font-face|@font-face]]. Некоторые браузеры допускают использование шрифтов из разных источников, другие требуют использования шрифтов одного и того же происхождения. 
    -Все, что встроено в <iframe>. Сайты могут использовать X-Frame-Optionsзаголовок для предотвращения фреймов из разных источников. +  Все, что встроено в [[software:development:web:docs:Web:HTML:Element:iframe|<iframe>]]. Сайты могут использовать [[software:development:web:docs:Web:HTTP:Headers:X-Frame-Options|X-Frame-Options]] заголовок для предотвращения фреймов из разных источников. 
    -Как разрешить доступ из разных источников +=====Как разрешить доступ из разных источников===== 
    -Используйте CORS , чтобы разрешить доступ из разных источников. CORS — это часть HTTP , которая позволяет серверам указывать любые другие хосты, с которых браузер должен разрешать загрузку контента.+Используйте [[software:development:web:docs:Web:HTTP:CORS|CORS]], чтобы разрешить доступ из разных источников. CORS — это часть [[software:development:web:docs:Glossary:HTTP|HTTP]], которая позволяет серверам указывать любые другие хосты, с которых браузер должен разрешать загрузку контента.
      
    -Как заблокировать доступ из разных источников +=====Как заблокировать доступ из разных источников===== 
    -Чтобы предотвратить запись из разных источников, проверьте неугаданный токен в запросе, известный как токен межсайтовой подделки запроса (CSRF) . Вы должны запретить чтение страниц из перекрестного источника, которым требуется этот токен. +  Чтобы предотвратить запись из разных источников, проверьте неугаданный токен в запросе, известный как [[https://owasp.org/www-community/attacks/csrf|токен межсайтовой подделки запроса (CSRF)]] . Вы должны запретить чтение страниц из перекрестного источника, которым требуется этот токен. 
    -Чтобы предотвратить чтение ресурса из перекрестного источника, убедитесь, что он не является встраиваемым. Часто бывает необходимо предотвратить внедрение, поскольку при внедрении ресурса всегда происходит утечка некоторой информации о нем. +  Чтобы предотвратить чтение ресурса из перекрестного источника, убедитесь, что он не является встраиваемым. Часто бывает необходимо предотвратить внедрение, поскольку при внедрении ресурса всегда происходит утечка некоторой информации о нем. 
    -Чтобы предотвратить встраивание из разных источников, убедитесь, что ваш ресурс не может быть интерпретирован как один из встраиваемых форматов, перечисленных выше. Браузеры могут не учитывать Content-Typeзаголовок. Например, если вы укажете <script>тег на HTML-документ, браузер попытается проанализировать HTML как JavaScript. Если ваш ресурс не является точкой входа на ваш сайт, вы также можете использовать токен CSRF для предотвращения внедрения. +  Чтобы предотвратить встраивание из разных источников, убедитесь, что ваш ресурс не может быть интерпретирован как один из встраиваемых форматов, перечисленных выше. Браузеры могут не учитывать Content-Typeзаголовок. Например, если вы укажете ''<script>'' тег на HTML-документ, браузер попытается проанализировать HTML как JavaScript. Если ваш ресурс не является точкой входа на ваш сайт, вы также можете использовать токен CSRF для предотвращения внедрения. 
    -Доступ к API сценариев из разных источников +=====Доступ к API сценариев из разных источников===== 
    -API JavaScript iframe.contentWindow, такие как window.parent, window.open, и window.openerпозволяют документам напрямую ссылаться друг на друга. Когда два документа имеют разное происхождение, эти ссылки обеспечивают очень ограниченный доступ к объектам Windowи Location, как описано в следующих двух разделах.+API JavaScript [[software:development:web:docs:Web:API:HTMLIFrameElement:contentWindow|iframe.contentWindow]], такие как [[software:development:web:docs:Web:API:Window:parent|window.parent]][[software:development:web:docs:Web:API:Window:open|window.open]], и [[software:development:web:docs:Web:API:Window:opener|window.opener]] позволяют документам напрямую ссылаться друг на друга. Когда два документа имеют разное происхождение, эти ссылки обеспечивают очень ограниченный доступ к объектам [[software:development:web:docs:Web:API:Window|Window]] и [[software:development:web:docs:Web:API:Location|Location]], как описано в следующих двух разделах.
      
    -Для связи между документами из разных источников используйте window.postMessage.+Для связи между документами из разных источников используйте [[software:development:web:docs:Web:API:Window:postMessage|window.postMessage]].
      
    -Спецификация: HTML Living Standard § Объекты перекрестного происхождения .+Спецификация: [[https://html.spec.whatwg.org/multipage/browsers.html#cross-origin-objects|HTML Living Standard § Объекты перекрестного происхождения]].
      
    -Окно+====Window====
     Разрешен следующий доступ из разных источников к этим Windowсвойствам: Разрешен следующий доступ из разных источников к этим Windowсвойствам:
      
     Методы Методы
    -window.blur +  * [[software:development:web:docs:Web:API:Window:blur|window.blur]] 
    -window.close +  * [[software:development:web:docs:Web:API:Window:close|window.close]] 
    -window.focus +  * [[software:development:web:docs:Web:API:Window:focus|window.focus]] 
    -window.postMessage +  * [[software:development:web:docs:Web:API:Window:postMessage|window.postMessage]] 
    -Атрибуты  +   
    -window.closed Только чтение. +|Атрибуты || 
    -window.frames Только чтение. +|[[software:development:web:docs:Web:API:Window:closed|window.closed]] |Только чтение.| 
    -window.length Только чтение. +|[[software:development:web:docs:Web:API:Window:frames|window.frames]] |Только чтение.| 
    -window.location Читай пиши. +|[[software:development:web:docs:Web:API:Window:length|window.length]] |Только чтение.| 
    -window.opener Только чтение. +|[[software:development:web:docs:Web:API:Window:location|window.location]] |Читай пиши.| 
    -window.parent Только чтение. +|[[software:development:web:docs:Web:API:Window:opener|window.opener]] |Только чтение.| 
    -window.self Только чтение. +|[[software:development:web:docs:Web:API:Window:parent|window.parent]] |Только чтение.| 
    -window.top Только чтение. +|[[software:development:web:docs:Web:API:Window:self|window.self]] |Только чтение.| 
    -window.window Только чтение.+|[[software:development:web:docs:Web:API:Window:top|window.top]] |Только чтение.| 
     +|[[software:development:web:docs:Web:API:Window:window|window.window]] |Только чтение.|
     Некоторые браузеры разрешают доступ к большему количеству свойств, чем указано выше. Некоторые браузеры разрешают доступ к большему количеству свойств, чем указано выше.
      
    -Расположение +====Расположение==== 
    -Разрешен следующий доступ к Locationсвойствам из разных источников:+Разрешен следующий доступ к Location свойствам из разных источников:
      
     Методы Методы
    -location.replace +  * [[software:development:web:docs:Web:API:location:replace|location.replace]] 
    -Атрибуты  + 
    -location.href Только запись.+|Атрибуты||  
     +|[[software:development:web:docs:Web:API:location:href|location.href]] |Только запись.|
     Некоторые браузеры разрешают доступ к большему количеству свойств, чем указано выше. Некоторые браузеры разрешают доступ к большему количеству свойств, чем указано выше.
      
    -Доступ к хранилищу данных из разных источников +=====Доступ к хранилищу данных из разных источников===== 
    -Доступ к данным, хранящимся в браузере, таким как веб-хранилище и IndexedDB , разделен по источнику. Каждый источник получает свое собственное отдельное хранилище, и JavaScript в одном источнике не может читать или записывать в хранилище, принадлежащее другому источнику.+Доступ к данным, хранящимся в браузере, таким как [[software:development:web:docs:Web:API:Web_Storage_API|веб-хранилище]] и [[software:development:web:docs:Web:API:IndexedDB_API|indexedDB]], разделен по источнику. Каждый источник получает свое собственное отдельное хранилище, и JavaScript в одном источнике не может читать или записывать в хранилище, принадлежащее другому источнику.
      
    -Файлы cookie используют отдельное определение происхождения. Страница может установить файл cookie для своего собственного домена или любого родительского домена, если родительский домен не является общедоступным суффиксом. Firefox и Chrome используют список общедоступных суффиксов , чтобы определить, является ли домен общедоступным суффиксом. Когда вы устанавливаете файл cookie, вы можете ограничить его доступность с помощью флагов Domain, Path, Secureи HttpOnly. Когда вы читаете файл cookie, вы не можете видеть, где он был установлен. Даже если вы используете только безопасные соединения https, любой файл cookie, который вы видите, мог быть установлен с использованием небезопасного соединения.+[[software:development:web:docs:Glossary:Cookie|Файлы cookie]] используют отдельное определение происхождения. Страница может установить файл cookie для своего собственного домена или любого родительского домена, если родительский домен не является общедоступным суффиксом. Firefox и Chrome используют [[https://publicsuffix.org/|список общедоступных суффиксов]] , чтобы определить, является ли домен общедоступным суффиксом. Когда вы устанавливаете файл cookie, вы можете ограничить его доступность с помощью флагов Domain, Path, Secureи HttpOnly. Когда вы читаете файл cookie, вы не можете видеть, где он был установлен. Даже если вы используете только безопасные соединения https, любой файл cookie, который вы видите, мог быть установлен с использованием небезопасного соединения.
    software/development/web/docs/web/security/same-origin_policy.1693386132.txt.gz · Последнее изменение: 2023/08/30 12:02 — vladpolskiy