Operazioni sulle stringhe che tengono conto delle impostazioni relative a lingua e protezione

Le operazioni sulle stringhe dipendenti dalla lingua disponibili in .NET Framework possono rappresentare un vantaggio per gli sviluppatori che creano applicazioni progettate per la visualizzazione di risultati agli utenti in base alla lingua. Per impostazione predefinita, la lingua da utilizzare per i metodi dipendenti dalla lingua viene ottenuta dalla proprietà CultureInfo.CurrentCulture del thread corrente. Il risultato restituito dal metodo String.Compare, ad esempio, varia in base alla lingua a causa delle differenze nei criteri di ordinamento e nei mapping di maiuscole e minuscole utilizzati nelle diverse lingue. Le operazioni sulle stringhe dipendenti dalla lingua, tuttavia, non sempre corrispondono al comportamento desiderato. L'utilizzo di operazioni dipendenti dalla lingua nei casi in cui è preferibile che i risultati siano invece indipendenti dalla lingua può determinare errori nel codice per le lingue con regole di ordinamento e mapping di maiuscole e minuscole personalizzati e determinare la vulnerabilità dell'applicazione a livello di protezione.

Le operazioni sulle stringhe dipendenti dalla lingua possono causare vulnerabilità a livello di protezione se il comportamento previsto dallo sviluppatore che crea una libreria di classi differisce dal comportamento effettivo dell'operazione sul computer su cui viene eseguita. Queste variazioni nel comportamento possono verificarsi in caso di modifica della lingua oppure se la lingua nel computer su cui viene eseguita l'operazione non corrisponde a quella utilizzata dallo sviluppatore per i test del codice.

Vulnerabilità a livello di protezione nelle operazioni sulle stringhe dipendenti dalla lingua

Le esclusive regole di mapping di maiuscole e minuscole adottate per l'alfabeto turco consentono di illustrare come un'operazione dipendente dalla lingua possa essere utilizzata per sfruttare una vulnerabilità a livello di protezione del codice dell'applicazione. Nella maggior parte degli alfabeti latini, il carattere i (Unicode 0069) costituisce la versione minuscola del carattere I (Unicode 0049). L'alfabeto turco, tuttavia, dispone di due versioni del carattere I: una con un punto e una senza. In turco, il carattere I (Unicode 0049) viene considerato come la versione maiuscola di un diverso carattere, ı (Unicode 0131). Il carattere i (Unicode 0069) viene a propria volta considerato come la versione minuscola di un altro carattere, İ (Unicode 0130). Di conseguenza, un confronto tra stringhe senza distinzione tra maiuscole e minuscole dei caratteri i (Unicode 0069) e I (Unicode 0049), che ha esito positivo nella maggior parte delle lingue, avrà invece esito negativo nella lingua "tr-TR" (turco, Turchia).

Nell'esempio di codice riportato di seguito vengono illustrate le differenze determinate dalla lingua nel risultato di un'operazione String.Compare senza distinzione tra maiuscole e minuscole eseguita sulle stringhe "FILE" e "file". Il confronto restituirà true se la proprietà Thread.CurrentCulture è impostata su "en-US" (inglese, Stati Uniti). Restituirà invece false se CurrentCulture è impostata su "tr-TR" (turco, Turchia). Se una verifica di attendibilità in un'applicazione è basata su questa operazione String.Compare, la modifica di CurrentCulture potrebbe invertire il risultato di tale verifica.

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));
    }
}

Nell'output della console riportato di seguito vengono illustrate le variazioni nei risultati determinate dalla lingua, a causa del fatto che il confronto senza distinzione tra maiuscole e minuscole di i e I restituisce true per la lingua "en-US" e false per la lingua "tr-TR".

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

Per ulteriori informazioni su regole di ordinamento e mapping di maiuscole e minuscole personalizzati, vedere Regole di ordinamento e mapping di maiuscole e minuscole personalizzati.

Specifica esplicita della lingua nelle operazioni sulle stringhe

