Кіріспе

Клиенттік жағындағы скрипттер үшін қауіпсіздік шарасы Компьютерлік техникада бірдей бастапқы саясат (SOP) — веб-қосымшаның қауіпсіздік моделіндегі ұғым. Бұл саясатқа сәйкес, веб-браузер бірінші веб-беттегі скрипттерге екінші веб-беттегі деректерге қол жеткізуге рұқсат береді, бірақ егер екі веб-беттің де бастапқы орны бірдей болса ғана. Бастапқы орын – URI схемасы, хост атауы және порт нөмірінің комбинациясы ретінде анықталады. Бұл саясат бір беттегі қауіпті скрипттердің басқа веб-беттегі құпия деректерге осы беттің (DOM) арқылы қол жеткізуіне жол бермейді. Бұл механизм, есіп келе жатқан веб-қосымшалар үшін аса маңызды, себебі олар пайдаланушы сеанстарын сақтау үшін HTTP cookie-лерге көп көңіл бөледі, ал серверлер HTTP cookie ақпаратына сүйене отырып, құпия ақпаратты ашады немесе күйін өзгертетін әрекеттер жасайды. Деректердің құпиялылығы мен толықтығын жоғалтудың алдын алу үшін клиенттік жағынан байланыссыз сайттар ұсынатын мазмұн қатаң түрде бөлініп сақталуы керек. Бірдей бастапқы саясат тек скрипттерге ғана қолданылады. Яғни, суреттер, CSS және динамикалық түрде жүктелетін скрипттер сияқты ресурстарға тиісті HTML тегтері арқылы (шрифттер ерекше жағдай) бастапқы орынға қарамастан қол жеткізуге болады. Шабуылдар HTML тегтеріне бірдей бастапқы саясат қолданылмайтындығын пайдаланады.

Тарих

Бірдей шығу тегі саясаты тұжырымдамасы 1995 жылы Netscape Navigator 2.02 бағдарламасында, Netscape 2.0 бағдарламасында JavaScript енгізілгеннен кейін көп ұзамай пайда болды. JavaScript веб-беттерде скрипттерді қолдануға және әсіресе Document Object Model (DOM) құжат объектісіне бағдарламалық түрде қол жеткізуге мүмкіндік берді. Бұл саясат бастапқыда DOM-ға қол жеткізуді қорғау мақсатымен жасалған, бірақ кейіннен жаһандық JavaScript объектісінің құпия бөліктерін қорғау үшін кеңейтілді.

Іске асыру

Барлық заманауи браузерлер бірдей шығу саясатының қандай да бір түрін қолданады, себебі ол маңызды қауіпсіздіктің негізгі тасы болып табылады. Саясаттар міндетті түрде нақты талаптарға сәйкес келуі керек емес, бірақ көбінесе Microsoft Silverlight, Adobe Flash немесе Adobe Acrobat сияқты басқа веб-технологиялар үшін, сондай-ақ тікелей DOM манипуляциясынан өзгеше механизмдер үшін, мысалы XMLHttpRequest үшін, шамамен үйлесімді қауіпсіздік шекараларын анықтау мақсатында кеңейтіледі.

Шығу тегін анықтау ережесі

URI-дың "шығу тегін" есептеу үшін қолданылатын алгоритм RFC 6454, 4-бөлімінде көрсетілген. Абсолюттік URI үшін шығу тегі үштік {схема, хост, порт}. Егер URI атау авторитеті ретінде иерархиялық элементті қолданбаса (RFC 3986, 3.2 бөлімін қараңыз) немесе URI абсолюттік URI болмаса, онда жаһандық бірегей идентификатор қолданылады. Екі ресурс бір шығу тегі деп есептеледі, егер және тек қана егер осы мәндердің барлығы бірдей болса. Мысалы, келесі кестеде "http://www.example.com/dir/page.html" URL-імен салыстыру нәтижелері көрсетілген:

+ Салыстырылатын URL Нәтиже Себебі
http://www.example.com/dir/page2.html Бірдей схема, хост және порт
http://www.example.com/dir2/other.html Бірдей схема, хост және порт
http://username:password@www.example.com/dir2/other.html Бірдей схема, хост және порт
http://www.example.com:80/dir/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 Әртүрлі хост (нақты сәйкестік қажет)
data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA= Әртүрлі схема

Басқа браузерлерден айырмашылығы, Internet Explorer шығу тегін есептеуде портты қамтымайды, оның орнына Қауіпсіздік аймағын пайдаланады.

Қайта қолдануға болатын аутентификация арқылы қайсыбір шығу тегі бар сезімтал жауаптарға оқуға рұқсат

