UTF-7

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 10. září 2017; kontroly vyžadují 24 úprav .

UTF-7 (z anglického 7-bit Unicode Transformation Format  - “Unicode transformační formát, 7 bitů”) Formát kódování textu Unicode s proměnnou délkou znakových slov do sekvence znaků ASCII. Původně zamýšlel kódovat text Unicode v internetových e-mailových zprávách, což bylo efektivnější než kombinace UTF-8 s uvozovkami-tisknutelnými.

Aplikace

Současný standard e-mailového formátu MIME zakazuje kódování záhlaví pomocí bajtových hodnot nad rozsahem ASCII. Přestože MIME umožňuje kódování těla zprávy do různých znakových sad (širších než ASCII), základní přenosová infrastruktura (SMTP, hlavní standard pro přenos e-mailů) stále nezaručuje 8bitovou čistotu. Proto je v případě pochybností nutné použít netriviální kódování přenášeného obsahu. Bohužel Base64 má tu nevýhodu, že ani znaky US-ASCII nejsou čitelné pro klienty, kteří nejsou MIME. Na druhou stranu je UTF-8 v kombinaci s uvozovkami-tisknutelnými formáty velmi neefektivní, vyžadující 6-9 bajtů pro ne-ASCII znaky z BMP (Basic Multilingual Plane) a 12 bajtů pro ne-BMP znaky.

Pokud jsou během kódování dodržena určitá pravidla, lze text v kódování UTF-7 odeslat e-mailem bez použití základního kódování přenosu MIME, ale musí být výslovně označen jako textová znaková sada. Také, pokud jsou použity v hlavičkách e-mailů, jako je "Předmět:", musí být UTF-7 obsaženo ve slovech kódovaných MIME, která identifikují znakovou sadu. Protože kódovaná slova používají buď sady pro tisk v uvozovkách nebo Base64, bylo UTF-7 navrženo s možností nepoužívat znak rovná se = jako znak escape, aby se zabránilo dvojitému přeskočení v kombinaci s uvozovkami-tisknutelnými (nebo její variantou v RFC ). 2047 /1522 ?Q?-kódování záhlaví).

UTF-7 se v aplikacích zpravidla nepoužívá ve své nativní podobě, protože je velmi nepohodlné pro zpracování. Ačkoli UTF-7 má přednost před kombinacemi UTF-8 s uvozovkami pro tisk nebo Base64, dnes již neexistující Internet Mail Consortium nedoporučuje používat kódování UTF-7. [jeden]

8BITMIME byl také představen, aby se snížila potřeba kódování těla zpráv v 7bitovém formátu.

Upravenou formu UTF-7 (mUTF-7, UTF-7 IMAP) v současnosti používá e-mailový protokol IMAP pro vyhledávání názvů poštovních schránek [2] .

Popis

UTF-7 byl původně navržen jako experimentální protokol v RFC 1642 „A Mail-Safe Transformation Format of Unicode“. Tento RFC je zastaralý z RFC 2152 , informačního RFC, který nikdy nebyl standardem. Jak je uvedeno v RFC 2152 , "RFC nedefinuje internetový standard žádného typu." Bez ohledu na to je RFC 2152 citován jako definice UTF-7 v seznamu kódování IANA. UTF-7 také není standard Unicode. Unicode Standard 5.0 uvádí pouze UTF-8, UTF-16 a UTF-32. Existuje také upravená verze, specifikovaná v RFC 2060 , která je někdy identifikována jako UTF-7.

Některé znaky mohou být reprezentovány přímo jako jednotlivé ASCII bajty. Tvoří skupinu tzv. "přímých znaků" 52 latinských písmen, 10 číslic a 9 interpunkčních znaků: ' ( ) , - . / : ?. Přímé znaky jsou bezpečné, když jsou zobrazeny doslova. Druhá hlavní skupina, známá jako "volitelné přímé znaky", obsahuje všechny ostatní tisknutelné znaky v rozsahu U+0020—U+007Ekromě ~ \ +mezery. Použití volitelných dopředných znaků zmenšuje velikost a zlepšuje čitelnost, ale také zvyšuje pravděpodobnost, že informace budou poškozeny faktory, jako jsou špatně navržené poštovní brány, a může vyžadovat další escapování při použití volitelných dopředných znaků v kódovaných slovech pro pole záhlaví.

Mezera, tabulátor, návrat vozíku a posun řádku mohou být také reprezentovány přímo jako jednotlivé bajty ASCII. Pokud však má být v e-mailu použit kódovaný text, je třeba dbát na to, aby tyto znaky nevyžadovaly dodatečné kódování přenášeného obsahu vhodného pro e-mail. Znaménko plus +lze zakódovat jako +-.

Ostatní znaky musí být nejprve zakódovány v UTF-16 (znaky s kódy od U+10000a výše budou zakódovány v zástupných kódech) big-endian (vysoké bity na konci) a poté upraveny na kódy Base64. Začátek takových bloků znaků kódovaných v UTF-16 a upravených v Base64 je označen +. Konec bloků je označen libovolným znakem, který není součástí sady modifikátorů Base64. Pokud je znak po úpravě na Base64  -(pomlčka-minus ASCII), pak je dekodérem přeskočen a dekódování pokračuje dalším znakem. Jinak se dekódování obnoví znakem po Base64.

