Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 3440|Odpověď: 1

[Zdroj] Chyby dekódování Base64 existují ve všech verzích .NET

[Kopírovat odkaz]
Zveřejněno 31.07.2023 18:36:01 | | | |
Jedno slunečné ráno jsem seděl před notebookem a přestavoval nějaký C# kód. Všechno jde dobře a bude to produktivní den. Pak jsem přidal příliš mnoho rovných znamének ke konstantnímu řetězci doslovnému a věci explodovaly. Produktivita je pryč. Nedělní klidná rekonstrukce je za námi. Dokonce i slunce se rozhodlo schovat za mraky.

Po 30 až 40 minutách snažení se přijít na to, co dělám špatně, jsem si uvědomil, že to nejsem já. Je to Microsoft. Zřejmě jsem narazil na starou chybu v dekódovací funkci Base64.Convert.FromBase64StringTento bug tu rozhodně je už od uvedení .NET 1.1 v roce 2003. Páni! To je staré. A není to moc těžké reprodukovat. Dobrá práce:

Technicky vzato je to nelegální Base64. Právní verze je "abc=". Všimněte si, že pouze jeden výplňový znak =. Kódování Base64 reprezentuje každých 6 bitů binárního vstupu v jednom ASCII znaku. To znamená, že každé 4 znaky v řetězci kódovaném v Base64 představují 3 bajty. Pokud zakódovaná data nejsou násobkem 3 bajtů, přidá Base64 enkodér výplňový znak, aby Base64 byl násobkem 4 znaků. Tím vygeneruje Base64 řetězec, který je správně vyplněn "abc=". Přidání dalšího = ji zneplatní.

Base64 "abc=" je dekódováno jako dva bajty [105, 183]. Přesně tak. Přidání dalšího vyplňovacího znaku na konec by nemělo skutečně změnit zakódovanou hodnotu. Je to jako přidat mezeru na konec věty. Ano, je tam, ale nemění to význam věty. Ale .NET si to nemyslí. "abc==" je dekódováno jako bajt [109]. Nejenže se zkrátil, což bylo zvláštní, protože jsme vstup prodloužili. Také se to změnilo. První bajt se změní ze 105 na 109. A nepřinesl výjimku. Přidejte další = a dostanete výjimku. Úžasný!

Kód:

Výstup:

'abc=' -> [105, 183]
'abc==' -> [109]
Je opravdu úžasné, že si toho nikdo tolik let nevšiml. Nebo byla nalezena, ale neopravená. Base64 je velmi důležitý při výměně informací v síti. Je vidět všude. Nicméně .NET se už roky nezbavil vadného dekodéru Base64.

Nejdřív jsem tomu nemohl uvěřit a začal jsem to zkoumat. Chvíli jsem googlil a moc jsem toho nenašel. Pak jsem napsal na StackOverflow a moc štěstí jsem neměl. Jakmile jsem pochopil, co se děje, musel jsem si dokonce odpovídat na vlastní otázky. Po nějakém hledání na GitHubu jsem narazil na opravu vytvořenou v .NET Core v červenci 2018. Takže nejnovější verze .NET Core tento problém řeší správně a přidává výjimku:

Neupravená výjimka: System.FormatVýjimka: Vstup není platný řetězec Base-64, protože obsahuje ne-base 64 znak, více než dva vycpávací znaky nebo nelegální znak mezi Vycpávkové postavy.
   at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
   at System.Convert.FromBase64String(String s)
   na Program.DecodeAndPrint (String base64) v ./base64/Program.cs:řádek 13
   at Program.Main() v ./base64/Program.cs:line 8
Trvalo jim asi 15 let, než problém našli a opravili. Zajímavé je, že se to nikdo konkrétně nesnažil opravit. Stalo se to, když kód přepsali tak, aby byl rychlejší:

Convert.FromBase64() má jemnou chybu, kdy druhý nelegálně vycpávaný znak na konci řetězce způsobí, že dekódování "uspěje" odstraněním předposledního znaku.

Jsme na . Tato chyba byla nechtěně opravena při optimalizaci API v NetCore 2.1. Přidávat testy pro zaznamenávání chyb a zajistit, abychom nešli zpět.
Tento problém je tedy v .NET Core 2.2 vyřešen. Ale v aktuální nejnovější verzi .NET Frameworku 4.7.2 se stále vyskytují problémy. Vypadá to, že je to rozbité i v monografii.

Řešením v .NET 4.7.2 je doplnit nesprávně vyplněný řetězec něčím takovýmto:

Původní:Přihlášení k hypertextovému odkazu je viditelné.





Předchozí:Azure DevOps (viii) Compiles ASP.NET MVC projekty pomocí Pipelines Build
Další:Používá se nový časovač v .NET 6, PeriodicTimer,
 Pronajímatel| Zveřejněno 31.07.2023 18:39:50 |



Base64 kódovaná skládka řetězců (jaké znaky jsou v Base64)
https://www.itsvse.com/thread-10629-1-1.html


Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com