Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La codifica UTF-7 non è più in uso tra le applicazioni e molte specifiche ora vietano l'uso nell'interscambio . Viene usato anche occasionalmente come vettore di attacco nelle applicazioni che non prevedono l'incontro con dati con codifica UTF-7. Microsoft avvisa l'uso di System.Text.UTF7Encoding perché non fornisce il rilevamento degli errori.
Di conseguenza, le Encoding.UTF7 proprietà e i UTF7Encoding costruttori sono ora obsoleti. Inoltre, Encoding.GetEncoding e Encoding.GetEncodings non consentono più di specificare UTF-7
.
Descrizione delle modifiche
In precedenza, è possibile creare un'istanza della codifica UTF-7 usando le Encoding.GetEncoding API. Per esempio:
Encoding enc1 = Encoding.GetEncoding("utf-7"); // By name.
Encoding enc2 = Encoding.GetEncoding(65000); // By code page.
Inoltre, un'istanza che rappresenta la codifica UTF-7 è stata enumerata dal Encoding.GetEncodings() metodo , che enumera tutte le Encoding istanze registrate nel sistema.
A partire da .NET 5, le proprietà Encoding.UTF7 e i costruttori UTF7Encoding sono obsoleti e generano un avviso SYSLIB0001
. Tuttavia, per ridurre il numero di avvisi ricevuti dai chiamanti quando si usa la UTF7Encoding classe , il UTF7Encoding tipo stesso non è contrassegnato come obsoleto.
// The next line generates warning SYSLIB0001.
UTF7Encoding enc = new UTF7Encoding();
// The next line does not generate a warning.
byte[] bytes = enc.GetBytes("Hello world!");
Inoltre, i Encoding.GetEncoding metodi considerano il nome utf-7
di codifica e la pagina codice 65000
come unknown
. Trattare la codifica come unknown
fa sì che il metodo lanci un'eccezione ArgumentException.
// Throws ArgumentException, same as calling Encoding.GetEncoding("unknown").
Encoding enc = Encoding.GetEncoding("utf-7");
Infine, il Encoding.GetEncodings() metodo non include la codifica UTF-7 nella EncodingInfo matrice restituita. La codifica viene esclusa perché non può essere istanziata.
foreach (EncodingInfo encInfo in Encoding.GetEncodings())
{
// The next line would throw if GetEncodings included UTF-7.
Encoding enc = Encoding.GetEncoding(encInfo.Name);
}
Motivo della modifica
Molte applicazioni chiamano Encoding.GetEncoding("encoding-name")
con un valore di nome di codifica fornito da un'origine non attendibile. Ad esempio, un client Web o un server potrebbe accettare la charset
parte dell'intestazione Content-Type
e passare il valore direttamente a Encoding.GetEncoding
senza convalidarlo. Ciò potrebbe consentire a un endpoint dannoso di specificare Content-Type: ...; charset=utf-7
, che potrebbe causare un comportamento errato dell'applicazione ricevente.
Inoltre, la disabilitazione dei percorsi di codice UTF-7 consente di ottimizzare i compilatori, ad esempio quelli usati da Blazor, per rimuovere completamente questi percorsi di codice dall'applicazione risultante. Di conseguenza, le applicazioni compilate vengono eseguite in modo più efficiente e richiedono meno spazio su disco.
Versione introdotta
5.0
Azione consigliata
Nella maggior parte dei casi, non è necessario eseguire alcuna azione. Tuttavia, per le app che hanno attivato in precedenza percorsi di codice correlati a UTF-7, prendere in considerazione le indicazioni seguenti.
Se l'app chiama Encoding.GetEncoding con nomi di codifica sconosciuti forniti da un'origine non attendibile:
Confronta invece i nomi di codifica con un elenco di elementi consentiti configurabile. La lista di permessi configurabile deve includere almeno lo standard di settore "utf-8". A seconda dei client e dei requisiti normativi, potrebbe anche essere necessario consentire codifiche specifiche dell'area, ad esempio "GB18030".
Se non si implementa un elenco di elementi consentiti, Encoding.GetEncoding restituirà tutti gli Encoding elementi incorporati nel sistema o registrati tramite un oggetto personalizzato EncodingProvider. Controllare i requisiti del servizio per verificare che si tratta del comportamento desiderato. UTF-7 continua a essere disabilitato per impostazione predefinita, a meno che l'applicazione non riabiliti l'opzione di compatibilità indicata più avanti in questo articolo.
Se si usa Encoding.UTF7 o UTF7Encoding all'interno del proprio protocollo o formato di file:
Passare all'uso di Encoding.UTF8 o UTF8Encoding. UTF-8 è uno standard di settore ed è ampiamente supportato in linguaggi, sistemi operativi e runtime. L'uso di UTF-8 semplifica la manutenzione futura del codice e lo rende più interoperabile con il resto dell'ecosistema.
Se stai confrontando un'istanza Encoding con Encoding.UTF7:
Prendere in considerazione, invece, l'effettuazione di un controllo sulla nota tabella codici UTF-7, ovvero
65000
. Confrontando la tabella dei codici, si evita l'avviso e si gestiscono anche alcuni casi limite, come se qualcuno avesse invocatonew UTF7Encoding()
o sottoclassato il tipo.void DoSomething(Encoding enc) { // Don't perform the check this way. // It produces a warning and misses some edge cases. if (enc == Encoding.UTF7) { // Encoding is UTF-7. } // Instead, perform the check this way. if (enc != null && enc.CodePage == 65000) { // Encoding is UTF-7. } }
Se è necessario usare Encoding.UTF7 o UTF7Encoding:
È possibile eliminare l'avviso
SYSLIB0001
nel codice o all'interno del file con estensione csproj del progetto.#pragma warning disable SYSLIB0001 // Disable the warning. Encoding enc = Encoding.UTF7; #pragma warning restore SYSLIB0001 // Re-enable the warning.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- NoWarn below suppresses SYSLIB0001 project-wide --> <NoWarn>$(NoWarn);SYSLIB0001</NoWarn> </PropertyGroup> </Project>
Annotazioni
La soppressione di
SYSLIB0001
disabilita solo gli avvisi di Encoding.UTF7 e UTF7Encoding obsolescenza. Non disabilita altri avvisi o modifica il comportamento delle API come Encoding.GetEncoding.Se è necessario supportare
Encoding.GetEncoding("utf-7", ...)
:È possibile riabilitare il supporto per questo tramite un commutatore di compatibilità. Questa opzione di compatibilità può essere specificata nel file con estensione csproj dell'applicazione o in un file di configurazione di runtime, come illustrato negli esempi seguenti.
Nel file csproj dell'applicazione:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- Re-enable support for UTF-7 --> <EnableUnsafeUTF7Encoding>true</EnableUnsafeUTF7Encoding> </PropertyGroup> </Project>
Nel file runtimeconfig.template.json dell'applicazione:
{ "configProperties": { "System.Text.Encoding.EnableUnsafeUTF7Encoding": true } }
Suggerimento
Se si riabilita il supporto per UTF-7, è necessario eseguire una verifica della sicurezza del codice che chiama Encoding.GetEncoding.
Le API interessate
- System.Text.Encoding.UTF7
- UTF7Encoding()
- UTF7Encoding(Boolean)
- System.Text.Encoding.GetEncoding(Int32)
- System.Text.Encoding.GetEncoding(String)
- System.Text.Encoding.GetEncoding(Int32, EncoderFallback, DecoderFallback)
- System.Text.Encoding.GetEncoding(String, EncoderFallback, DecoderFallback)
- System.Text.Encoding.GetEncodings()