8BITMIME byl také představen, aby se snížila potřeba kódování těla zpráv v 7bitovém formátu.


Příklady

Hexadecimální

kód

0 0 A 3  
binární kód 0 0 0 0 0 0 0 0 jeden 0 jeden 0 0 0 jeden jeden 0 0
Indexy 0 deset 12
Base64 kód A K M

Algoritmus kódování a dekódování

Kódování

Nejprve musí kodér určit, které znaky mohou být reprezentovány přímo ve formátu ASCII, kromě znaménka plus +, které je zakódováno jako +-, a které znaky je třeba označit jako bloky znaků Unicode. Jednoduchý kodér může přímo zakódovat všechny znaky, které považuje za bezpečné pro přímé kódování. Je však dobré ukončit sekvenci Unicode jedním znakem přímo v ASCII a poté začít další sekvenci Unicode obsahující 3 až 3⅔ bajtů. To je více než 2⅔ bajtů potřebné k reprezentaci znaku jako součásti sekvence Unicode.

Každá sekvence znaků Unicode musí být zakódována pomocí následujícího postupu a poté ohraničena příslušnými oddělovači. Například použijeme posloupnost symbolů £† ( U+00A3 U+2020):

  1. Převod znaků Unicode (UTF-16) z hexadecimálního formátu do binárního formátu:

    0x00A3 → 0000 0000 1010 0011

    0x2020 → 0010 0000 0010 0000
  2. Kombinujeme binární sekvence:
    0000 0000 1010 0011 a 0010 0000 0010 0000 → 0000 0000 1010 0011 0010 0000 0010 0000
  3. Přeskupte binární kód do bloků po šesti bitech, počínaje zleva:
  4. Pokud má poslední blok méně než šest bitů, vyplňte jej nulami, dokud nezískáte požadovanou délku :
  5. Každý blok šesti bitů nahradíme odpovídajícím kódem Base64:
    000000 001010 001100 100000 001000 000000 → AKMgIA

Dekódování

Nejprve musí být zakódovaná data rozdělena na prosté části textu ASCII (včetně znamének plus následovaných pomlčkou +-) a neprázdných bloků Unicode, jak je uvedeno v části popisu. Jakmile to uděláte, každý blok Unicode musí být dekódován následujícím postupem (s použitím výsledku výše uvedeného příkladu kódování):

  1. Převeďte každý znak kódu Base64 na bitovou sekvenci, kterou představuje:
    AKMgIA → 000000 001010 001100 100000 001000 000000
  2. Přeskupte binární kód do skupin po 16 bitech, počínaje zleva:
    000000 001010 001100 100000 001000 000000 → 0000000010100011 001000000001000
  3. Pokud je na konci neúplná skupina obsahující pouze nuly, zahoďte ji (pokud neúplná skupina obsahuje libovolný počet jedniček, kód je neplatný):
    0000000010100011 0010000000100000
  4. Každá skupina 16 bitů je znakové číslo Unicode (UTF-16) a může být vyjádřeno v jiných formách:
    0000 0000 1010 0011 ≡ 0x00A3 ≡ 163 10

Unicode marker

Značka Unicode (často označovaná jako "BOM" - značka pořadí bajtů) je volitelná speciální sekvence bajtů na samém začátku toku nebo souboru, která, i když sama o sobě není daty, určuje kódování použité pro následující data; značka se používá, když neexistují žádná metadata označující kódování. Pro dané schéma kódování je podpis reprezentací schématu v bodě kódu Unicode U+FEFF, tzv. znak kusovníku.

Zatímco značka Unicode je obecně jediná pevná sekvence bajtů, specifičnost UTF-7 zavádí 5 variant: poslední 2 bity 4. bajtu kódování UTF-7 U+FEFFodkazují na další znak, což vede ke 4 možným bitovým vzorům, a tedy , 4 různé možné bajty na 4. pozici. Pátá varianta je potřebná k vyjasnění případu, kdy za značkou nenásledují vůbec žádné znaky. Viz Určení kódování podle značky bajtové sekvence .

Zabezpečení

UTF-7 umožňuje více reprezentací stejného zdrojového řetězce. Zejména znaky ASCII mohou být reprezentovány jako součást bloků Unicode. Pokud se tedy pro řetězce, které mohou být později interpretovány jako UTF-7, používají standardní escapovací nebo ověřovací algoritmy založené na ASCII, pak lze bloky Unicode použít k vložení škodlivých řetězců, které volně procházejí validací. K vyřešení tohoto problému by ověřovací systémy měly provést dekódování před ověřením a neměly by se pokoušet automaticky detekovat UTF-7.

Starší verze Internet Exploreru lze oklamat, aby stránku interpretovaly jako UTF-7. To lze použít k útoku na skriptování napříč weby, protože servisní znaky <a >mohou být kódovány jako +ADw-v +AD4-UTF-7, které většina validátorů předává jako prostý text.

Odkazy


Poznámky

  1. Internet Mail Consortium, Using International Characters in Internet Mail Archivováno 7. září 2015 na Wayback Machine , 1. srpna 1998, staženo 8. ledna 2009
  2. RFC 3501 sekce 5.1.3