dev
dart 68 lines 1.58 KB
Raw
1 /// Normalizes homoglyph characters (Cyrillic, Greek, etc.) to their ASCII equivalents
2 /// to detect spoofing attacks like "UЅDС" (Cyrillic) vs "USDC" (ASCII)
3 String normalizeHomoglyphs(String text) {
4 final homoglyphMap = {
5 // Cyrillic letters that look like Latin
6 'А': 'A', // Cyrillic A
7 'В': 'B', // Cyrillic Ve
8 'Е': 'E', // Cyrillic Ie
9 'К': 'K', // Cyrillic Ka
10 'М': 'M', // Cyrillic Em
11 'Н': 'H', // Cyrillic En
12 'О': 'O', // Cyrillic O
13 'Р': 'P', // Cyrillic Er
14 'С': 'C', // Cyrillic Es
15 'Т': 'T', // Cyrillic Te
16 'У': 'Y', // Cyrillic U
17 'Х': 'X', // Cyrillic Kha
18 'а': 'a',
19 'в': 'b',
20 'е': 'e',
21 'к': 'k',
22 'м': 'm',
23 'н': 'h',
24 'о': 'o',
25 'р': 'p',
26 'с': 'c',
27 'т': 't',
28 'у': 'y',
29 'х': 'x',
30 'Ѕ': 'S', // Cyrillic Dze (looks like S)
31 'ѕ': 's',
32 'І': 'I', // Cyrillic I
33 'і': 'i',
34 'Ј': 'J', // Cyrillic Je
35 'ј': 'j',
36 // Greek letters that look like Latin
37 'Α': 'A', // Alpha
38 'Β': 'B', // Beta
39 'Ε': 'E', // Epsilon
40 'Ζ': 'Z', // Zeta
41 'Η': 'H', // Eta
42 'Ι': 'I', // Iota
43 'Κ': 'K', // Kappa
44 'Μ': 'M', // Mu
45 'Ν': 'N', // Nu
46 'Ο': 'O', // Omicron
47 'Ρ': 'P', // Rho
48 'Τ': 'T', // Tau
49 'Υ': 'Y', // Upsilon
50 'Χ': 'X', // Chi
51 'α': 'a',
52 'β': 'b',
53 'ε': 'e',
54 'ζ': 'z',
55 'η': 'h',
56 'ι': 'i',
57 'κ': 'k',
58 'μ': 'm',
59 'ν': 'n',
60 'ο': 'o',
61 'ρ': 'p',
62 'τ': 't',
63 'υ': 'y',
64 'χ': 'x',
65 };
66
67 return text.split('').map((char) => homoglyphMap[char] ?? char).join('');
68 }