Как защититься от диакритических знаков, таких как текст Zalgo

huh?

Персонаж, изображенный выше, был написан несколько месяцев назад в Твиттере Микко Хиппоненом , экспертом по компьютерной безопасности, известным своей работой с компьютерными вирусами и выступлениями на TED по компьютерной безопасности. Что касается SO, я опубликую только его изображение, но вы поняли. Очевидно, это не то, что вы хотели бы распространять на своем веб-сайте и пугать посетителей.

При дальнейшем рассмотрении символ оказывается буквой тайского алфавита в сочетании с более чем 87 диакритическими знаками (. Есть ли предел?! ). Это заставило меня задуматься о безопасности, локализации и о том, как можно обрабатывать такие входные данные. Мои поиски привели меня к этому вопросу в стеке и, в свою очередь, к сообщению в блоге Майкла Каплана о удалении диакритических знаков . В нем он демонстрирует, как можно разложить строку на ее «базовые» символы (, здесь упрощенно для краткости ):

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 

. Я вижу, как это было бы полезно в некоторых случаях, но с точки зрения пользовательского ввода это было бы удаление ВСЕХ диакритических знаков. Как отмечает Каплан, удаление диакритических знаков в некоторых языках может полностью изменить значение слова. Возникает вопрос:Как можно разрешить некоторые диакритические знаки в пользовательском вводе/выводе, но исключить другие крайние случаи, такие как сверххарактер Микко Хиппонена?

37
задан Community 23 May 2017 в 12:17
поделиться