Смотрите трюки со словами

При преобразовании большого списка отслеживаемых слов в регулярные выражения я обнаружил способы обхода фильтров. Они работают как для «обычных» отслеживаемых слов, так и для регулярных выражений.

Двойные пробелы: если ваше отслеживаемое слово — forbidden word, то его можно обойти, добавив несколько пробелов между двумя словами. Интересный факт: в опубликованном посте двойной пробел будет удалён, поэтому он совершенно невидим в итоговом тексте.

  • чтобы предотвратить это с помощью регулярных выражений: используйте forbidden\s*word
  • чтобы предотвратить это без регулярных выражений: я не нашёл решения.

Используйте символы подчёркивания, чтобы обойти границы слов:
без регулярных выражений: если вы окружите отслеживаемое слово символами подчёркивания, оно будет отображено курсивом и будет разрешено. Таким образом, _forbidden_ будет принято, если ваш фильтр — forbidden.
с регулярными выражениями: обычно границы слов проверяются только при использовании \b, и в этом случае символ подчёркивания их обойдёт. Таким образом, _forbidden_ будет принято, если ваш фильтр — \bforbidden\b.

  • чтобы предотвратить это с помощью регулярных выражений: используйте [\b\_] вместо \b.
    Редактирование: это, похоже, работает не очень хорошо.
    Удаление границ слов тоже может сработать, но тогда вы рискуете случайно запретить такие слова, как cumulative и title :wink:
  • чтобы предотвратить это без регулярных выражений: я не нашёл решения.
7 лайков

Правильно, обычно мы не тратим время на борьбу с этим, потому что существует множество «хитрых» трюков для обхода любого списка запрещённых слов. Пространство Unicode очень велико.

4 лайка

Действительно, мы пытались реализовать это на ряде крупных образовательных проектов некоторое время назад.

Перед тем как проект был закрыт, они внедрили нечёткое сопоставление, что, как и следовало ожидать, вызвало всевозможные проблемы для легитимных случаев использования.

3 лайка

Слова в списке наблюдения служат в основном «первой линией обороны» от нежелательных слов. Тем не менее, вам всё ещё нужна помощь сообщества для выявления обходных путей и нарушений.

Ни одно регулярное выражение, которое вы когда-либо создадите, не сможет обнаружить image.

9 лайков

Просто чтобы вы знали, [] обозначает «классы символов». В регулярных выражениях Perl и, возможно, Ruby, \b — это «граница слова» вне класса символов и «backspace» внутри класса символов. В C символ ‘\b’ всегда обозначает backspace (точнее, ). Backspace в большинстве случаев не является полезным символом, а границы слова полезны, поэтому и происходит переопределение.

Чтобы использовать регулярное выражение для поиска «forbidden» или «forbidden», я бы, вероятно, использовал:

\b_?forbidden_?\b

(Я также знаю, как закодировать все свои буквы с помощью XX (X), чтобы избежать Unicode-трюков или проблем с регулярными выражениями.)

3 лайка

Я никогда не осознавал, что существует разница в зависимости от контекста. Спасибо за объяснение! :slight_smile:

2 лайка