Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 3440|Svar: 1

[Källa] Base64-avkodningsfel finns i alla versioner av .NET

[Kopiera länk]
Publicerad på 2023-07-31 18:36:01 | | | |
En solig morgon satt jag framför min laptop och omstrukturerade lite C#-kod. Allt går bra och det kommer att bli en produktiv dag. Sedan lade jag till för många likhetstecken till den konstanta strängbokstaven, och allt exploderade. Produktiviteten är borta. Söndagens lugna återuppbyggnad är bakom oss. Till och med solen bestämde sig för att gömma sig bakom molnen.

Efter att ha tillbringat 30 till 40 minuter med att försöka lista ut vad jag gjorde fel insåg jag att det inte var jag. Det är Microsoft. Tydligen snubblade jag över en gammal bugg i Base64:s avkodningsfunktion.Konvertera.FrånBase64StringDen här buggen har definitivt funnits sedan .NET 1.1 introducerades 2003. Oj! Det är gammalt. Och det är inte särskilt svårt att reproducera. Bra jobbat:

Tekniskt sett är detta olaglig Base64. Den juridiska versionen är "abc=". Observera att endast ett utfyllnadstecken =. Base64-kodning representerar var 6:e bitar av binär indata i ett ASCII-tecken. Detta innebär att varje 4:e tecken i en Base64-kodad sträng motsvarar 3 byte. När den kodade datan inte är en multipel av 3 byte lägger Base64-kodaren till ett fyllnadstecken för att göra Base64 till en multipel av 4 tecken. Detta kommer att generera en Base64-sträng som är korrekt fylld med "abc=". Att lägga till en till = kommer att ogiltigförklara den.

Base64 "abc=" avkodas som två byte [105, 183]. Det stämmer. Att lägga till ett extra utfyllningstecken i slutet bör egentligen inte ändra det kodade värdet. Det är som att lägga till ett mellanslag i slutet av en mening. Ja, den finns där, men den förändrar inte meningens betydelse. Men .NET tycker inte det. "abc==" avkodas som en byte [109]. Inte nog med att den blev kortare, vilket var konstigt eftersom vi gjorde inmatningen längre. Det har också blivit annorlunda. Den första byten går från 105 till 109. Och det gav inget undantag heller. Lägg till en till = och du får ett undantag. Häpnadsväckande!

Kod:

Utdata:

'abc=' -> [105, 183]
'abc==' -> [109]
Det är verkligen fantastiskt att ingen har märkt detta på så många år. Eller så hittades den men blev inte lagad. Base64 är mycket viktig för informationsutbytet på nätverket. Den kan ses överallt. Men .NET har inte gjort sig av med den bristfälliga Base64-avkodaren på flera år.

Först kunde jag inte tro det och började undersöka. Jag googlade ett tag och hittade inte mycket. Sedan postade jag på StackOverflow och hade inte mycket tur heller. När jag väl förstod vad som pågick var jag till och med tvungen att svara på mina egna frågor. Efter att ha letat på GitHub ett tag snubblade jag över en lösning gjord i .NET Core i juli 2018. Så den senaste .NET Core-versionen hanterar detta problem korrekt och ger ett undantag:

Ohanterad undantag: System.FormatException: Indata är inte en giltig Base-64-sträng eftersom den innehåller ett icke-bas 64-tecken, fler än två utfyllnadstecken eller ett olagligt tecken bland Att fylla ut karaktärer.
   vid System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
   på System.Convert.FromBase64String(String s)
   på Program.DecodeAndPrint (Sträng base64) i ./base64/Program.cs:rad 13
   på Program.Main() i ./base64/Program.cs:rad 8
Det tog dem ungefär 15 år att hitta och åtgärda problemet. Intressant nog försökte ingen riktigt fixa det specifikt. Detta hände när de skrev om koden för att göra den snabbare:

Convert.FromBase64() har en subtil bugg där det andra olagligt vadderade tecknet i slutet av strängen gör att avkodningen "lyckas" genom att ta bort näst sista tecknet.

Vi är på . Denna bugg åtgärdades oavsiktligt när API:et optimerades i NetCore 2.1. Lägg till tester för att logga fel och se till att vi inte går bakåt.
Så detta problem är löst i .NET Core 2.2. Men i den senaste versionen av .NET Framework 4.7.2 finns det fortfarande problem. Det verkar som att det är trasigt i Mono också.

Lösningen i .NET 4.7.2 är att fylla på den felaktigt fyllda strängen med något i stil med detta:

Original:Inloggningen med hyperlänken är synlig.





Föregående:Azure DevOps (viii) Kompilerar ASP.NET MVC-projekt med Pipelines Build
Nästa:En ny timer i .NET 6, PeriodicTimer, används
 Hyresvärd| Publicerad på 2023-07-31 18:39:50 |



Base64-kodad strängkomposition (vilka tecken som finns i Base64)
https://www.itsvse.com/thread-10629-1-1.html


Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com