Бірдей шығу саясаты аутентификацияланған сеанстарды әртүрлі домендерде қайта пайдаланудан қорғайды. Келесі мысал, бірдей шығу саясаты болмаған жағдайда туындауы мүмкін қауіпсіздік тәуекелін көрсетеді. Егер пайдаланушы банк сайтына кіріп, шығып кетпесе, содан кейін ол зиянды JavaScript коды бар басқа сайтқа өтеді, бұл код банк сайтынан деректерді сұрайды. Пайдаланушы әлі де банк сайтында авторизацияланғандықтан, зиянды код пайдаланушы банк сайтында жасай алатын кез келген әрекетті орындай алады. Мысалы, ол пайдаланушының соңғы транзакцияларының тізімін алуға, жаңа транзакция жасауға және т.б. мүмкіндік алады. Мұның себебі, әлемдік желінің бастапқы мағынасында, браузерлер банк сайтының доменіне сәйкес сеанстық cookie-лар мен авторизация сұранысының платформа деңгейіндегі түрлері сияқты аутентификация мәліметтерін банк сайтына жіберуі керек. Банк сайтының иелері, зиянды сайтқа кіретін пайдаланушылардың қалыпты браузерлері, зиянды сайттан жүктелген кодтың банк сессиясының cookie-сына немесе платформа деңгейіндегі авторизацияға қол жеткізбеуін күтеді. JavaScript банк сессиясының cookie-сына тікелей қол жеткізе алмайтын болса да, ол банк сайтының сессиясының cookie-і арқылы банк сайтына сұрауларды жіберуге және қабылдауға болады. Бірдей шығу саясаты қауіпсіздікке баса назар аударатын браузерлерге, пайдаланушылардың көпшілігі сәйкес браузерлерді пайдалануды таңдайды деген болжаммен, әртүрлі домендерден алынған жауаптарға оқуға рұқсат беруден бас тарту талабы ретінде енгізілді. Бұл саясат жазуға рұқсат бермейді. Жазу рұқсатының теріс пайдаланылуына қарсы тұру үшін мақсатты сайттардан қосымша CSRF қорғанысы қажет.

Бір шығу тегі бар тауарлар саясатын жеңілдету

Кейбір жағдайларда, бірдей шығу тегі саясаты тым шектеулі болып табылады, бұл көптеген субдомендерді пайдаланатын ірі веб-сайттар үшін мәселе тудырады. Алғашқыда, фрагмент идентификаторын немесе window.name қасиетін пайдалану сияқты бірнеше шешімдер әртүрлі домендерде орналасқан құжаттар арасында деректерді жіберу үшін қолданылды. Қазіргі заманғы браузерлер бірдей шығу саясатын бақыланатын түрде жеңілдету үшін бірнеше техниканы қолдайды:

Деректерді бұрмалау

Netscape Navigator қысқа мерзімге ластануды тексеру мүмкіндігін қамтыды. Бұл мүмкіндік 1997 жылы Netscape 3-тің құрамына тәжірибелік режімде енгізілді. Мүмкіндік әдепкі бойынша өшірілген, бірақ пайдаланушы оны қосса, веб-сайттарға басқа доменге тиесілі терезелер мен фреймдердің JavaScript қасиеттерін оқуға талпынуға рұқсат беретін еді. Браузер содан кейін пайдаланушыдан осы қолжетімділікке рұқсат беру керек пе деп сұрайтын.

document.domain қасиеттері

Егер екі терезеде (немесе фреймде) доменді бірдей мәнге орнататын скрипттер болса, осы екі терезе үшін бірдей шығу саясаты жеңілдетіледі және әр терезе екіншісімен өзара әрекеттесе алады. Мысалы, orders.example.com және catalog.example.com мекенжайларынан жүктелген құжаттардағы ынтымақтастық скрипттері өздерінің document.domain қасиеттерін “example.com” деп орнату арқылы құжаттардың бірдей шығу тегінен келгендей көрінуіне және әр құжаттың екіншісінің қасиеттерін оқуына мүмкіндік береді. Бұл қасиетті орнату портты null-ге орнатады, көптеген браузерлер бұл мәнді 80-ші порттан немесе тіпті белгіленбеген порттан әртүрлі түсінеді. Браузердің қол жеткізімділікке рұқсат беретініне көз жеткізу үшін екі беттің де document.domain қасиетін орнатыңыз. document.domain тұжырымы 1996 жылы шыққан Netscape Navigator 3-тің бір бөлігі ретінде енгізілді. Ол серверлерге файлды сұрауға болатын шығу тегінің тізімін нақты көрсетуге немесе wildcard пайдаланып, кез келген сайттың файлды сұрауына рұқсат беруге мүмкіндік береді. Firefox 3.5, Safari 4 және Internet Explorer 10 сияқты браузерлер осы басты XMLHttpRequest арқылы көлденең шығу HTTP сұраныстарын рұқсат ету үшін пайдаланады, әйтпесе олар бірдей шығу саясатымен тыйым салынар еді.

