Come proteggersi segni diacritici come Zalgo testo
Il personaggio nella foto sopra è stato inviato un tweet di qualche mese fa da Mikko Hyppönen, un esperto di sicurezza informatica noto per il suo lavoro sui virus informatici e TED talks sulla sicurezza informatica. Nel rispetto di SO, pubblicherò solo un'immagine di esso, ma tu hai l'idea. Ovviamente non è qualcosa che vorresti diffondere sul tuo sito web e spaventare i visitatori.
Dopo un'ulteriore ispezione, il personaggio sembra essere una lettera dell'alfabeto tailandese combinata con oltre diacritici (c'è anche un limite ?!). Questo mi ha fatto pensare a sicurezza, localizzazione e come si possa gestire questo tipo di input. La mia ricerca mi porta a this question su Stack e, a sua volta, a un post di Michael Kaplan su stripping diacritics. In esso, egli dimostra come si può scomporre una stringa nelle sue caratteri "base" (semplificato qui per brevità):
StringBuilder sb = new StringBuilder();
foreach (char c in "façade".Normalize(NormalizationForm.FormD))
{
if (char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
sb.Append(c);
}
Response.Write(sb.ToString()); // facade
posso vedere quanto che questo è sarebbe utile, in alcuni casi, ma in termini di input dell'utente, sarebbe togliere tutti i segni diacritici. Come sottolinea Kaplan, rimuovere i segni diacritici in alcune lingue può cambiare completamente il significato della parola. Questo solleva la domanda: In che modo si permettono alcuni segni diacritici nell'input/output dell'utente, ma si escludono altri casi estremi come il carattere über di Mikko Hyppönen?
Whitelist attraverso una classe statica/classe di utilità? E merita di andare su programmers.stackexchange.com. –
@MonsterTruck, abbastanza giusto, ma quale whitelist esattamente? Questi sono personaggi Unicode di cui sto parlando. –
È possibile impostare un numero massimo di segni diacritici per carattere base. Scegli un valore abbastanza alto in modo che vietnamita e greca siano ancora a posto, ma abbastanza bassi da respingere i casi folle. –