[{"data":1,"prerenderedAt":379},["ShallowReactive",2],{"blog-uk-cors-wildcard-security-risk":3},{"id":4,"title":5,"body":6,"category":338,"cover":339,"coverAlt":340,"description":341,"draft":342,"extension":343,"faq":344,"image":360,"keywords":361,"meta":368,"navigation":369,"ogTitle":30,"path":370,"published":371,"seo":372,"stem":373,"tldr":374,"updated":371,"__hash__":378},"blog_uk\u002Fblog\u002Fcors-wildcard-security-risk.md","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.",{"type":7,"value":8,"toc":326},"minimark",[9,18,26,31,34,44,47,50,54,57,63,66,72,75,79,82,85,168,175,178,182,193,196,202,207,210,214,217,220,229,232,236,239,257,263,270,277,281,306,313],[10,11,12,13,17],"p",{},"Ваше сканування повернулося з рядком, який читається як сигнал тривоги: ваш API\nвідкритий для будь-якого сайту. Або хтось технічний подивився, що віддає ваш\nсервер, і сказав вам, що у вашому застосунку є вайлдкард CORS, тобто символ\n",[14,15,16],"code",{},"*",", який, вочевидь, означає всіх.",[10,19,20,21,25],{},"Ось та частина, яку посібник за посібником переказують хибно: ",[22,23,24],"strong",{},"вайлдкард майже\nніколи не є тим, що відкрило ваш API."," Це вказівка, яку ваш сервер додає до\nсвоїх відповідей, адресована браузерам людей, що сидять на інших сайтах, і\nприходить вона тоді, коли відповідь уже пішла. Звуження заголовка не дає\nсторінці чужого сайту прочитати ваші дані. Проти того, хто читає їх узагалі без\nбраузера, воно не робить нічого.",[27,28,30],"h2",{"id":29},"чи-є-вайлдкард-cors-ризиком-для-безпеки","Чи є вайлдкард CORS ризиком для безпеки?",[10,32,33],{},"Сам по собі майже ніколи. Він стає ним тієї миті, коли за ним відповідає щось\nприватне.",[10,35,36,37,39,40,43],{},"Вайлдкард це значення ",[14,38,16],{}," у заголовку відповіді на ім'я\n",[14,41,42],{},"Access-Control-Allow-Origin",", і воно означає, що код будь-якого сайту може\nпрочитати саме цю відповідь. Звучить як твердження про те, хто може дістатися\nдо ваших даних. Насправді це твердження про те, кому дозволено прочитати те, що\nваш сервер уже надіслав.",[10,45,46],{},"Адреса, яку перевіряє сканування, це та, з якої віддається ваш застосунок. У\nбільшості білдерів ця адреса роздає ваші сторінки, ваші зображення та ваш\nскомпільований код, і все це за задумом іде до кожного відвідувача. Вайлдкард на\nних дає дозвіл читати файли, які будь-хто вже міг завантажити, просто відкривши\nваш сайт.",[10,48,49],{},"Тож знахідка є питанням, а не вироком, і питання полягає в тому, що стоїть за\nзаголовком. Якщо відповідь це ваша головна сторінка, не сталося нічого. Якщо\nвідповідь це список ваших клієнтів, той список уже був доступний кожному, хто\nмав адресу.",[27,51,53],{"id":52},"що-насправді-робить-access-control-allow-origin","Що насправді робить Access-Control-Allow-Origin",[10,55,56],{},"Він каже браузеру вашого відвідувача, чи дозволено сторінці на екрані зазирнути\nу відповідь, яку ваш сервер уже надіслав.",[10,58,59,60,62],{},"Порядок і є всією суттю, і він протилежний до того, як його уявляє собі майже\nкожен. Сторінка на якомусь чужому сайті виконує шматок коду, що просить у вашого\nзастосунку дані. Запит іде. Ваш сервер його отримує, виконує те, що має\nвиконати, і повертає відповідь повністю. Аж потім браузер читає заголовок тієї\nвідповіді й вирішує, чи передавати вміст сторінці, яка його просила. Посібник\nMDN про CORS вкладає це в один рядок: сервер має дати згоду через\n",[14,61,42],{},", щоб поділитися відповіддю зі скриптом.",[10,64,65],{},"Ваші дані залишили будівлю в обох випадках. Заголовок вирішує лише те, чи\nпобачить їх один конкретний шматок коду, що виконується в браузері однієї\nконкретної людини.",[67,68],"diagram",{"alt":69,"caption":70,"src":71},"Один сервер відповідає двом відвідувачам однаковою відповіддю. У верхній смузі відповідь доходить до браузера, який утримує її на бар'єрі, тож сторінка за ним не отримує нічого. У нижній смузі жодного бар'єра немає, і та сама відповідь неушкодженою приходить у вікно термінала.","Обидва відвідувачі отримують відповідь, бо сервер надсилає її ще до того, як щось перевірять. Бар'єр у верхній смузі це браузер, а в нижній смузі браузера немає взагалі.","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fwho-reads-the-header-1600x650.png",[10,73,74],{},"Браузер це єдине в цій історії, що читає заголовок. Скрипт на сервері,\nінструмент командного рядка, скрапер, мобільний застосунок: жоден із них до\nнього не заглядає, бо писали його для браузера, а браузера тут немає. Вони\nнадсилають той самий запит, отримують ту саму відповідь і читають кожен її байт.",[27,76,78],{"id":77},"звуження-cors-не-робить-відкриту-адресу-приватною","Звуження CORS не робить відкриту адресу приватною",[10,80,81],{},"Бо CORS живе всередині браузерів, а той, хто пригощається вашими даними, не має\nпричин ним користуватися.",[10,83,84],{},"Це та частина, яка коштує людям пообіддя. Вони бачать знахідку про вайлдкард,\nзвужують заголовок до власного домену, розгортають наново, скануються наново, а\nадреса, що роздавала рядки клієнтів, роздає рядки клієнтів і далі. Вона робила\nце завжди. Єдиний відвідувач, якого це коли-небудь спинило, це чужа вебсторінка.",[86,87,88,109],"table",{},[89,90,91],"thead",{},[92,93,94,98,103,106],"tr",{},[95,96,97],"th",{},"Що хтось намагається зробити",[95,99,100,101],{},"Вайлдкард ",[14,102,16],{},[95,104,105],{},"Лише ваш домен",[95,107,108],{},"Будь-яке походження, повернене луною, з обліковими даними",[110,111,112,125,136,148],"tbody",{},[92,113,114,118,121,123],{},[115,116,117],"td",{},"Відкрити адресу у вкладці браузера",[115,119,120],{},"Працює",[115,122,120],{},[115,124,120],{},[92,126,127,130,132,134],{},[115,128,129],{},"Прочитати її скриптом або з термінала",[115,131,120],{},[115,133,120],{},[115,135,120],{},[92,137,138,141,143,146],{},[115,139,140],{},"Сторінка чужого сайту читає її",[115,142,120],{},[115,144,145],{},"Заблоковано",[115,147,120],{},[92,149,150,153,159,163],{},[115,151,152],{},"Чужий сайт читає її як ваш авторизований користувач",[115,154,155],{},[156,157,145],"key-verdict",{"type":158},"safe",[115,160,161],{},[156,162,145],{"type":158},[115,164,165],{},[156,166,120],{"type":167},"danger",[10,169,170,171,174],{},"Прочитайте останній рядок двічі, бо саме тут загальна порада розсипається.\nЗвичайний вайлдкард не може бути використаний, щоб прочитати дані вашого\nавторизованого відвідувача. Браузери відмовляють такому поєднанню навідріз, і\nпосібник MDN про CORS каже це прямо: якщо запит несе куку, а відповідь\nповертається з ",[14,172,173],{},"Access-Control-Allow-Origin: *",", браузер блокує доступ до\nвідповіді й показує помилку CORS у консолі. Тож саме вайлдкард, хоч як дивно, і\nробить цю конкретну атаку неможливою.",[10,176,177],{},"Стовпчик, який справді віддає дані авторизованого користувача, це третій, і для\nцього серверу треба вписати адресу самого відвідувача у власну відповідь.",[27,179,181],{"id":180},"налаштування-cors-яке-справді-небезпечне","Налаштування CORS, яке справді небезпечне",[10,183,184,185,188,189,192],{},"Сервер, що читає заголовок ",[14,186,187],{},"Origin"," із запиту, вписує те саме значення у власну\nвідповідь і надсилає поруч\n",[14,190,191],{},"Access-Control-Allow-Credentials: true",".",[10,194,195],{},"Ніхто не береться за це навмисно. Воно з'являється наприкінці пообіддя, згаяного\nна спроби змусити вайлдкард працювати з авторизованими запитами, і на відкриття,\nщо він ніколи не працюватиме. Повернути луною те походження, яке питало,\nздається виходом: кожен сайт, який має бути дозволений, дозволений, помилки в\nконсолі припиняються, функція виходить у світ. Насправді сервер каже цим, що\nвирішує сам відвідувач, а до таких належить і сторінка, якої ще ніхто не\nнаписав.",[10,197,198,199,201],{},"Ось що це дозволяє. Ваша клієнтка увійшла у ваш застосунок, і в її браузері\nлежить кука сесії. В іншій вкладці вона відкриває сайт, що не має до вас жодного\nстосунку. Код того сайту просить у вашого API її обліковий запис. Її браузер\nдодає куку, бо додавати куки це те, що браузери роблять. Ваш сервер читає\n",[14,200,187],{},", про яке ніколи не чув, ставить його у відповідь як дозвіл і додає, що\nз обліковими даними все гаразд. Браузер перевіряє, знаходить збіг і передає дані\nвашої клієнтки сторінці, про яку вона не знала, що та їх читає.",[67,203],{"alt":204,"caption":205,"src":206},"Запит залишає невідомий сайт, несучи червону іменну бирку та куку. Сервер копіює ту саму червону бирку в поле дозволу своєї відповіді. Браузер порівнює дві бирки, бачить, що вони однакові, і пропускає дані до сторінки.","Відвідувач сам подає ім'я, а сервер вписує це ім'я у перепустку. Хто питає, той і в списку, і саме цим цей випадок відрізняється від вайлдкарда.","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fthe-echoed-origin-1600x680.png",[10,208,209],{},"У нашому скануванні за серпень 2026 таке трапилося в 61 з 30 926 застосунків,\nде перевірка змогла отримати відповідь. З трьох знахідок CORS це єдина, що\nдотягується до даних за входом у систему.",[27,211,213],{"id":212},"як-часто-трапляється-вайлдкард-і-хто-це-вирішує","Як часто трапляється вайлдкард і хто це вирішує",[10,215,216],{},"Здебільшого вирішує ваш білдер. У тому самому скануванні 5 727 із тих 30 926\nзастосунків надсилали вайлдкард, і найкращий одиничний показник того, чи робить\nце ваш, це платформа, яка його опублікувала.",[10,218,219],{},"Перевірка CORS зафіксувала щонайменше одну знахідку в 5 418 із 5 419 застосунків\nBase44, де отримала відповідь, і у 8 із 18 518 застосунків Lovable. Replit\nопинився між ними з 1 129 із 3 037. Такий широкий розкид і є тим, як типове\nналаштування хостингу виглядає ззовні: майже суцільне на одній платформі, майже\nвідсутнє на іншій, через тисячі застосунків, власники яких ніколи нічого між\nсобою не узгоджували.",[10,221,222,223,228],{},"Три окремі знахідки складають перевірку CORS на всіх 30 926 застосунках:\nвайлдкард у 5 727 з них, адреса, що відповідає даними без входу, у 3 852, і\nповернене луною походження у 61. Разом виходить більше, ніж сама перевірка, бо\nчимало застосунків мають дві з трьох. Кожна цифра тут походить із\n",[224,225,227],"a",{"href":226},"\u002Fresearch\u002Fvibe-coded-app-security-2026","нашого сканування 30 998 живих vibe-coded застосунків",",\nяке публікує кожну разом із базою, на якій її виміряли.",[10,230,231],{},"Те, на що ви можете вплинути, ділиться так само. Вайлдкард надсилає той, хто\nвіддає ваш застосунок, а для vibe-coded застосунку це зазвичай білдер. Що\nповертається, коли незнайомець просить дані в однієї з ваших адрес, вирішили\nвсередині вашого застосунку, ви або білдер, що пише код від вашого імені.",[27,233,235],{"id":234},"як-перевірити-власний-застосунок","Як перевірити власний застосунок",[10,237,238],{},"Дивитися треба на дві речі, і друга вирішує, чи має все це взагалі значення.",[10,240,241,244,245,248,249,252,253,256],{},[22,242,243],{},"Чи надсилає ваш застосунок вайлдкард?"," Відкрийте свій застосунок у мережі,\nнатисніть F12, щоб викликати інструменти розробника в браузері, натисніть\n",[22,246,247],{},"Network"," і перезавантажте сторінку. Клацніть перший запит у списку й\nпрочитайте панель ",[22,250,251],{},"Response Headers",". Рядок ",[14,254,255],{},"access-control-allow-origin: *","\nі є знахідкою. Якщо такого рядка немає зовсім, ваш сервер не ділиться нічим\nчерез межі походження ні з ким.",[10,258,259,262],{},[22,260,261],{},"Що відповідає за ним?"," Лишайтеся у вкладці Network і перезавантажте свій\nзастосунок, поки ви в системі, стежачи за запитами, що повертаються як JSON. Це\nй є адреси, з яких ваш застосунок бере дані. Скопіюйте кожне посилання,\nвідкрийте вікно приватного перегляду, щоб бути невходженим, і вставляйте їх по\nодному. Усе, що повертається зі справжніми рядками замість помилки чи\nпорожнього списку, доступне для читання кожному в інтернеті, хто має те\nпосилання. Це правда сьогодні, хоч би що казав ваш заголовок CORS, і лишається\nправдою після того, як ви його звузите.",[10,264,265,266,192],{},"Наше безкоштовне сканування виконує другу перевірку за вас: читає код вашого\nзастосунку в пошуках адрес, які він викликає, звертається до кожної без входу і\nповідомляє ті, що відповіли даними. Це триває приблизно 20 секунд і не потребує\nоблікового запису: ",[224,267,269],{"href":268},"\u002F#scan","скануйте свій застосунок",[10,271,272,273,192],{},"Якщо ваш застосунок говорить із Supabase просто з браузера, є третє місце, куди\nварто заглянути, бо правила на кожній таблиці вирішують, кому які рядки читати,\nі ",[224,274,276],{"href":275},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","увімкнути їх не те саме, що бути захищеним",[27,278,280],{"id":279},"що-робити-просто-зараз","Що робити просто зараз",[282,283,284],"key-takeaways",{},[285,286,287,291,294,297,303],"ul",{},[288,289,290],"li",{},"Сприймайте знахідку про вайлдкард як питання про те, що стоїть за заголовком. На адресі, з якої віддається ваш застосунок, він зазвичай дозволяє читати файли, які кожен відвідувач завантажує й так.",[288,292,293],{},"Вийдіть із системи й відкрийте кожну адресу даних, яку викликає ваш застосунок. Усе, що повертає справжні рядки браузеру без входу, є публічним для всіх, хоч би що казав заголовок.",[288,295,296],{},"Виправляйте відкриту адресу на самій адресі: вимагайте входу і відповідайте незнайомцеві кодом 401. Звуження заголовка CORS лишає її доступною для всього, крім чужих вебсторінок.",[288,298,299,300,302],{},"Якщо ваш сервер повертає луною те походження, яке питало, і надсилає ",[14,301,191],{},", замініть це сьогодні списком власних доменів. Це єдиний випадок тут, коли чужий сайт читає дані від імені вашого авторизованого користувача.",[288,304,305],{},"Якщо заголовок надходить від хостингу вашого білдера і змінити його ви не можете, витратьте цей час на адреси. Саме там лежать ваші дані.",[10,307,308,309,192],{},"Звичка, яку варто тримати, це прохід без входу по власних адресах даних, бо\nкожна нова функція додає ще одну, а на екрані нічого не змінюється, коли якась\nіз них починає відповідати. Reeve Care запускає це саме сканування проти вашого\nзастосунку в мережі за розкладом і пише вам, коли результат гіршає:\n",[224,310,312],{"href":311},"\u002F#pricing","за чим воно стежить і скільки коштує",[10,314,315,316,320,321,325],{},"Якщо ви радше розберетеся з усім за один раз,\n",[224,317,319],{"href":318},"\u002Fchecklist","10-хвилинний контрольний список безпеки"," охоплює це поряд із рештою\nтого, що свіжозапущений застосунок схильний лишати відкритим, а\n",[224,322,324],{"href":323},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","які ключі безпечні у вашому фронтенді","\nце друга половина питання, з яким люди зазвичай приходять.",{"title":327,"searchDepth":328,"depth":328,"links":329},"",3,[330,332,333,334,335,336,337],{"id":29,"depth":331,"text":30},2,{"id":52,"depth":331,"text":53},{"id":77,"depth":331,"text":78},{"id":180,"depth":331,"text":181},{"id":212,"depth":331,"text":213},{"id":234,"depth":331,"text":235},{"id":279,"depth":331,"text":280},"Основи безпеки","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcover-1200x630.png","Шестеро різних відвідувачів дістаються одного сервера, і та сама відповідь повертається до кожного з них.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.",false,"md",[345,348,351,354,357],{"q":346,"a":347},"Сканування каже, що мій API відкритий для будь-якого сайту. Чи треба це виправляти?","Спершу подивіться, що відповідає за ним. Вайлдкард на адресі, з якої віддається ваш застосунок, зазвичай дозволяє читати ваші сторінки, зображення та скомпільований код, а все це кожен відвідувач завантажує й так. Виправляти треба тоді, коли адреса за цим заголовком віддає справжні дані тому, хто не увійшов у систему, і виправляти саме на тій адресі, вимагаючи входу.",{"q":349,"a":350},"Чи стане мій API приватним, якщо звузити CORS до власного домену?","Ні. CORS це правило, яке браузери застосовують самі до себе, тож воно стосується лише коду, що виконується на чужій вебсторінці. Скрипт, команда в терміналі чи скрапер надішлють той самий запит і прочитають ту саму відповідь, бо жоден із них не дивиться на заголовок. Якщо адреса віддає ваші дані без входу, вона робить це для всіх, хоч би що казав заголовок.",{"q":352,"a":353},"Чи може чужий сайт прочитати дані моїх авторизованих користувачів через вайлдкард?","Через звичайний вайлдкард ні. Браузери відмовляють такому поєднанню: посібник MDN про CORS зазначає, що коли запит несе куку, а відповідь повертається з Access-Control-Allow-Origin у значенні вайлдкарда, браузер блокує доступ до відповіді й записує помилку CORS. Працює натомість інший варіант: сервер повертає луною те походження, яке питало, разом із Access-Control-Allow-Credentials у значенні true.",{"q":355,"a":356},"Як змінити заголовок CORS у застосунку на Lovable чи Base44?","Часто ніяк, бо заголовок надсилає хостинг, на який публікує ваш білдер, і діє він для кожного застосунку на тій платформі. Це варто знати, перш ніж витрачати на нього тиждень. Що ви завжди можете змінити, так це те, що ваші власні адреси віддають на запит без входу, і саме туди виправлення й належить.",{"q":358,"a":359},"Сканування також позначило відкриті адреси API. Чи це те саме?","Це інше, і серйозніше з двох. Вайлдкард описує, кому дозволено читати відповідь. Відкрита адреса означає, що відповідь містила ваші дані й прийшла без того, щоб хтось увійшов у систему. Друге однаково правдиве для браузера, для скрипта і для незнайомця з посиланням, і звуження заголовка CORS не змінює в цьому нічого.","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",[362,363,364,365,366,367],"вайлдкард cors ризик безпеки","access-control-allow-origin вайлдкард","чи небезпечний вайлдкард cors","неправильне налаштування cors","api відкрите для будь-якого сайту","access-control-allow-credentials true",{},true,"\u002Fblog\u002Fcors-wildcard-security-risk","2026-08-26",{"title":5,"description":341},"blog\u002Fcors-wildcard-security-risk",[375,376,377],"Вайлдкард CORS стає ризиком для безпеки лише тоді, коли за ним відповідає щось приватне. Сам по собі він дозволяє читати те, що будь-хто й так міг завантажити.","Цей заголовок є вказівкою для браузера вашого відвідувача, і приходить він після того, як відповідь уже надіслано. Поза браузером його не читає ніхто, тож звуження заголовка лишає відкриту адресу так само відкритою.","Цілого вечора вартий інший випадок: сервер повертає луною той сайт, який саме питає, та ще й дозволяє облікові дані. Ось тоді чужа сторінка читає дані від імені вашого авторизованого користувача.","1f2BcQDeHXGHd9bkxJrJ9BOXr8AEcW0TUT-pe50bozQ",1787826051126]