Tagasi blogisse
Juurutamine20. august 20267 min lugemineUuendatud 30. august 2026

Content Security Policy veebisaidi chatbotidele: Vidina, API, piltide ja striimimise turvaline lubamine

Praktiline CSP veebisaidi chatbotidele lubab vaid tõesti vajalikke skripte, API-ühendusi, vooge ja pilte – ilma tarbetute üldmärkideta.

Täiskasvanud üritustehnik kontrollib suvisel vabaõhulaval chatboti vidina turvatud ühendusmoodulit.

Veebisaidi chatbot ei koosne brauseris peaaegu kunagi vaid ühest JavaScripti failist. Laadija avab vidina, API võtab teateid vastu, vastused saabuvad voogedastusena ning profiilipildid või meedia võivad asuda hoopis muus domeenis. Content Security Policy (CSP) muudab need teed nähtavaks ja piirab neid: brauser laadib või ühendub vaid sellega, mida veebisait selgesõnaliselt lubab.

See on oluline teine kaitsekiht Cross-Site Scripting (XSS) rünnakute ja ootamatu kolmandate osapoolte sisu vastu. CSP ei paranda aga turvamata API-t, puuduvat autentimist, vigast sisendkontrolli ega Prompt Injection rünnakuid. See vähendab siseseotud koodi võimalusi ja piirab vea mõjuraadiust. Seetõttu on otsustava tähtsusega võimalikult väike ja testitud poliitika, mitte pikk laialdaselt lubatud domeenide nimekiri.

Miks vajavad chatboti vidinad spetsiaalseid CSP-reegleid

Tavalise sisulehe puhul piisab sageli ressursidest lehe enda päritolust (origin). Chatbot aga jätkab suhtlust ka pärast laadimist. connect-src juhib muuhulgas funktsioone fetch(), XMLHttpRequest, EventSource, WebSocket ja sendBeacon(). Just siin liiguvad teated, voogedastuse vastused, tagasiside sündmused ja vajadusel telemeetria. Kui õige päritolu puudub, ilmub vidin küll ekraanile, kuid ei saa vastata.

Teised komponendid kuuluvad eraldi direktiivide alla. script-src otsustab vidina laadija üle, img-src avataride ja vastusepiltide üle, style-src stiililehtede ning font-src väliste fontide üle. iframe-põhine vidin vajab lisaks direktiivi frame-src. default-src toimib varulahendusena paljudele otseselt nimetamata ressursitüüpidele, kuid ei asenda teadlikku inventuuri.

Kõige olulisem eeltöö ei toimu seetõttu CSP-generaatoris, vaid brauseris: avage esinduslik leht, alustage vestlust, laske pikka vastust voogedastada, avage allikad, saatke tagasisidet ning testige vea- ja üleandmisjuhte (handoff). Võrgupaneelis näete tegelikult pöördutud päritolusid. Dokumenteerige iga hosti eesmärk, ressursitüüp ja vastutav isik.

Nelja olulise andmetee eraldi lubamine

1. Vidina skript ja initsialiseerimine

Hankige laadija võimalusel stabiilselt, versioonitud aadressilt. Lubamine nagu script-src https: oleks liiga lai, sest see lubaks skripte mis tahes HTTPS-domeenilt. Selle asemel lubage täpne CDN-i päritolu või serveerige laadijat ise. Kui integratsioon vajab sisest (inline) koodi, kasutage iga HTTP-vastuse puhul uuesti genereeritud nonce-väärtust või sobivat räsi (hash). 'unsafe-inline' ei tohiks jääda püsivaks kiirlahenduseks.

Nonce kuulub vaid skriptidele, mida serveripoolne mall ise genereerib. Vahetarkvara (middleware), mis lisab pimedalt samale olemasolevale script-sildile sama nonce-väärtuse, usaldaks ka sissesöödetud silte. Staatilise, versioonitud kolmanda osapoole skripti puhul võib lisaks aidata Subresource Integrity (SRI); tihti muutuvate failide puhul tuleb aga räsi kontrollitult uuendada.

2. API, Server-Sent Events ja WebSocket

Tavalised POST-päringud ja fetch() kaudu voogedastatav vastus vajavad HTTPS API päritolu direktiivis connect-src. Server-Sent Events EventSource'i kaudu kuuluvad samuti sinna alla. WebSocketsi jaoks märkige selgelt konkreetne wss:// päritolu. MDN juhib tähelepanu sellele, et 'self' ei hõlma kõigis brauserites automaatselt WebSocketi skeeme. Eraldi direktiivi nimega stream-src ei ole olemas.

