Jak chronić przed znakami diakrytycznymi, takimi jak tekst Zalgo

co?

Postać na zdjęciu powyżej została tweetowana kilka miesięcy temu przezMikko Hyppönen {6]}, eksperta od bezpieczeństwa komputerowego znanego ze swojej pracy nad wirusami komputerowymi i TED talks {6]} na temat bezpieczeństwa komputerowego. W związku z tym, będę zamieszczać tylko obraz tego, ale masz pomysł. Oczywiście nie jest to coś, co chciałbyś rozpowszechniać po swojej stronie i przerażać odwiedzających.

Po dalszej kontroli znak wydaje się być literą alfabetu tajskiego połączonego z ponad 87 znakami diakrytycznymi (czy jest w ogóle jakiś limit?!). To dało mi do myślenia o bezpieczeństwie, lokalizacji i sposobie obsługi tego rodzaju danych wejściowych. Moje poszukiwania doprowadziły mnie do tego pytania na Stack, a z kolei post na blogu Michaela Kaplana na usuwanie znaków diakrytycznych. W nim demonstruje, jak można rozłożyć łańcuch na jego "podstawowe" znaki (uproszczone tutaj dla zwięzłości): {]}

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 

Widzę, że w niektórych przypadkach byłoby to przydatne, ale w kategoriach z wejścia użytkownika, byłoby to usunięcie wszystkich znaków diakrytycznych. Jak podkreśla Kaplan, usunięcie znaków diakrytycznych w niektórych językach może całkowicie zmienić Znaczenie słowa. Nasuwa się pytanie: jak można zezwolić na niektóre znaki diakrytyczne w wejściu/wyjściu użytkownika, ale wykluczyć inne skrajne przypadki, takie jak über znak Mikko Hyppönena?

Author: Community, 2012-08-16

3 answers

Czy jest w ogóle jakiś limit?!

Nie występuje w Unicode. W UAX-15 istnieje koncepcja formatu "Stream-Safe", który wyznacza limit 30 kombinatorów... Ciągi znaków Unicode w ogóle nie są gwarantowane jako Bezpieczne dla strumienia, ale z pewnością można to uznać za znak, że Unicode nie zamierza standaryzować nowych znaków, które wymagałyby klastra grapheme dłuższego niż ten.

30 to wciąż dużo. Najdłużej znanym naturalnym klastrem grafemów jest Tybetański Hakmalhmalawarayaṁ W 1 bazie plus 8 kombinatorów, więc na razie rozsądne byłoby normowanie do NFD i wykluczenie dowolnej sekwencji więcej niż 8 kombinatorów z rzędu.

Jeśli dbasz tylko o wspólne języki zachodnioeuropejskie, prawdopodobnie możesz sprowadzić to do 2. Więc potencjalnie kompromis gdzieś między nimi.

 21
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-08 17:13:18

Myślę, że znalazłem rozwiązanie używając NormalizationForm.FormC zamiast NormalizationForm.FormD. Zgodnie z MSDN :

[FormC] wskazuje, że ciąg znaków Unicode jest znormalizowany przy użyciu pełnego rozkładu kanonicznego, a następnie zastąpienie sekwencji z ich podstawowe kompozyty, jeśli to możliwe.

Rozumiem, że rozkłada znaki do ich podstawowej formy, a następnie rekompresuje je w oparciu o zbiór reguł, które pozostają spójne. Domyślam się, że jest to przydatne do porównania cele, ale w moim przypadku działa idealnie. Postacie jak ü, é, i Ä są dokładnie rozkładane/rekomponowane, podczas gdy fałszywe znaki nie są rekomponowane, a zatem pozostają w formie podstawowej:

Tutaj wpisz opis obrazka

 2
Author: Derek Hunziker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-16 08:34:19

Oto regex , który powinien wyłowić wszystkie zalgo, w tym te pominięte w "normalnym" zakresie.

([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62]{2,})
Najtrudniej jest je zidentyfikować, gdy już to zrobisz - istnieje wiele rozwiązań. Mam nadzieję, że zaoszczędzisz trochę czasu.
 1
Author: Matas Vaitkevicius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 11:38:34