Символы нулевой ширины: гармония? щит? несуществующий

внешний интерфейс Unicode
Символы нулевой ширины: гармония? щит? несуществующий

Если вы понятия не имеете о символах нулевой ширины, вы можете сначала сыграть в этоDemo

Что такое символы нулевой ширины?

Символы нулевой ширины — невидимые, непечатаемые символы. Они существуют на странице и в основном используются для настройки формата отображения символов. Ниже приведены некоторые распространенные символы нулевой ширины, их коды Unicode и исходное использование:

  1. пространство нулевой шириныU+200B: разделение новой строки для более длинных слов
  2. неразрывный пробел нулевой шириныU+FEFF: Используется для предотвращения разграничения новой строки в определенных позициях.
  3. соединение нулевой шириныU+200D: Используется в арабском и индийском языках для создания эффекта лигатуры между символами, которые не встречаются в лигатурах.
  4. нулевая ширина без соединенияU+200C: используется в арабском, немецком, индийском языках и т. д., чтобы предотвратить эффекты лигатур между символами, которые могли бы вызвать лигатуры.
  5. отметка слева направоU+200E: Используется в многоязычных текстах со смешанной ориентацией текста (например, смешанное написание слева направо на английском языке и справа налево на иврите), указывая, что наборный текст пишется слева направо.
  6. отметка справа налевоU+200F: Используется в многоязычных текстах со смешанным направлением текста, указывая направление написания текста при наборе текста справа налево.

Что могут делать символы нулевой ширины?

1. Передача конфиденциальной информации

Используя невидимую функцию символов нулевой ширины, мы можем использовать символы нулевой ширины для вставки невидимого невидимого текста на любую веб-страницу, которая не фильтрует символы нулевой ширины. Ниже приведен простой метод интерпретации текста с использованием символов нулевой ширины.加密а также解密изJavaScriptпример:

шифрование
// 为了代码的简洁与易读性,以下代码会忽略性能方面考量

const text = '123😀';

// Array.from 能让我们正确读取宽度为2的Unicode字符,例:😀
const textArray = Array.from(text);

// 用codePointAt读取所有字符的十进制Unicode码
// 用toString将十进制Unicode码转化成二进制(除了二进制,我们也可以使用更大的进制来缩短加密后的信息长度,以此提升效率)
const binarify = textArray.map(c => c.codePointAt(0).toString(2));

// 此时binarify中的值是 ["110001", "110010", "110011", "11111011000000000"],下一步我们需要将"1","0"和分隔符映射到响应的零宽度字符上去

// 我们用零宽度连字符来代表1,零宽度断字符来代表0,零宽度空格符来代表分隔符
// 下面的''看上去像是空字符串,但其实都是长度为1,包含零宽度字符的字符串
const encoded = binarify.map(c => Array.from(c).map(b => b === '1' ? '‍' : '‌').join('')).join('​');

// 此时encoded中包含的就是一串不可见的加密文本了

ПРИМЕЧАНИЕ. При использовании символов нулевой ширины для加密При копировании старайтесь не вставлять зашифрованный невидимый текст в начало или конец открытого текста, чтобы избежать пропуска невидимого текста при копировании.

расшифровать
// 接着上面的encoded
// 用分隔符(零宽度空格符)提取加密文本中的字符
const split = encoded.split('​');

// 将文本转回成二进制数组
const binary = split.map(c => Array.from(c).map(z => z === '‍' ? '1' : '0').join(''));

// 此时binary中的值再次回到开始的 ["110001", "110010", "110011", "11111011000000000"]

// 最后一部只需要将二进制文本转回十进制,再使用 String.fromCodePoint 就可以得到原文本了
const decoded = binary.map(b => String.fromCodePoint(parseInt(b, 2))).join('');

// 此时decoded中的值即是 "123😀"

заявление
  1. невидимый водяной знак

    С символами нулевой ширины мы можем добавить隐形水印. При просмотре внутреннего файла на странице входа в браузер мы можем вставить информацию браузера, зашифрованную символами нулевой ширины, везде в файле.Если браузер использует копирование и вставку для анонимного обмена файлом в общедоступных СМИ, мы можем сделать это, вложение в файл隐形水印Делящихся найти несложно.

  2. Зашифрованный обмен информацией

    С помощью символов нулевой ширины мы можем делиться любой информацией на любом веб-сайте. Модерация и фильтрация конфиденциальной информации играет жизненно важную роль в современном интернет-сообществе, но символы нулевой ширины могут легко проникать в оба уровня.信息分享барьер. Можно сказать, что по сравнению с тем, как шифруется информация в хеш-таблицах открытого текста, сокрытие шифрования символов нулевой ширины в Интернете достигло новой высоты. С помощью всего лишь простого плагина для браузера, который распознает/расшифровывает символы нулевой ширины, любой веб-сайт может стать信息分享игровая площадка.

2. Экранирование соответствия слов

// 利用零宽度字符来分隔敏感词
const censored = '敏感词';

let censor = censored.replace(/敏感词/g, ''); // ''

// 使用零宽度空格符对字符串进行分隔
const uncensored  = Array.from(censored).join('​');

censor = uncensored.replace(/敏感词/g, ''); // '敏​感​词'

заявление
  1. Экранировать фильтр чувствительных слов

    С символами нулевой ширины мы можем легко избежать фильтрации чувствительных слов. Автоматическая фильтрация деликатных слов является важным инструментом для поддержания порядка в интернет-сообществе.Просто войдя в базу данных деликатных слов и сопоставив соответствующие деликатные слова, можно не допустить попадания большого количества незаконных слов. использовать омонимы и пиньинь逃脱敏感词过滤сделает язык менее эффективным в передаче информации, а использование символов нулевой ширины может逃脱敏感词过滤При этом смысл слова передается реципиенту в неизменном виде, что значительно повышает эффективность коммуникации между распространителем информации и реципиентом.

Примеры и резюме

Чтобы лучше понять и использовать символы нулевой ширины, я предлагаю вамDemoа такжеБиблиотека инструментов, библиотека предоставляет несколько общих методов для применения символов нулевой ширины (加密,解密,逃脱匹配...). Наличие символов нулевой ширины на странице может быть хорошо, но может быть и плохо, все зависит от того, как вы используете символы нулевой ширины. Если вы не хотите видеть эти символы нулевой ширины на своей странице, вы можете полностью отфильтровать эти символы, но это вызовет некоторые проблемы при наборе для специальных языков. Поэтому, пожалуйста, обращайтесь с этими невидимыми персонажами с осторожностью.

Наконец, небольшая пасхалка для всех вас

«Я‏‍‏‌‏‎‍​‏‌‏‍‏«Меня определяет не то, кем я являюсь, а то, что я делаю», — Брюс Уэйн.

reference

Be careful what you copy: Invisibly inserting usernames into text with Zero-Width Characters by umpox