Compartir a través de


Operaciones de cadenas que tengan en cuenta las referencias culturales y la seguridad

Las operaciones de cadena que tienen en cuenta la referencia cultural proporcionada por .NET Framework pueden resultar ventajosas para los programadores que creen aplicaciones diseñadas para mostrar resultados basándose en la referencia cultural. De manera predeterminada, los métodos que tienen en cuenta las referencias culturales obtienen la referencia cultural que van a usar a partir de la propiedad CultureInfo.CurrentCulture del subproceso actual. Por ejemplo, el método String.Compare devuelve un resultado que varía según la referencia cultural, debido a las diferencias en criterios de ordenación y asignaciones de mayúsculas y minúsculas usadas por las distintas referencias culturales. Sin embargo, las operaciones de cadena que tienen en cuenta la referencia cultural no son siempre el comportamiento más deseable. Utilizar operaciones que tienen en cuenta la referencia cultural en escenarios en los que los resultados deberían ser independientes de ésta puede hacer que el código no funcione en referencias culturales con asignaciones personalizadas de mayúsculas y minúsculas y reglas de ordenación, y provocar problemas de seguridad en la aplicación.

Las operaciones con cadenas que tengan en cuenta la referencia cultural pueden crear puntos vulnerables en la seguridad si el comportamiento esperado por el programador que escribe una biblioteca de clases difiere del comportamiento real de funcionamiento en el equipo en el que se ejecuta la operación. Estos cambios de comportamiento pueden producirse si se cambia la referencia cultural o si la referencia cultural del equipo en el que se ejecuta la operación es distinta de la que utilizó el programador para probar el código.

Puntos vulnerables en la seguridad en operaciones con cadenas que tengan en cuenta la referencia cultural

Las exclusivas reglas de asignación de mayúsculas y minúsculas del alfabeto turco muestran cómo se puede usar una operación que tiene en cuenta la referencia cultural para crear un punto vulnerable en la seguridad del código de una aplicación. En la mayoría de los alfabetos latinos, el carácter i (Unicode 0069) es la versión minúscula del carácter I (Unicode 0049). Sin embargo, el alfabeto turco tiene dos versiones del carácter I: una con un punto y otra sin él. En turco, el carácter I (Unicode 0049) se considera la versión mayúscula de un carácter diferente ı (Unicode 0131). Y el carácter i (Unicode 0069) se considera la versión minúscula de otro carácter İ (Unicode 0130). Por consiguiente, una comparación de cadenas que no tenga en cuenta las mayúsculas y minúsculas de los caracteres i (Unicode 0069) e I (Unicode 0049), que tendría éxito en la mayoría de las referencias culturales, fallaría para la referencia cultural "tr-TR" (turco de Turquía).

En el siguiente ejemplo de código se muestra cómo una operación String.Compare que no tiene en cuenta las mayúsculas y minúsculas, realizada sobre las cadenas "FILE" y "file", obtiene resultados distintos dependiendo de la referencia cultural. La comparación devuelve true si la propiedad Thread.CurrentCulture se establece como "en-US" (inglés de Estados Unidos). La comparación devuelve false si CurrentCulture se establece como "tr-TR" (turco de Turquía). Si una aplicación adopta una decisión de importancia basándose en el resultado de esta operación String.Compare, el resultado de esa decisión podría verse trastocado si se cambia el valor de CurrentCulture.

Imports System
Imports System.Globalization
Imports System.Threading

Public Class TurkishISample
    Public Shared Sub Main()
        ' Set the CurrentCulture property to English in the U.S.
        Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
        Console.WriteLine("Culture = {0}", _
            Thread.CurrentThread.CurrentCulture.DisplayName)
        Console.WriteLine("(file == FILE) = {0}", String.Compare("file", _
            "FILE", True) = 0)
        
        ' Set the CurrentCulture property to Turkish in Turkey.
        Thread.CurrentThread.CurrentCulture = New CultureInfo("tr-TR")
        Console.WriteLine("Culture = {0}", _
            Thread.CurrentThread.CurrentCulture.DisplayName)
        Console.WriteLine("(file == FILE) = {0}", String.Compare("file", _
            "FILE", True) = 0)
    End Sub