CSP ja CORS lahendavad erinevaid ülesandeid. CSP määrab, kuhu leht üldse tohib ühenduda; CORS määrab serveri poolel, millised päritolud tohivad vastust brauseris lugeda. Seetõttu ei lahenda CSP-luba ega CORS-viga aegunud juurdepääsutõendit. Same-Origin proksi võib poliitikat lihtsustada, kuid peab siiski õigesti käsitlema autentimist, päringupiiranguid (rate limits), katkestusi ja vigade edastamist.

3. Pildid, avatarid ja loodud meedia

Lubage direktiivis img-src vaid enda päritolu ja tegelikult kasutatav meedia päritolu. data: on vajalik vaid siis, kui vidin kasutab väikeseid manustatud pilte; blob: vaid siis, kui brauser loob pilte tõesti Blob-URL-ina. Iga täiendav allikas suurendab ründepinda. Kui pilt laaditakse kõigepealt fetch() kaudu ja teisendatakse seejärel Blob-URL-iks, võivad olla puudutatud nii connect-src kui ka img-src.

Ärge testige vaid standardset avatari. Kontrollige eelvaatepilte, allikate ekraanipilte, failimanuseid, tumedat režiimi ja mittesaadaoleva meedia vigade kuvamist. URL-i parameetrid võivad kanda konfidentsiaalset teavet CSP-raportitesse; seetõttu peaksid raportite lõpp-punktid töötlema aruandeid andmesäästlikult ega tohiks neid tähtajatult säilitada.

4. iframe, stiilid, fondid ja valikulised workerid

Otse DOM-i manustatud vidin ei vaja tavaliselt võõrast raami. Sellisel juhul võib frame-src 'none' jääda kehtima. Kui vestlus toimub aga iframe'is, lubage eranditult vaid selle täpset päritolu. Sellest tuleb eristada direktiivi frame-ancestors: see direktiiv määrab väljastatud ressursil, millised lehed tohivad seda manustada. Vidina pakkuja peab selle seetõttu oma iframe-vastuses õigesti seadistama.

Stiilide ja fontide puhul kehtib sama põhimõte. Lubage konkreetsed hostid ja vältige 'unsafe-inline' kasutamist niivõrd, kuivõrd integratsioon seda võimaldab. Workerid või helifunktsioonid lisatakse vaid siis, kui toode neid tegelikult kasutab. Ennetav blob:, tervete üldmärkidest domeenide või suvaliste meediaallikate lubamine raskendab hilisemaid auditeid.

Realistlik CSP näide chatboti vidina jaoks

Järgmised domeenid on teadlikult reserveeritud näidisdomeenid. Asendage need oma võrguanalüüsist saadud päritoludega. Näide eeldab välist laadijat, HTTPS API-t, eraldi WebSocketi voogedastuseks ja meediahosti. See ei kasuta üldiseid üldmärke:

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} tähistab tugevat, iga vastuse puhul uuesti genereeritud väärtust, mis on päises ning lubatud script- või style-elementidel identne. Kui teie vidin kasutab iframe'i, asendage frame-src 'none' täpse vidina päritoluga. Kui see kasutab eranditult HTTPS-voogedastust fetch() või EventSource'i kaudu, jääb WebSocketi päritolu ära. Eemaldage iga allikas, mida pärast täielikku funktsionaalsuse testimist vaja ei lähe.

Poliitika on praktiline lähtekoht, mitte universaalne mall. Kaasaegne range CSP võib skripte veelgi tugevamalt juhtida nonce-väärtuste või räsijadade ja 'strict-dynamic' kaudu. Kas see on ilma ühilduvusprobleemideta võimalik, sõltub sellest, kuidas laadija täiendavaid skripte loob. Selgitage see protsess pakkujaga ning testige brausereid, nõusolekurežiimi (consent mode) ja juurutusvariante.

Report-Only režiimist rakendatud poliitikani

Ärge lülitage uut poliitikat kontrollimata sisse. W3C mehhanism Content-Security-Policy-Report-Only teavitab rikkumistest ilma ressursse blokeerimata. Nii tuvastate unustatud pildihostid, erineva voogedastuse päritolu või sisestatud koodi enne, kui see kasutajaid mõjutab. OWASP soovitab HTTP-päist eelistatud edastusviisina; erinevalt meta-elemendist toetab see täielikku funktsionaalsust.

  1. Looge inventuur: Testige vidina käivitamist, esimest teadet, pikka voogedastatud vastust, allikaid, pilte, tagasisidet, üleandmist ja nõusoleku muutmist mitmel lehetüübil.
  2. Juurutage Report-Only: Alustage planeeritud range poliitikaga ja koguge rikkumisi piiratud aja jooksul. Filtreerige välja brauserilaiendused ja muud mittetaasesitatavad häiresignaalid.
  3. Põhjendage iga hosti: Laiendage poliitikat vaid siis, kui konkreetsel toote funktsioonil on seda päritolu vaja. Vältige üldmärke vastusena üksikutele teadetele.
  4. Testige automatiseeritult: Lisage end-to-end testid, mis saadavad teate, ootavad voogedastust ja laadivad pildi. Kontrollige samal ajal brauseri konsooli CSP-rikkumiste suhtes.
  5. Rakendage ja jälgige: Aktiveerige Content-Security-Policy päis, hoidke paralleelselt silma peal veelgi rangemal Report-Only variandil ja võrrelge veamäärasid.

