Content Security Policy svetainės pokalbių botams: saugus valdiklio, API, vaizdų ir srauto perdavimo įgalinimas
Praktiška CSP svetainės pokalbių botams leidžia tik tikrai reikalingus scenarijus, API ryšius, srautus ir vaizdus – be nereikalingų visuotinių pakaitos simbolių.

Svetainės pokalbių botas naršyklėje retai susideda tik iš vieno „JavaScript“ failo. Užkroviklis atidaro valdiklį, API priima žinutes, atsakymai grįžta kaip srautas, o profilio nuotraukos ar medija gali būti kitoje domene. Content Security Policy (CSP) padaro šiuos kelius matomus ir juos apriboja: naršyklė įkelia arba jungiasi tik prie to, ką svetainė aiškiai leidžia.
Tai yra svarbus antrasis apsaugos sluoksnis nuo Cross-Site Scripting ir netikėto trečiųjų šalių turinio. Tačiau CSP neišsprendžia nesaugios API, trūkstamo autentifikavimo, prasto įvesties tikrinimo ar Prompt Injection problemų. Ji sumažina įterpto kodo galimybes ir apriboja klaidos poveikio spindulį. Todėl svarbiausia yra kuo mažesnė, patikrinta politika, o ne ilgas bendrai patvirtintų domenų sąrašas.
Kodėl pokalbių botų valdikliams reikia specialių CSP taisyklių
Klasikiniame turinio puslapyje dažnai pakanka resursų iš tos pačios kilmės (origin). Tuo tarpu pokalbių botas po įkėlimo toliau bendrauja. connect-src, be kita ko, valdo fetch(), XMLHttpRequest, EventSource, WebSocket ir sendBeacon(). Būtent čia juda žinutės, transliuojami atsakymai, atsiliepimų įvykiai ir, jei reikia, telemetrija. Jei trūksta reikiamos kilmės, valdiklis pasirodys, bet negalės atsakyti.
Kiti komponentai patenka po kitomis direktyvomis. script-src sprendžia dėl valdiklio užkroviklio, img-src – dėl avatarų ir atsakymų vaizdų, style-src – dėl stilių failų, o font-src – dėl išorinių šriftų. Į iframe įmontuotam valdikliui papildomai reikia frame-src. default-src tarnauja kaip atsarginis variantas daugeliui aiškiai nenurodytų resursų tipų, tačiau nepakeičia sąmoningo audito.
Todėl svarbiausias pasiruošimas vyksta ne CSP generatoriuje, o naršyklėje: atidarykite reprezentatyvų puslapį, pradėkite pokalbį, leiskite transliuoti ilgą atsakymą, atidarykite šaltinius, išsiųskite atsiliepimus ir patikrinkite klaidos bei perdavimo (handoff) atvejus. Tinklo (Network) skydelyje pamatysite faktiškai naudojamas kilmes (origins). Dokumentuokite kiekvieno pagrindinio kompiuterio (host) paskirtį, resurso tipą ir atsakingą asmenį.
Keturių svarbių duomenų kelių atskiras įgalinimas
1. Valdiklio scenarijus ir inicijavimas
Užkroviklį gaukite iš stabilaus, versijuojamo adreso. Įgalinimas, pvz., script-src https:, būtų per platus, nes leistų scenarijus iš bet kurio HTTPS domeno. Vietoj to leiskite tikslią CDN kilmę arba patys pateikite užkroviklį. Jei integracijai reikia įterptojo (inline) kodo, naudokite kiekvienam HTTP atsakymui iš naujo sugeneruotą „nonce“ arba atitinkamą maišos kodą (hash). 'unsafe-inline' neturėtų tapti greitu ilgalaikiu sprendimu.
„Nonce“ turi būti pridedamas tik prie scenarijų, kuriuos sugeneruoja pats serverio šablonas. Tarpinė programinė įranga (middleware), kuri aklai prideda tą patį „nonce“ prie kiekvienos esamos scenarijaus žymos, pasitikėtų ir įterptomis žymomis. Statiniam, versijuojamam trečiosios šalies scenarijui papildomai gali padėti Subresource Integrity; tačiau dažnai besikeičiantiems failams maišos kodas turi būti kontroliuojamai atnaujinamas.
2. API, Server-Sent Events ir WebSocket
Įprastoms POST užklausoms ir per fetch() transliuojamam atsakymui reikalinga HTTPS API kilmė connect-src direktyvoje. Server-Sent Events per EventSource taip pat patenka čia. WebSocket ryšiui aiškiai įrašykite konkrečią wss:// kilmę. MDN pažymi, kad 'self' ne visose naršyklėse automatiškai apima WebSocket schemas. Atskiros direktyvos, vadinamos stream-src, nėra.
CSP ir CORS sprendžia skirtingas užduotis. CSP nustato, kur puslapiui apskritai leidžiama jungtis; CORS serverio pusėje nustato, kurios kilmės gali skaityti atsakymą naršyklėje. Todėl CSP leidimas neišsprendžia nei CORS klaidos, nei pasibaigusio galiojimo prieigos žetono. Tų pačių ribų proksis (Same-Origin-Proxy) gali supaprastinti politiką, tačiau vis tiek turi teisingai valdyti autentifikavimą, užklausų ribojimą (rate limits), laiko limitus ir klaidų perdavimą.
3. Paveikslėliai, avatarai ir sugeneruota medija
Direktyvoje img-src leiskite tik savo kilmę ir faktiškai naudojamą medijos kilmę. data: reikalingas tik tuo atveju, jei valdiklis naudoja mažus įterptus paveikslėlius; blob: – tik jei naršyklė generuoja paveikslėlius kaip Blob URL. Kiekvienas papildomas šaltinis padidina atakos plotą. Jei paveikslėlis pirma įkeliamas per fetch(), o vėliau paverčiamas į Blob URL, tai gali turėti įtakos ir connect-src, ir img-src.
Patikrinkite ne tik standartinį avatarą. Patikrinkite peržiūros vaizdus, šaltinių ekrano nuotraukas, failų priedus, tamsųjį režimą ir nepasiekiamų medijos failų klaidos rodymą. URL parametrai į CSP ataskaitas gali pernešti konfidencialią informaciją; todėl ataskaitų teikimo galutiniai taškai (endpoints) turėtų apdoroti ataskaitas taupydami duomenis ir nesaugoti jų neribotą laiką.
4. iframe, stiliai, šriftai ir pasirinktiniai Worker
Tiesiogiai į DOM įterptam valdikliui dažniausiai nereikia svetimo rėmelio. Tokiu atveju frame-src 'none' gali likti. Jei pokalbis vyksta iframe rėmelyje, leiskite tik tikslią jo kilmę. Nuo to reikėtų skirti frame-ancestors: ši direktyva pateikiamame resurse nustato, kuriems puslapiams leidžiama jį įterpti. Todėl valdiklio teikėjas turi ją tinkamai nustatyti savo iframe atsakyme.
Stiliams ir šriftams taikomas tas pats principas. Leiskite konkrečius pagrindinius kompiuterius ir venkite 'unsafe-inline', jei integracija tai leidžia. Worker arba garso funkcijos pridedamos tik tada, kai produktas jas tikrai naudoja. Atsargumo dėlei suteiktas blob:, visų visuotinių domenų ar bet kokių medijos šaltinių įgalinimas apsunkina būsimus auditus.
Realistiškas CSP pavyzdys pokalbių boto valdikliui
Toliau pateikti domenai yra tyčia rezervuoti pavyzdiniai domenai. Pakeiskite juos kilmėmis iš savo tinklo analizės. Pavyzdyje daroma prielaida, kad naudojamas išorinis užkroviklis, HTTPS API, atskiras WebSocket srauto perdavimui ir medijos pagrindinis kompiuteris. Jame nenaudojami bendri visuotiniai pakaitos simboliai:
Content-Security-Policy:
default-src 'self';
script-src 'self' https://cdn.chat.example 'nonce-{RANDOM}';
connect-src 'self' https://api.chat.example wss://stream.chat.example;
img-src 'self' data: https://media.chat.example;
style-src 'self' 'nonce-{RANDOM}';
font-src 'self';
frame-src 'none';
worker-src 'self';
object-src 'none';
base-uri 'self';
frame-ancestors 'self';
form-action 'self';
upgrade-insecure-requests;{RANDOM} reiškia stiprią, kiekvienam atsakymui iš naujo sugeneruotą reikšmę, kuri yra identiška antraštėje ir leidžiamuose scenarijaus ar stiliaus elementuose. Jei jūsų valdiklis naudoja iframe, pakeiskite frame-src 'none' tiksline valdiklio kilme. Jei jis naudoja tik HTTPS srauto perdavimą per fetch() arba EventSource, WebSocket kilmės nereikia. Pašalinkite kiekvieną šaltinį, kurio nereikia po pilno funkcinio patikrinimo.
Ši politika yra praktiška pradžia, o ne universilus šablonas. Šiuolaikinė griežta CSP gali dar stipriau valdyti scenarijus per „nonce“ arba maišos kodus ir 'strict-dynamic'. Ar tai įmanoma be suderinamumo problemų, priklauso nuo to, kaip užkroviklis generuoja kitus scenarijus. Išaiškinkite šį procesą su teikėju ir patikrinkite naršykles, sutikimo režimą ir diegimo variantus.
Nuo Report-Only iki privalomos politikos
Neaktyvuokite naujos politikos nepatikrinę. W3C mechanizmas Content-Security-Policy-Report-Only praneša apie pažeidimus neblokuodamas resursų. Taip atpažinsite pamirštus vaizdų pagrindinius kompiuterius, besiskiriančią srauto perdavimo kilmę arba įterptąjį kodą prieš tai, kai tai paveiks vartotojus. OWASP rekomenduoja HTTP antraštę kaip pirmenybinį pateikimo būdą; ji, priešingai nei Meta elementas, palaiko ir visą funkcijų apimtį.
- Sukurti inventorių: Patikrinkite valdiklio paleidimą, pirmąją žinutę, ilgą transliuojamą atsakymą, šaltinius, paveikslėlius, atsiliepimus, perdavimą ir sutikimo keitimą kelių tipų puslapiuose.
- Įdiegti Report-Only: Pradėkite nuo suplanuotos griežtos politikos ir rinkite pažeidimus per ribotą laikotarpį. Išfiltruokite naršyklės plėtinius ir kitus nereproduokuojamus triukšmo signalus.
- Pagrįsti kiekvieną hostą: Išplėskite politiką tik tada, kai konkreti produkto funkcija reikalauja tos kilmės. Venkite visuotinių pakaitos simbolių kaip reakcijos į pavienius pranešimus.
- Testuoti automatiškai: Papildykite „End-to-End“ testais, kurie išsiunčia žinutę, palaukia srauto perdavimo ir įkelia paveikslėlį. Kartu patikrinkite naršyklės konsolę dėl CSP pažeidimų.
- Priverstinai taikyti ir stebėti: Aktyvuokite
Content-Security-Policyantraštę, greta stebėkite dar griežtesnį Report-Only variantą ir palyginkite klaidų dažnumą.
Pakopinis įdiegimas gerai tinka pokalbių botui šešėliniu režimu (Shadow Mode). Srauto perdavimui būdingiems matavimams padės straipsnis apie vėlavimo biudžetus ir laiko limitus. CSP pažeidimai turėtų būti laikomi atskiru signalu: laiko limitui ir užblokuotam ryšiui reikalinga skirtinga priežasčių analizė.
Tipiškos klaidingos konfigūracijos
- Per platūs šaltinių sąrašai:
*,https:arba dideli visuotiniai domenai daro politiką patogią, bet silpną ir sunkiai tikrinamą. - Testuojama tik matoma pradžia: Valdiklis atsidaro, tačiau srauto perdavimas, atsiliepimai, paveikslėliai ar perdavimas nepavyksta tik vėliau.
'unsafe-inline'lieka visam laikui: Trumpalaikė pagalba suderinamumui nepakeičiama „nonce“, maišos kodais ar išoriniu kodu.- CSP painiojama su prieigos kontrole: Politika nepakeičia serverio pusės teisių, sesijos patikrinimo ir apsaugos nuo piktnaudžiavimo įrankių iškvietimais.
- Ataskaitose yra per daug duomenų: Celi URL adresai, užklausų parametrai ar vartotojo kontekstas be reikalo ilgai lieka stebėsenos sistemoje.
- Staging ir gamybinė aplinka skiriasi: Skirtingi CDN, API arba WebSocket hostai tampa matomi tik po paleidimo.
Net ir griežtas script-src nedaro leidžiamo trečiosios šalies teikėjo automatiškai saugaus: jo „JavaScript“ veikia su galimybėmis, kurias jam suteikia jūsų puslapis. Todėl tikrinkite teikėjo keitimą, naujus subdomenus ir užkroviklio atnaujinimus kaip kitas su saugumu susijusias priklausomybes. Straipsnis apie apsaugą nuo Prompt Injection papildo šią naršyklės ribą taisyklėmis, skirtomis RAG, įrankiams ir duomenims.
Kontrolinis sąrašas prieš paleidimą
- Ar visi reikalingi origin iš tikrų naršyklės sesijų yra dokumentuoti ir techniškai pagrįsti?
- Ar
script-srcleidžia tik užkroviklį ir kontroliuojamus scenarijus, be bendro'unsafe-inline'? - Ar
connect-srcapima tikslias HTTPS, EventSource ir, jei reikia, WSS kilmes? - Ar vaizdų, stilių, šriftų, rėmelių ir Worker šaltiniai yra atskirti ir apibrėžti kuo siauriau?
- Ar „nonce“ generuojami iš naujo kiekvienam atsakymui ir dedami tik ant pasitikėjimo vertų elementų?
- Ar buvo patikrinti sutikimo keitimai, ilgi srautai, paveikslėliai, klaidos, perdavimas bei darbalaukio ir mobilieji įrenginiai?
- Ar politika iš pradžių buvo stebima Report-Only režimu, o vėliau pritaikyta kaip privaloma antraštė?
- Ar CSP ataskaitos apdorojamos be nereikalingų asmens ar konfidencialių URL duomenų?
- Ar po valdiklio arba infrastruktūros atnaujinimų atliekamas automatinis regresinis testas?
Išvada
Gera CSP svetainės pokalbių botams nėra išimčių rinkinys, o leidžiamų naršyklės kelių techninis žemėlapis. Atskirkite užkroviklį, API, srauto perdavimą, paveikslėlius ir iframe resursus, leiskite tikslias kilmes ir iš pradžių įdiekite politiką Report-Only režimu. Taip valdiklis išliks veiksmingas, o netikėtiems scenarijams ir ryšiams teks gerokai mažiau erdvės.
Šaltiniai
Paverskite svetainės lankytojus geresniais pokalbiais
Paleiskite DI pokalbių robotą, naudingą nuo pirmos dienos
Mokykite ChatReact su savo svetaine, dokumentais ir patvirtintais faktais, kad lankytojai gautų greitesnius atsakymus, o jūsų komanda sulauktų mažiau pasikartojančių užklausų.
Susiję straipsniai
Tęsti skaitymą
Kaip pridėti DI chatbotą prie svetainės nepažeidžiant UX ar SEO
Diegimo planas, kaip pridėti chatbotą prie jūsų svetainės, tuo pačiu išlaikant naudotojo kelią, puslapio greitį ir turinio struktūrą tvarkingus.

DI pokalbių roboto atsako laiko optimizavimas: vėlavimo biudžetas, srautas ir laiko limitai
Greiti pokalbių botų atsakymai sukuriami visoje techninėje grandinėje. Sužinokite, kaip planuoti vėlavimo biudžetus, srautinį perdavimą, laiko limitus, pakartotinius bandymus ir saugius atsarginius scenarijus.

DI pokalbių boto testavimas šešėliniu režimu: saugus kelias nuo prototipo iki svetainės paleidimo
Naudodamos šešėlinį režimą (Shadow Mode), aiškius kokybės slenksčius ir pakopinį diegimą, svetainių komandos saugiai testuoja DI pokalbių botus prieš oficialų paleidimą.