Політика того ж походження

Політика того ж походження (англ. same origin policy) — важливе поняття в програмуванні скриптів на стороні клієнта (наприклад в мові JavaScript). Політика дозволяє скриптам, які працюють на сторінках, що згенеровані на одному сайті, отримати доступ до методів та атрибутів один одного без особливих обмежень, але забороняє доступ до більшості методів та властивостей на сторінках інших сайтів.[1]

Цей механізм дуже важливий для сучасних вебзастосунків, які покладаються на куки для зберігання даних сесій авторизованих користувачів, і дія серверів залежить від інформації, що зберігається в куках. На стороні клієнта повинно бути суворе відмежування від даних, наданим непов'язаними сайтами, щоб запобігти втраті конфіденційних даних.

Історія ред.

Політика того ж походження з'явилась ще в часи Netscape Navigator 2.0. Пізніше вона поширилась на інші скриптові мови, наприклад Adobe Flash, чи на механізми окрім прямої маніпуляції DOM, такі як XMLHttpRequest.

Правила визначення джерела ред.

Термін «походження» (англ. origin) визначається через доменне ім'я, протокол прикладного рівня, та (в більшості браузерах) номер порту HTML документа який виконує скрипт. Два ресурси мають однакове походження тоді і тільки тоді коли кожне з цих значень для них однакове. Для прикладу, наступна таблиця дає огляд типових результатів перевірок для URL «http://www.example.com/dir/page.html».

URL з яким порівнюють Результат Причина
http://www.example.com/dir/page.html Успішно Однаковий протокол і хост
http://www.example.com/dir2/other.html Успішно Однаковий протокол і хост
http://www.example.com:81/dir/other.html Невдача Різні порти
https://www.example.com/dir/other.html Невдача Різні протоколи
http://en.example.com/dir/other.html Невдача Різні хости
http://example.com/dir/other.html Невдача Різні хости (потрібен повний збіг)
http://v2.www.example.com/dir/other.html Невдача Різні хости (потрібен повний збіг)

Додаткова логіка document.domain ред.

Важливим розширенням до політики того ж джерела, реалізованим для доступу до DOM в JavaScript (але не для інших перевірок єдиності походження) є те, що два сайти, які мають спільний домен вищого рівня, можуть ухвалити рішення про комунікацію попри невдачу перевірки на єдиність хоста, спільно присвоївши відповідним атрибутам document.domain однаковий підходящий фрагмент правої сторони їх поточних доменних імен.

Наприклад, якщо http://en.example.com/ та http://fr.example.com/ разом присвоять document.domain значення «example.com», вони будуть вважатись одного походження під час маніпуляцій з DOM.

Крайні випадки та винятки ред.

Поведінка перевірки збігу походжень та пов'язані механізми не дуже добре описані в численних крайових випадках, наприклад для протоколів, що не мають добре означеного доменного імені чи порту пов'язаними з їх URL (file://, data://, і т. ін.). Це спричинило велику кількість проблем з безпекою, таких як загалом небажана здатність будь-якого локального HTML файлу мати доступ до інших файлів на диску чи спілкуватись з будь-яким сайтом в інтернеті.

На додачу, багато застарілих крос-доменних операцій, що передували JavaScript, не піддаються перевіркам на походження даних; одним з прикладів є здатність імпортувати скрипти з інших доменів (JSONP) чи відправляти POST форми. JSONP є популярною крос-доменною альтернативою XMLHttpRequest (Ajax).

Обхідні шляхи ред.

Щоб дозволити розробникам у контрольований спосіб обійти політику єдиного походження, існують багато хаків, таких як використання ідентифікатора фрагмента, чи використання властивості window.name для передачі даних між документами з різних доменів. У стандарті HTML5 створено офіційний інтерфейс postMessage, який щоправда доступний тільки на нових браузерах. Також для AJAX-подібних запитів до інших доменів можна використовувати технології JSONP та Cross-Origin Resource Sharing.[2]

Для підтримки старіших браузерів можна використовувати бібліотеку easyXDM[3], яка надає API до інтерфейсу postMessage та інших хаків що використовуються для крос-доменного обміну повідомленнями (англ. Cross Domain Messaging (XDM)).

Див. також ред.

Зноски ред.

  1. Архівована копія. Архів оригіналу за 27 січня 2017. Процитовано 9 жовтня 2011.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  2. Blog Post: Using CORS with all (modern) browsers. Архів оригіналу за 15 липня 2013. Процитовано 9 жовтня 2011.
  3. Архівована копія. Архів оригіналу за 30 травня 2013. Процитовано 23 березня 2022.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)

Посилання ред.