Құжаттар арасындағы хабарласу

Басқа бір техника, құжаттар аралық хабар алмасу, бір беттегі скриптке екінші беттегі скриптке, олардың бастапқы орнына қарамастан, мәтіндік хабарларды жіберуге мүмкіндік береді. Window нысанының postMessage әдісін шақыру сол терезенің "onmessage" оқиғасын асинхронды түрде ояту арқылы пайдаланушы анықтаған оқиғаларды өңдеушілерді іске қосады. Бір беттегі скрипт екінші беттегі әдістерге немесе айнымалыларға тікелей қол жеткізе алмайды, бірақ олар осы хабар алмасу техникасы арқылы қауіпсіз байланыс орната алады.

JSONP

HTML <script> элементтері басқа домендерден мазмұн алуға және орындауға рұқсат етілгендіктен, бір бет сол тектік саясатты (same origin policy) айналып өтіп, JSON деректерін басқа доменнен JSONP пайдалы жүктемесін қайтаратын ресурс арқылы жүктеу арқылы ала алады. JSONP пайдалы жүктемелері алдын ала анықталған функция шақыруымен оралған JSON деректерінен тұрады. Скрипт ресурсы браузерде жүктелгенде, оралған JSON деректерін өңдеу үшін белгіленген кері шақыру функциясы іске қосылады.

Веб-сакеттер

Қазіргі заманғы браузерлер скриптке бірдей домендік саясатты қолданбастан WebSocket адресіне қосылуға мүмкіндік береді. Дегенмен, олар WebSocket URI пайдаланылған кезде оны анықтап, қосылыс сұраған скрипттің бастапқы доменін көрсететін Origin: аттрибутын сұранысқа қосады. Қайтаралық қауіпсіздікті қамтамасыз ету үшін WebSocket сервері осы аттрибуттың деректерін, жауап алуға рұқсат етілген бастапқы домендердің тізімімен салыстыруы тиіс.

Бұрыш қалталары

Бірдей шығу тегі тексерулері мен байланысты механизмдердің мінез-құлқы, URL-деріне нақты анықталған хост атауы немесе порт тіркелмеген псевдо-протоколдар сияқты, бірқатар шектен шығу жағдайларында толық анықталмаған (мысалы, файл:, деректер: т.б.). Бұл тарихи түрде көптеген қауіпсіздік мәселелеріне әкеп соқты, мысалы, кез келген жергілікті сақталған HTML файлының дискідегі барлық басқа файлдарға қол жеткізуі немесе интернеттегі кез келген сайтпен байланыс орнату мүмкіндігі. Сонымен қатар, DNS қайта байланыстыру немесе серверлік проксилер сияқты шабуыл түрлері хост атауын тексеруді ішінара жоюға мүмкіндік береді, соның салдарынан қаскөй веб-беттер өздерінің "нақты" канондық шығу тегінен өзгеше мекенжайлар арқылы сайттармен тікелей өзара әрекеттесе алады. Мұндай шабуылдардың салдары өте нақты жағдайлармен шектеледі, себебі браузер әлі де шабуылшының сайтымен байланыс орнатып жатыр деп санайды, сондықтан үшінші тарап cookie-лары немесе басқа құпия ақпарат шабуылшыға берілмейді.

Шабуылдар

Тіпті бірдей шығу саясаты қолданылып тұрған кезде де (Cross Origin Resource Sharing арқылы жеңілдетілмесе), кейбір кросс-оригиналдық шабуылдар жасалуы мүмкін. WebRTC арқылы құрбаның ішкі IP-адресін анықтауға болады. Егер кросс-оригиналдық портқа қосылуға тырысылса, жауаптар бірдей шығу саясатына қарамастан оқуға болмайды, бірақ JavaScript жүктелу/қателік оқиғасы орын алса немесе уақыт бітсе, порттың ашық немесе жабық екендігі туралы шешім қабылдай алады. Бұл кросс-оригиналдық портты сканерлеуге мүмкіндік береді. Сонымен қатар, JavaScript кодтары сайттар аралық ақпарат ағыны сияқты техникаларды пайдаланып, браузердегі ұзақ жылдар бойы сақталған ақпараттың ағып кетуін пайдаланып, кросс-оригинал туралы ақпаратты анықтай алады.