Stringy ako &, viditeľné " alebo text café sa často opravujú ďalším decode volaním. Taký zásah môže skryť jeden symptom a poškodiť ostatné záznamy. Problém obyčajne znamená, že vrstvy nevedia, či value predstavuje Unicode text, HTML source, sanitized markup alebo už escapovaný výstup. Kvalita sa obnoví až po určení jednej kanonickej podoby pre každý typ.

Obyčajný text zostáva v storage sémantický

Meno alebo popis sa uloží ako Unicode „A & B“. HTML template escapuje ampersand, JSON serializer použije vlastné pravidlá a plain-text e-mail zobrazí znak priamo.

Uloženie entity syntaxe zviaže dáta s jedným kanálom a komplikuje editáciu, export aj search.

Sanitized HTML je iný dátový typ

Rich content field je pomenovaný a dokumentovaný ako HTML, prejde sanitizerom a raw sa renderuje iba v určenej komponentne.

Schema alebo wrapper type zabráni tomu, aby vývojár podľa výskytu tagu hádal, či je string trusted.

Decode patrí iba deklarovanému formátu

Externý feed môže výslovne posielať character references. Vtedy je jednorazový decode súčasť importu. Arbitrary user text sa nesmie opakovane dekódovať.

Nested encoding môže po viacerých kolách vytvoriť markup. Boundary vykoná jednu známu transformáciu a označí výsledný typ.

Double encoding znamená duplicitné vlastníctvo

Backend escapuje a auto-escaping template urobí to isté znova. Viditeľnú chybu nemožno bezpečne opraviť globálnym raw helperom, ktorý by otvoril XSS.

Treba odstrániť predčasnú prezentačnú transformáciu a ponechať ju finálnemu rendereru.

Charset a entities sú odlišné vrstvy

Mojibake vzniká, keď UTF-8 bajty niekto interpretuje iným charsetom. Entity decoder nespraví z poškodených bajtov spoľahlivo pôvodný text.

Databáza, connection, súbor, HTTP Content-Type a serializer používajú konzistentné UTF-8. Diagnostika kontroluje raw bytes.

Legacy migration potrebuje klasifikáciu

Jeden stĺpec môže miešať plain text, encoded a double-encoded hodnoty aj doslovne napísané entities. Globálny decode časť opraví a časť zničí.

Migrácia použije zdroj, dátum, verziu editora a vzorkovanie. Nejasné prípady sa kontrolujú oddelene a existuje backup.

Nečisté dáta poškodzujú search

Encoded a plain varianta sa v storage nerovnajú, hoci browser zobrazí rovnaký text. Search, sorting, deduplication a analytics vytvoria rozdielne výsledky.

Indexuje sa kanonický semantic text. Rich HTML môže mať odvodenú plain-text podobu.

API deklaruje text alebo markup

Klient nedokáže typ bezpečne zistiť podľa angle brackets. Schema uvedie, ktoré pole je plain text, ktoré sanitized HTML a aký allowlist platí.

Ak server ponúka reusable value aj rendered presentation, ide o dve polia. Jeden overloaded string núti klientov hádať.

Round-trip test odhalí miesto zmeny

Hodnota prejde inputom, storage, API, editáciou a renderom. Test obsahuje ampersand, úvodzovky, diakritiku, non-Latin text, entity-like sequence a rich markup.

Overí sa aj druhé uloženie. Framework upgrade nesmie postupne pridávať ďalšiu vrstvu encodingu.

Import potrebuje verziu transformačného pravidla

Ak sa neskôr nájde chyba sanitizeru alebo charsetu, source a transformation version umožnia nájsť dotknuté záznamy. Bez metadata zostáva iba nebezpečný globálny cleanup.

Výnimky majú vlastníka a dátum revízie. Historický obsah sa nemá navždy spracúvať nezdokumentovanou vetvou.

Export musí pomenovať reprezentáciu

CSV, JSON a HTML export používajú vlastné escaping pravidlá. Export plain textu nesmie náhodne prenášať HTML entities a HTML export nesmie raw vložiť neznámu hodnotu.

Consumer contract uvádza charset, typ poľa a či markup už prešiel sanitizerom.

Každá reprezentácia má jedného vlastníka

Systém rozlišuje plain Unicode, sanitized HTML, URL a serialized data. Každý typ má producenta, storage formu, validáciu a output encoder.

Encoding a decoding sú boundary operácie, nie všeobecné čistenie. Jasná zmluva odstráni artefakty, zlepší search a chráni hranicu medzi dátami a kódom.

Taká zmluva sa kontroluje automatickým round-trip testom.

Observability má merať chyby bez kopírovania obsahu

Metrika môže sledovať počet decode failures, invalid UTF-8, sanitizer removals a double-encoding heuristics podľa source systému. Celý používateľský text nepatrí do labelu ani bežného logu. Request ID a record ID umožnia kontrolovaný dohľad.

Náhly nárast odstránených atribútov môže znamenať útok, zmenu externého feedu alebo chybný editor rollout. Dashboard pomôže problém odhaliť skôr, než sa poškodená reprezentácia prepíše do ďalších exportov.

Oprava legacy dát musí byť idempotentná

Migračná transformácia sa môže prerušiť a spustiť znovu. Musí vedieť rozpoznať už spracovanú verziu bez ďalšieho decode. Každý záznam môže niesť migration marker a pôvodnú bezpečnú zálohu.

Dry run spočíta zmeny a ukáže anonymizované vzorky. Po nasadení sa porovná rendered výsledok, search index a export. Rollback nesmie obnoviť zraniteľný raw obsah do verejnej stránky.

Editor a renderer musia zdieľať rovnaký kontrakt

WYSIWYG editor môže generovať tagy, ktoré serverový sanitizer odstráni. Používateľ potom po uložení vidí inú podobu. Podporovaný allowlist sa má premietnuť do toolbaru a preview používa rovnakú serverovú policy.

Klientsky sanitizer môže zlepšiť UX, no server zostáva autoritatívny. Starší alebo upravený klient nesmie obísť kontrolu. Rozdiel verzií sa sleduje podobne ako API schema.

Plain-text derivácia tiež potrebuje pravidlá

Pri konverzii HTML na text pre search, e-mail alebo preview nestačí odstrániť všetky tagy regexom. Odstavce potrebujú medzery, obrázky alternatívny text a skryté či script elementy sa nesmú dostať do výstupu.

DOM-based converter s definovanou policy vytvorí stabilnejší výsledok. Derived text sa môže znovu vygenerovať po zmene pravidiel, preto jeho verzia nemá byť jediným zdrojom obsahu.