End Class
[C#]
using System;
using System.Globalization;
using System.Threading;

public class TurkishISample
{
    public static void Main()
    {
    // Set the CurrentCulture property to English in the U.S.
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    Console.WriteLine("Culture = {0}",   
        Thread.CurrentThread.CurrentCulture.DisplayName);
    Console.WriteLine("(file == FILE) = {0}", (string.Compare("file", 
        "FILE", true) == 0));

    // Set the CurrentCulture property to Turkish in Turkey.
    Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
    Console.WriteLine("Culture = 
        {0}",Thread.CurrentThread.CurrentCulture.DisplayName);
    Console.WriteLine("(file == FILE) = {0}", (string.Compare("file", 
        "FILE", true) == 0));
    }
}

Los siguientes resultados en la consola muestran cómo éstos pueden cambiar en función de la referencia cultural, ya que la comparación de i e I que no tiene en cuenta las mayúsculas y minúsculas se evalúa como true para la referencia cultural "en-US" y como false para la referencia cultural "tr-TR".

Culture = English (United States)
(file == FILE) = True
Culture = Turkish (Turkey)
(file == FILE) = False

Para obtener más información sobre reglas de ordenación y asignaciones de mayúsculas y minúsculas personalizadas que puedan provocar incoherencias similares, vea Asignaciones personalizadas de mayúsculas y minúsculas, y reglas de ordenación.

Especificar la referencia cultural explícitamente en operaciones de cadenas

El hecho de si las operaciones de cadenas deben tener en cuenta las referencias culturales o no depende de cómo use los resultados la aplicación. Las operaciones de cadenas que muestran los resultados al usuario final deberían normalmente tener en cuenta las referencias culturales. Por ejemplo, si una aplicación muestra al usuario una lista ordenada de cadenas localizadas en un cuadro de lista, debería realizarse una ordenación que tuviera en cuenta las referencias culturales. Los resultados de las operaciones de cadenas que se usan internamente no deberían normalmente tener en cuenta las referencias culturales. En general, si está trabajando con nombres de archivo, formatos de persistencia o información simbólica que no se muestra al usuario final, los resultados de las operaciones de cadenas no deberían variar en función de la referencia cultural. Por ejemplo, si una aplicación compara una cadena para determinar si es una etiqueta XML reconocida, la comparación no debería tener en cuenta las referencias culturales.

La mayoría de los métodos .NET Framework que realizan operaciones de cadenas que tienen en cuenta las referencias culturales de manera predeterminada, proporcionan sobrecargas del método que permiten especificar de forma explícita la referencia cultural que hay que usar, pasando un parámetro CultureInfo. Use estas sobrecargas para mostrar claramente si se pretende que una operación de cadenas tenga en cuenta las referencias culturales o no. En operaciones que tienen en cuenta las referencias culturales, especifique la propiedad CurrentCulture para el parámetro CultureInfo. Para eliminar los puntos de seguridad vulnerables producidos por variaciones de la referencia cultural en las reglas de ordenamiento y asignaciones de mayúsculas y minúsculas, se deben realizar operaciones que no tengan en cuenta la referencia cultural; para ello, basta con especificar la propiedad CultureInfo.InvariantCulture para el parámetro CultureInfo. Esto garantiza que el código se ejecutará en todos los equipos, sin importar su referencia cultural, con el mismo comportamiento que durante las pruebas.

Realizar operaciones de cadenas que no distinguen entre referencias culturales

Las siguientes API de .NET Framework realizan operaciones de cadenas que tienen en cuenta la referencia cultural de forma predeterminada. Cuando se utilicen estas API, se deberá usar siempre la sobrecarga de métodos o el constructor de clases que permita especificar de forma explícita la referencia cultural que se tiene que usar. Para determinar si se debe especificar CurrentCulture (los resultados tienen en cuenta la referencia cultural) o InvariantCulture (los resultados no tienen en cuenta la referencia cultural), siga las pautas descritas en Especificar la referencia cultural explícitamente en operaciones de cadenas.

String.Compare (Método)

String.CompareTo (Método)

String.ToUpper (Método)

String.ToLower (Método)

Char.ToUpper (Método)

Char.ToLower (método)

CaseInsensitiveComparer (Clase) |

CaseInsensitiveHashCodeProvider (Clase) |

SortedList (Clase) |

ArrayList.Sort (Método) |

CollectionsUtil.CreateCaseInsensitiveHashTable (Método) |

Array.Sort (Método) |

Array.BinarySearch (Método) |

System.Text.RegularExpressions (Espacio de nombres)

Los temas siguientes proporcionan más información sobre estas API y ejemplos que muestran cómo usarlas correctamente para obtener resultados que no tengan en cuenta las referencias culturales:

Resumen de las instrucciones de uso de cadenas que tengan en cuenta las referencias culturales

Al realizar operaciones en el código de la biblioteca de clases con cadenas que tengan en cuenta las referencias culturales, tenga en cuenta las pautas siguientes:

  • Pase de forma explícita la información sobre la referencia cultural a todas las operaciones que tengan en cuenta las referencias culturales. Especifique CultureInfo.CurrentCulture si desea un comportamiento que tenga en cuenta las referencias culturales. Especifique CultureInfo.InvariantCulture si desea un comportamiento que no tenga en cuenta las referencias culturales.
  • Use el método String.Compare en lugar del método String.CompareTo. El método String.Compare clarifica si se desea que una operación tenga en cuenta o no las referencias culturales. Para examinar ejemplos de código que muestra cómo usar el método String.Compare, vea Realizar comparaciones de cadenas que no tienen en cuenta las referencias culturales.
  • Proporcione medios para personalizar la referencia cultural de todos los componentes que usen internamente operaciones que no tengan en cuenta la referencia cultural.

Vea también

Seguridad en las bibliotecas de clases | Realizar operaciones de cadenas que no tienen en cuenta las referencias culturales