L'opportunità di utilizzare operazioni sulle stringhe dipendenti oppure indipendenti dalla lingua è determinata dall'utilizzo dei risultati da parte dell'applicazione. È in genere preferibile che le operazioni sulle stringhe che determinano la visualizzazione di risultati all'utente finale siano dipendenti dalla lingua. Se in un'applicazione viene visualizzato all'utente un elenco ordinato di stringhe localizzate in una casella di riepilogo, ad esempio, è opportuno eseguire un ordinamento dipendente dalla lingua. I risultati delle operazioni sulle stringhe utilizzate internamente devono in genere essere indipendenti dalla lingua. In generale, se si utilizzano nomi file, formati di persistenza o informazioni sui simboli che non vengono visualizzati all'utente finale, è opportuno che i risultati delle operazioni sulle stringhe non varino in base alla lingua. Se in un'applicazione viene confrontata una stringa per determinare se costituisce un tag XML riconosciuto, ad esempio, il confronto deve essere indipendente dalla lingua.

Per la maggior parte, i metodi di .NET Framework che eseguono operazioni sulle stringhe dipendenti dalla lingua forniscono per impostazione predefinita overload dei metodi che consentono di specificare la lingua da utilizzare in modo esplicito passando un parametro CultureInfo. Utilizzare questi overload per indicare chiaramente se un'operazione sulle stringhe deve essere dipendente o indipendente dalla lingua. Per le operazioni dipendenti dalla lingua, specificare la proprietà CurrentCulture per il parametro CultureInfo. Per eliminare le vulnerabilità a livello di protezione determinate dalle variazioni nelle regole di ordinamento e nei mapping di maiuscole e minuscole delle diverse lingue, eseguire operazioni indipendenti dalla lingua specificando la proprietà CultureInfo.InvariantCulture per il parametro CultureInfo. È così possibile assicurarsi che l'esecuzione del codice generi su tutti i computer, indipendentemente dalla lingua, lo stesso comportamento rilevato durante i test.

Esecuzione di operazioni sulle stringhe indipendenti dalla lingua

Per impostazione predefinita, le API di .NET Framework riportate di seguito eseguono operazioni sulle stringhe dipendenti dalla lingua. In caso di utilizzo di queste API, utilizzare sempre l'overload del metodo o il costruttore della classe che consente di specificare in modo esplicito la lingua da utilizzare. Per determinare se specificare CurrentCulture, per risultati dipendenti dalla lingua, o InvariantCulture, per risultati indipendenti dalla lingua, seguire le istruzioni fornite in Specifica esplicita della lingua nelle operazioni sulle stringhe.

Metodo String.Compare

Metodo String.CompareTo

Metodo String.ToUpper

Metodo String.ToLower

Metodo Char.ToUpper

Metodo Char.ToLower

Classe CaseInsensitiveComparer

Classe CaseInsensitiveHashCodeProvider

Classe SortedList

Metodo ArrayList.Sort

Metodo CollectionsUtil.CreateCaseInsensitiveHashtable

Metodo Array.Sort

Metodo Array.BinarySearch

Spazio dei nomi System.Text.RegularExpressions

Negli argomenti riportati di seguito sono disponibili ulteriori informazioni su queste API ed esempi in cui ne viene illustrato l'utilizzo corretto allo scopo di ottenere risultati indipendenti dalla lingua.

Riepilogo delle istruzioni per l'uso delle stringhe con supporto della lingua

In caso di esecuzione di operazioni sulle stringhe che tengono conto delle impostazioni relative alla lingua nel codice delle librerie di classi, attenersi alle istruzioni riportate di seguito.

  • Passare informazioni sulla lingua in modo esplicito a tutte le operazioni dipendenti dalla lingua. Specificare CultureInfo.CurrentCulture per ottenere un comportamento dipendente dalla lingua. Specificare CultureInfo.InvariantCulture per ottenere un comportamento indipendente dalla lingua.
  • Utilizzare il metodo String.Compare anziché il metodo String.CompareTo. Il metodo String.Compare consente di indicare chiaramente se si desidera eseguire un'operazione dipendente oppure indipendente dalla lingua. Per esempi di codice relativi all'utilizzo del metodo String.Compare, vedere Esecuzione di confronti di stringhe indipendenti dalla lingua.
  • Fornire meccanismi per la personalizzazione della lingua per tutti i componenti in cui vengono utilizzate internamente operazioni dipendenti dalla lingua.

Vedere anche

Protezione nelle librerie di classi | Esecuzione di operazioni sulle stringhe indipendenti dalla lingua