На этой странице [примечание 1] описаны некоторые типичные ошибки, которые допускают менеджеры фильтров редактирования . Полную документацию см. В Википедии: Фильтр редактирования / Документация и mw: Extension: AbuseFilter .
Дросселирование
Троттлинг по user
отдельности дросселей по идентификатору пользователя , а не имя пользователя. Все вышедшие из системы редакторы имеют один идентификатор пользователя 0
. Это может вызвать ложные срабатывания, если несколько несвязанных анонимных пользователей соответствуют условиям фильтра. Если это проблема, дросселируйте на user
и ip
вместо этого. [заметка 2]
Троттлинг по ip
отдельности дросселей вошли редакторы их основной IP - адрес . Не делайте этого, если только фильтр не нацелен только на вышедших из системы пользователей. Вместо этого дросселируйте user
и ip
, как указано выше.
user_rights
user_rights
Переменные содержат только пользователь текущих прав. Если пользователь вошел в систему, используя пароль бота , или редактирует с помощью приложения OAuth , это user_rights
может быть ограничено. Например, похоже, что мы могли бы исключить расширенных подтвержденных пользователей, ботов и администраторов с помощью [примечание 3]
! ( "extendedconfirmed" в user_rights ) / * НЕПРАВИЛЬНО! * /
но это не будет работать должным образом, если пользователь не предоставил editprotected
пароль при настройке пароля для бота. Вместо этого просто укажите группы явно:
! contains_any ( группы_пользователей , «расширенное подтверждение » , «сисоп» , «бот» )
Проверить / изучить интерфейс и последние изменения
Некоторые переменные в Special: Abusefilter / test и Special: AbuseFilter / explore [примечание 4] будут иметь другие значения, чем они были бы, если бы фильтр действительно сработал во время изменения. [примечание 5]
Предположим, что у Алисы есть учетная запись, созданная один час назад, и она добавляет строку «Hello, world! ~~~~» на страницу, которую когда-либо редактировал только Боб.
Через час мы смотрим на ее правку [примечание 6] с помощью Special: AbuseFilter / explore . Некоторые результаты могут быть неожиданными:
Переменная | При сохранении | На / изучить или / проверить |
---|---|---|
user_age | 3600 | 7200 |
добавленные_линии | Привет мир! ~~~~ | Привет мир! [[Пользователь: Alice | Alice]] ([[Обсуждение пользователя: Alice | talk]]) 21:07, 14 ноября 2019 г. (UTC) [примечание 7] |
page_recent_contributors | Боб | Алиса Боб |
Порядок операций
rlike
и другие ключевые слова имеют более высокий приоритет, чем +
. Это не проверяет, added_lines
содержит ли "foo" или "bar":
added_lines rlike "foo" + "| bar" / * НЕПРАВИЛЬНО! * /
Вместо этого используйте:
added_lines rlike ( "foo" + "| bar" )
norm () и повторяющиеся символы
Функция norm () удаляет запутанные (подделанные) символы, повторяющиеся символы, специальные символы и пробелы. Однако он делает это в определенном порядке (только что упомянутый). Это может привести к неожиданным результатам:
строка : = "AB, BCC" ; norm ( строка ) == "ABC" / * ЛОЖЬ * / norm ( строка ) == "AABBC" / * ИСТИНА * /
В случае сомнений всегда используйте инструмент отладки .
Создание тега
Теги создаются автоматически при сохранении фильтра. Как не использовать интерфейс в верхней части Special: Метки , если вы не хотите активировать тег для ручного использования. Ошибочно активированные теги могут быть деактивированы в Special: Tags .
Будьте осторожны с массивами
Единственная операция, которая действительно работает с массивами, - это length
. Другие операции сначала неявно приведут массив к строке. Это может дать неинтуитивный результат. Например, page_namespace in [12, 34]
фактически эквивалентно string(page_namespace) in "12\n34\n"
. Следовательно, когда page_namespace
равно 1, 2, 3 или 4, выражение также будет оценено как истинное. В приведенном выше случае используйте equals_to_any(page_namespace, 12, 34)
вместо этого обходной путь.
Будьте осторожны с делением
Можно было бы ожидать, что page_namespace / 2 === 0
он проверит, page_namespace
равно ли 0 или 1. Однако операция деления фактически не отбрасывает остаток. Это означает, что если числитель не делится на знаменатель, результатом будет число с плавающей запятой. В приведенном выше случае используйте equals_to_any(page_namespace, 0, 1)
вместо этого.
Числовые сравнения с нулем
Как и в PHP, null
меньше любого числа, т.е. null < -1234567
верно. Это особенно проблематично при использовании edit_delta
: если фильтруемое действие не является редактированием, edit_delta < -5000
будет оценено значение true. Не забудьте проверить это action === "edit"
при таком использовании edit_delta
.
Исчезающие журналы фильтров
Журналы фильтров могут исчезнуть при следующих обстоятельствах: 1) Если редактирование сохранено, а затем удалено по ревизии или пропущено, то журнал фильтра исчезает из поля зрения (в том числе из системных операторов). 2) Надзиратели могут удалять журналы сохраненных или несохраненных изменений. Счетчики фильтров редактирования всегда будут увеличиваться, поэтому в фильтре может быть меньше видимых журналов, чем количество совпадений.
Смотрите также
- Википедия: Деревенские акции
Заметки
- ↑ Название было бессовестно украдено из C Traps and Pitfalls .
- ^ Не по
user
илиip
- ^ Все эти группы имеют
extendedconfirmed
права, согласно Special: UserGroupRights - ^ При изучении последних изменений. Проверка совпадений старых фильтров покажет правильные значения.
- ^ См. Также T102944
- ^ Не запись в журнале фильтра, если таковая существует
- ^ На самом деле это значение
added_lines_pst