Järkjärguline juurutamine sobib hästi varjurežiimis (Shadow Mode) chatbotiga. Voogedastuse spetsiifiliste mõõdikute jaoks on abiks artikkel latentsuse eelarvetest ja aegumistest. CSP-rikkumisi tuleks sealjuures käsitleda eraldiseisva signaalina: aegumine ja blokeeritud ühendus vajavad erinevat põhjuste analüüsi.

Tüüpilised vead konfigureerimisel

  • Liiga laiad allikanimekirjad: *, https: või suured üldmärkidega domeenid muudavad poliitika mugavaks, kuid nõrgaks ja raskesti kontrollitavaks.
  • Testitakse vaid nähtavat käivitamist: Vidin avaneb, kuid voogedastus, tagasiside, pildid või üleandmine ebaõnnestuvad alles hiljem.
  • 'unsafe-inline' jääb püsivalt kehtima: Lühiajalist ühilduvusabi ei asendata nonce-väärtuste, räsijadade ega välise koodiga.
  • CSP aetakse segi juurdepääsukontrolliga: Poliitika ei asenda serveripoolseid õigusi, sessioonikontrolli ega kaitset tööriistade kuritarvitamise eest.
  • Aruanded sisaldavad liiga palju andmeid: Täielikud URL-id, päringuparameetrid või kasutajakontekst satuvad tarbetult kauaks seiresse.
  • Test- ja toodangukeskkond erinevad: Erinevad CDN-, API- või WebSocket-hostid tulevad ilmsiks alles pärast avalikustamist.

Isegi range script-src ei muuda lubatud kolmandat osapoolt automaatselt turvaliseks: selle JavaScript töötab võimalustega, mida teie leht sellele annab. Seetõttu kontrollige pakkujate vahetust, uusi alamdomeene ja laadijate uuendusi nagu teisi turvakriitilisi sõltuvusi. Artikkel Prompt Injection kaitsest täiendab seda brauseripiiri reeglitega RAG-i, tööriistade ja andmete jaoks.

Kontrollnimekiri enne avalikustamist

  • Kas kõik vajalikud päritolud on tegelikest brauserisessioonidest dokumenteeritud ja sisuliselt põhjendatud?
  • Kas script-src lubab vaid laadijat ja kontrollitud skripte ilma üldise 'unsafe-inline' loata?
  • Kas connect-src sisaldab täpseid HTTPS-, EventSource- ja vajadusel WSS-päritolusid?
  • Kas pildi-, stiili-, fondi-, raami- ja worker-allikad on eraldatud ja määratletud võimalikult rangelt?
  • Kas nonce-väärtused genereeritakse vastuse kohta uuesti ja lisatakse vaid usaldusväärsetele elementidele?
  • Kas nõusoleku muutmist, pikki vooge, pilte, vigu, üleandmist ning töölaua- ja mobiilseadmeid on testitud?
  • Kas poliitikat jälgiti kõigepealt Report-Only režiimis ja rakendati seejärel päisena?
  • Kas CSP-aruandeid töödeldakse ilma tarbetute isikuandmete või konfidentsiaalsete URL-andmeteta?
  • Kas pärast vidina või infrastruktuuri uuendusi toimub automaatne regressioonitest?

Kokkuvõte

Hea CSP veebisaidi chatbotidele ei ole erandite kogum, vaid lubatud brauseriteede tehniline kaart. Eraldage laadija, API, voogedastus, pildid ja iframe-ressursid, lubage täpsed päritolud ning rakendage poliitika kõigepealt Report-Only režiimis. Nii jääb vidin töökindlaks, samal ajal kui ootamatutel skriptidel ja ühendustel on oluliselt vähem tegutsemisruumi.

Allikad

Muuda veebikülastused paremaks vestluseks

Käivitage AI-vestlusrobot, mis on kasulik esimesest päevast

Treeni ChatReact oma veebisaidi, dokumentide ja kinnitatud faktidega, et külastajad saaksid kiiremaid vastuseid ja teie meeskond vähem korduvaid päringuid.

Seotud artiklid

Jätka lugemist