Cómo protegerse diacríticos como Zalgo texto
El carácter foto de arriba fue tuiteó hace unos meses por Mikko Hyppönen, un experto en seguridad informática conocida por su trabajo sobre los virus informáticos y TED talks sobre seguridad informática. Respecto a SO, solo publicaré una imagen de eso, pero entiendes la idea. Obviamente, no es algo que quieras difundir en tu sitio web y enloquecer a los visitantes.
Tras una inspección adicional, el personaje parece ser una letra del alfabeto tailandés combinada con más de 87 diacríticos (¿hay incluso un límite?). Esto me hizo pensar en la seguridad, la localización y cómo se podría manejar este tipo de información. Mi búsqueda me llevó al this question en Stack, y a su vez una publicación en el blog de Michael Kaplan en stripping diacritics. En él, se muestra cómo se puede descomponer una cadena en sus caracteres "base" (simplificado aquí en aras de la brevedad):
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
puedo ver cómo que esto es sería útil en algunos casos, pero en términos de entrada del usuario, sería eliminar TODOS los signos diacríticos. Como señala Kaplan, eliminar los signos diacríticos en algunos idiomas puede cambiar completamente el significado de la palabra. Esto nos lleva a la pregunta: ¿Cómo se permiten algunos signos diacríticos en la entrada/salida del usuario, pero se excluyen otros casos extremos como el personaje über de Mikko Hyppönen?
¿Incluido en la lista blanca a través de una clase de clase/utilidad estática? Y merece seguir en programmers.stackexchange.com. –
@MonsterTruck, es suficiente, pero ¿en la lista blanca qué es exactamente? Estos son caracteres Unicode de los que estoy hablando. –
Puede establecer un número máximo de signos diacríticos por carácter base. Elija un valor lo suficientemente alto para que vietnamita y griego sigan siendo válidos, pero lo suficientemente bajos como para rechazar los casos dementes. –