Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 3440|Odpoveď: 1

[Zdroj] Chyby dekódovania Base64 existujú vo všetkých verziách .NET

[Kopírovať odkaz]
Zverejnené 31. 7. 2023 18:36:01 | | | |
Jedno slnečné ráno som sedel pred notebookom a prepracovával nejaký C# kód. Všetko ide dobre a bude to produktívny deň. Potom som pridal príliš veľa rovných znamienok k konštantnému reťazcu literálu a veci explodovali. Produktivita je preč. Nedeľná pokojná rekonštrukcia je za nami. Dokonca aj slnko sa rozhodlo schovať za oblaky.

Po 30 až 40 minútach snaženia sa zistiť, čo robím zle, som si uvedomil, že to nie som ja. Je to Microsoft. Zrejme som narazil na starú chybu v dekódovacej funkcii Base64.Convert.FromBase64StringTáto chyba tu určite bola už od zavedenia .NET 1.1 v roku 2003. Wow! To je staré. A nie je veľmi ťažké ho reprodukovať. Dobrá práca:

Technicky vzaté, toto je nelegálny Base64. Právna verzia je "abc=". Všimnite si, že len jeden výplňový znak =. Base64 kódovanie reprezentuje každých 6 bitov binárneho vstupu v jednom ASCII znaku. To znamená, že každé 4 znaky v reťazci kódovanom v Base64 predstavujú 3 bajty. Keď zakódované dáta nie sú násobkom 3 bajtov, kódovač Base64 pridáva výplňový znak, čím sa Base64 stane násobkom 4 znakov. Tým sa vygeneruje Base64 reťazec, ktorý je správne vyplnený "abc=". Pridaním ďalšieho = sa zneplatní.

Base64 "abc=" sa dekóduje ako dva bajty [105, 183]. Presne tak. Pridanie ďalšieho vyplňovacieho znaku na konci by nemalo meniť zakódovanú hodnotu. Je to ako pridať medzeru na koniec vety. Áno, je tam, ale nemení to význam vety. Ale .NET si to nemyslí. "abc==" sa dekóduje ako bajt [109]. Nielenže sa to skrátilo, čo bolo zvláštne, pretože sme vstup predĺžili. Stalo sa to aj iným. Prvý bajt ide z 105 na 109. A ani to neprinieslo výnimku. Pridajte ďalší = a dostanete výnimku. Úžasný!

Kód:

Výstup:

'abc=' -> [105, 183]
'abc==' -> [109]
Je naozaj úžasné, že si to nikto nevšimol už toľko rokov. Alebo to bolo nájdené, ale neopravené. Base64 je veľmi dôležitý pri výmene informácií v sieti. Dá sa vidieť všade. Avšak .NET sa už roky nezbavil chybného dekodéra Base64.

Najprv som tomu nemohol uveriť a začal som to skúmať. Chvíľu som googlil, ale veľa som nenašiel. Potom som napísal na StackOverflow a tiež som nemal veľa šťastia. Keď som pochopil, čo sa deje, musel som si dokonca odpovedať na vlastné otázky. Po chvíli hľadania na GitHube som narazil na opravu vytvorenú v .NET Core v júli 2018. Takže najnovšia verzia .NET Core tento problém rieši správne a vyhodí výnimku:

Nespracovaná výnimka: System.FormatVýnimka: Vstup nie je platný reťazec Base-64, pretože obsahuje ne-základný znak 64, viac ako dva vyplňovacie znaky alebo nelegálny znak medzi Vycpávajúce postavy.
   at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
   at System.Convert.FromBase64String(String s)
   at Program.DecodeAndPrint (String base64) v ./base64/Program.cs:riadok 13
   at Program.Main() v ./base64/Program.cs:line 8
Trvalo im asi 15 rokov, kým problém našli a opravili. Zaujímavé je, že sa to nikto konkrétne nesnažil opraviť. Stalo sa to, keď prepísali kód, aby bol rýchlejší:

Convert.FromBase64() má jemnú chybu, kde druhý nelegálne vytlačený znak na konci reťazca spôsobí, že dekódovanie "uspeje" odstránením predposledného znaku.

Sme na . Táto chyba bola neúmyselne opravená, keď bolo API optimalizované v NetCore 2.1. Pridávajte testy na zaznamenávanie chýb a uistite sa, že nepôjdeme späť.
Tento problém je vyriešený v .NET Core 2.2. Ale v aktuálnej najnovšej verzii .NET Frameworku 4.7.2 sa stále vyskytujú problémy. Vyzerá to, že je to pokazené aj v Mono.

Obchádzka v .NET 4.7.2 je doplniť nesprávne vyplnený reťazec niečím takýmto:

Originál:Prihlásenie na hypertextový odkaz je viditeľné.





Predchádzajúci:Azure DevOps (viii) Compiles ASP.NET MVC projektov pomocou Pipelines Build
Budúci:Používa sa nový časovač v .NET 6, PeriodicTimer,
 Prenajímateľ| Zverejnené 31. 7. 2023 18:39:50 |



Kódovaná skladba reťazcov v Base64 (aké znaky sú v Base64)
https://www.itsvse.com/thread-10629-1-1.html


Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com