Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La codificación UTF-7 ya no está en uso amplio entre las aplicaciones y muchas especificaciones ahora prohíben su uso en el intercambio. También se usa ocasionalmente como vector de ataque en aplicaciones que no prevén encontrar datos con codificación UTF-7. Microsoft advierte contra el uso de System.Text.UTF7Encoding porque no proporciona detección de errores.
Por consiguiente, la propiedad Encoding.UTF7 y los constructores de UTF7Encoding ahora están obsoletos. Además, Encoding.GetEncoding y Encoding.GetEncodings ya no le permiten especificar UTF-7
.
Descripción del cambio
Anteriormente, podría crear una instancia de la codificación UTF-7 mediante las Encoding.GetEncoding API. Por ejemplo:
Encoding enc1 = Encoding.GetEncoding("utf-7"); // By name.
Encoding enc2 = Encoding.GetEncoding(65000); // By code page.
Además, una instancia que representa la codificación UTF-7 fue enumerada por el método Encoding.GetEncodings(), que enumera todas las instancias Encoding registradas en el sistema.
A partir de .NET 5, las Encoding.UTF7 propiedades y los UTF7Encoding constructores están obsoletos y generan una advertencia SYSLIB0001
. Sin embargo, para reducir el número de advertencias que reciben los llamadores al usar la clase UTF7Encoding, el tipo UTF7Encoding en sí mismo no está marcado como 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!");
Además, los Encoding.GetEncoding métodos tratan el nombre utf-7
de codificación y la página de códigos 65000
como unknown
. Al tratar la codificación como unknown
, el método arroja una excepción ArgumentException.
// Throws ArgumentException, same as calling Encoding.GetEncoding("unknown").
Encoding enc = Encoding.GetEncoding("utf-7");
Por último, el Encoding.GetEncodings() método no incluye la codificación UTF-7 en la EncodingInfo matriz que devuelve. La codificación se excluye porque no se puede instanciar.
foreach (EncodingInfo encInfo in Encoding.GetEncodings())
{
// The next line would throw if GetEncodings included UTF-7.
Encoding enc = Encoding.GetEncoding(encInfo.Name);
}
Motivo del cambio
Muchas aplicaciones llaman a Encoding.GetEncoding("encoding-name")
con un valor de nombre de codificación proporcionado por un origen que no es de confianza. Por ejemplo, un cliente web o servidor podría tomar la charset
parte del Content-Type
encabezado y pasar el valor directamente a Encoding.GetEncoding
sin validarlo. Esto podría permitir que un punto de conexión malintencionado especifique Content-Type: ...; charset=utf-7
, lo que podría hacer que la aplicación receptora se comporte mal.
Además, deshabilitar las rutas de acceso de código UTF-7 permite optimizar compiladores, como los usados por Blazor, para quitar estas rutas de acceso de código por completo de la aplicación resultante. Como resultado, las aplicaciones compiladas se ejecutan de forma más eficaz y toman menos espacio en disco.
Versión introducida
5.0
Acción recomendada
En la mayoría de los casos, no es necesario realizar ninguna acción. Sin embargo, en el caso de las aplicaciones que han activado previamente rutas de acceso al código relacionadas con UTF-7, tenga en cuenta las instrucciones siguientes.
Si la aplicación llama a Encoding.GetEncoding con nombres de codificación desconocidos proporcionados por un origen que no es de confianza:
En su lugar, compare los nombres de codificación con una lista de autorizaciones configurable. La lista de aceptación configurable debe incluir al menos el estándar del sector "utf-8". En función de los clientes y los requisitos normativos, es posible que también tenga que permitir codificaciones específicas de la región, como "GB18030".
Si no implementa una lista de permitidos, Encoding.GetEncoding devolverá cualquier Encoding que esté integrado en el sistema o que esté registrado a través de un EncodingProvider personalizado. Audite los requisitos del servicio para validar que este es el comportamiento deseado. UTF-7 sigue deshabilitado de forma predeterminada a menos que la aplicación vuelva a habilitar el modificador de compatibilidad mencionado más adelante en este artículo.
Si usa Encoding.UTF7 o UTF7Encoding dentro de su propio protocolo o formato de archivo:
Cambie a mediante Encoding.UTF8 o UTF8Encoding. UTF-8 es un estándar del sector y es ampliamente compatible entre lenguajes, sistemas operativos y entornos de ejecución. El uso de UTF-8 facilita el mantenimiento futuro del código y hace que sea más interoperable con el resto del ecosistema.
Si estás comparando una Encoding instancia con Encoding.UTF7:
Considere mejor la posibilidad de realizar una comprobación con la página de códigos UTF-7 conocidos, que es
65000
. De esta manera, evita la advertencia y también se controlan algunos casos extremos, como, por ejemplo, si alguien llamó anew UTF7Encoding()
o incluyó el tipo en una subclase.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. } }
Si debe usar Encoding.UTF7 o UTF7Encoding:
Puede suprimir la
SYSLIB0001
advertencia en el código o en el archivo .csproj del proyecto.#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>
Nota:
SYSLIB0001
La supresión solo deshabilita las advertencias de obsolescencia de Encoding.UTF7 y UTF7Encoding. No deshabilita ninguna otra advertencia ni cambia el comportamiento de las API como Encoding.GetEncoding.Si se necesita la compatibilidad con
Encoding.GetEncoding("utf-7", ...)
:Puede volver a habilitar el soporte de compatibilidad a través de un interruptor de compatibilidad. Este modificador de compatibilidad se puede especificar en el archivo .csproj de la aplicación o en un archivo de configuración en tiempo de ejecución, como se muestra en los ejemplos siguientes.
En el archivo .csproj de la aplicación:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- Re-enable support for UTF-7 --> <EnableUnsafeUTF7Encoding>true</EnableUnsafeUTF7Encoding> </PropertyGroup> </Project>
En el archivo runtimeconfig.template.json de la aplicación:
{ "configProperties": { "System.Text.Encoding.EnableUnsafeUTF7Encoding": true } }
Sugerencia
Si vuelve a habilitar la compatibilidad con UTF-7, debe realizar una revisión de seguridad del código que llama a Encoding.GetEncoding.
Las APIs afectadas
- 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()