Руководство:$wgSpamRegex

From mediawiki.org
Jump to navigation Jump to search
This page is a translated version of the page Manual:$wgSpamRegex and the translation is 97% complete.
Other languages:
Доступ: $wgSpamRegex
Шаблон регулярного выражения, который, если содержимое страницы соответствует ему, останавливает сохранение страницы.
Введено в версии:1.2.6
Удалено в версии:все еще используется
Допустимые значения:(массив строк регулярных выражений)
Значение по умолчанию:[]

Любой текст, добавленный на вики-страницу и соответствующий этому регулярному выражению, будет распознан как вики-спам, и редактирование будет заблокировано. $wgSpamRegex затронет все группы пользователей; даже членам групп sysop и bureaucrats будет запрещено сохранять текст, если он соответствует $wgSpamRegex. Используйте Расширение: AbuseFilter , чтобы иметь возможность устанавливать правила, которые также позволяют фильтровать по группам! $wgSpamRegex является одним из наиболее эффективных решений для защиты от спама в MediaWiki. Это не будет блокировать весь спам, но может значительно уменьшить его количество, почти не оказывая негативного влияния на добросовестных пользователей. Параметры конфигурации $wgSpamRegex будут контролировать, как MediaWiki проверяет текст правок и определяет, являются ли они спамом или нет.

Внимание Внимание: Если ваш спам-фильтр с регулярными выражениями тихо терпит неудачу, то ему может понадобиться больше памяти! См. #pcre.backtrack_limit


Большой пример

Следующий пример - хорошая настройка для опробования на вашей вики, если это вики среднего/малого размера, страдающая от спам-атак. Вставьте следующее в свой файл LocalSettings.php :

 $wgSpamRegex = "/".                        # "/" - это открывающая обёртка
                "s-e-x|zoofilia|sexyongpin|grusskarte|geburtstagskarten|".
                "(animal|cam|chat|dog|hardcore|lesbian|live|online|voyeur)sex|sex(cam|chat)|adult(chat|live)|".
                "adult(porn|video|web.)|(hardcore|teen|xxx)porn|".
                "live(girl|nude|video)|camgirl|".
                "spycam|casino-online|online-casino|kontaktlinsen|cheapest-phone|".
                "laser-eye|eye-laser|fuelcellmarket|lasikclinic|cragrats|parishilton|".
                "paris-(hilton|tape)|2large|fuel(ing)?-dispenser|huojia|".
                "jinxinghj|telemati[ck]sone|a-mortgage|diamondabrasives|".
                "reuterbrook|sex-(with|plugin|zone)|lazy-stars|eblja|liuhecai|".
                "buy-viagra|-cialis|-levitra|boy-and-girl-kissing|". # Эти слова соответствуют спаму
                "dirare\.com|".           # Это совпадает с dirare.com - спамерским доменным именем
                "overflow\s*:\s*auto|".   # Это соответствует overflow:auto (независимо от пробела по обе стороны двоеточия)
                "height\s*:\s*[0-4]px|".  # Это соответствует height:0px (большинство CSS скрытого спама) (независимо от пробела по обе стороны двоеточия)
                "==<center>\[|".          # Это соответствует некоторым недавним спамам, связанным с starsearchtool.com и друзьями
                "\<\s*a\s*href|".         # Это полностью блокирует все ссылки href, заставляя использовать синтаксис wiki
                "display\s*:\s*none".     # Это совпадает с display:none (независимо от пробелов по обе стороны двоеточия)
                "/i";                     # Символ "/" завершает регулярное выражение, а следующий за ним переключатель "i" делает тест нечувствительным к регистру символов
                                          # Буква "\s" соответствует пробелу
                                          # "*" повторяет (ноль или более раз)
                                          # "\s*" означает поиск 0 или большего количества пробелов

Обратите внимание, что предпоследняя строка не имеет "|" в конце строки. Это происходит потому, что следующая строка завершает регулярное выражение закрывающей оболочкой /, за которой следует переключатель "i".

Этот пример включает в себя общие ключевые слова для спама (некоторые взяты со спам-листа Meta-Wiki), а также методы блокировки скрытого спама CSS.

Использование регулярных выражений для блокировки спама

Вот учебник по регулярным выражениям. Поэкспериментируйте с настройкой $wgSpamRegex и проверьте некоторые изменения на своей странице песочницы, чтобы увидеть, что блокируется. Но будьте осторожны! Позаботьтесь о том, чтобы избежать ложных срабатываний, т. е. неправильного сопоставления законных правок, см. ИЗБЕГАЙТЕ ЛОЖНЫХ СРАБАТЫВАНИЙ!

Параметр, который вы присваиваете $wgSpamRegex, представляет собой регулярное выражение (см. статью в Википедии и мануал PHP о регулярных выражениях). Приведенный выше пример показывает регулярное выражение, построенное на нескольких строках, используя точечный синтаксис PHP для объединения строк. Это делает длинное регулярное выражение более компактным, но и немного более сложным.

If you create your own regular expressions you may want to test them out in a PCRE Regex Evaluator (click the PCRE tab on this page).

Простой пример

Вот более простой пример:

$wgSpamRegex = "/buy-viagra/";

Помните, что идея состоит в том, чтобы решить - это спам: да или нет. В этом примере любой текст правки, содержащий 'buy-viagra', будет соответствовать спаму. Символы '/' в начале и конце являются частью синтаксиса регулярных выражений.

Блокируйте несколько разных слов/доменов

Давайте расширим наш пример, чтобы попытаться сопоставить больше видов спама:

$wgSpamRegex = "/buy-viagra|adultporn|online-casino|dirare\.com|sexcluborgy\.net/";

Используя символ "|" между словами, приведенный выше пример заблокирует несколько различных спам-слов, а также некоторые доменные имена, которые продвигаются спамерами.

$WgSpamRegex применяется ко всему внесённому тексту, включая URL-адреса спам-ссылок. Таким образом, блокировка доменных имён может быть очень эффективным способом избавиться от конкретного спамера.

ИЗБЕГАЙТЕ ЛОЖНЫХ СРАБАТЫВАНИЙ!

Избежать ложных срабатываний - вот настоящая проблема, и ее лучше всего проиллюстрировать плохим примером:

# Не делайте так!
$wgSpamRegex = "/cialis/";

Многие спамеры любят говорить о 'cialis' (какой-то наркотик. Какая разница? только не мы!) и поэтому у вас может возникнуть соблазн сопоставить это слово как спам, но это также помешает пользователям упоминать слово 'specialist'. Очень легко совершить такую ошибку. Будьте осторожны с настройкой регулярных выражений. Вы хотите остановить спамеров, не причиняя неудобств вашим пользователям. Эта проблема может быть преодолена во многих случаях путем включения шаблона границы слова "\b" до и после любых слов, которые могут содержаться в более крупном слове, например:

# Это будет соответствовать "cialis", но не "specialist"
$wgSpamRegex = "/\bcialis\b/";

# Вы также можете включить эту опцию вокруг группы шаблонов, например:
$wgSpamRegex = "/\b(cialis|viagra|porn|sex|anal)\b/";
# Это позволит избежать запрета таких слов, как "analysis" или "Essex".

Другие советы по регулярных выражениях

Регулярные выражения очень сильны. $wgSpamRegex применяется ко всему тексту редактируемой страницы или раздела, а не только к URL-адресам. Это дает вам возможность блокировать всё, что вам не нравится, если вы можете разработать хорошее регулярное выражение (как можно более конкретное, чтобы избежать ложных срабатываний). В следующем разделе о скрытом спаме CSS мы используем этот инструмент.

Сообщение о спаме

Обычно, когда параметр $wgSpamRegex совпадает с некоторым спамом, отображается следующее сообщение:

Страница, которую вы хотели сохранить, была заблокирована спам-фильтром. Это, вероятно, вызвано ссылкой на внешний сайт, внесённый в чёрный список.
Следующий текст - это то, что вызвало наш спам-фильтр:

[слово/доменное имя, которое было заблокировано]

Этот текст может быть изменен и расположен на двух редактируемых вики-страницах в пространстве имен MediaWiki. Нажмите кнопку "Специальные страницы" -> "Вики-данные и инструменты: Системные сообщения", введите "spampro" в поле "Фильтр по префиксу:" и нажмите кнопку "Перейти". Если вы увидите "Просмотр источника" вместо "Редактировать" на верхней вкладке, то у вас нет разрешения на редактирование. Вам нужно войти в систему как пользователь sysop (или пользователь WikiSysop, который вы настроили во время установки).

'$1' в MediaWiki:Spamprotectionmatch отображает неудачное совпадение регулярных выражений, которое отключило спам-фильтр. Удалите "$1", если вы хотите, чтобы он был скрыт.

Отображение/Скрытие совпадающего текста

Если вы сделали регулярное выражение, которое слишком ограничено, или вы сделали какую-то другую ошибку в настройке, то вы можете получить ложные срабатывания. Действительно, полный пример выше может соответствовать законному тексту в некоторых редких случаях (возможно, ваши пользователи действительно хотят поговорить о покупке Виагры).

Отображая текст, который совпал, сообщение MediaWiki:Spamprotectionmatch помогает уменьшить проблемы, вызванные ложными срабатываниями.

Это позволяет вашим пользователям точно сообщать вам о проблемах, связанных с настройкой $wgSpamRegex.

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

К сожалению, это также очень полезная информация для спамеров, посещающих ваш сайт. Некоторые спамеры являются автоматизированными ботами, поэтому они все равно не увидят эту информацию, однако многие спамеры (верьте или нет) являются людьми. Эти люди могут взять на себя труд посмотреть на соответствующую информацию и попытаться придумать обходной путь (например, просто пропустить доменное имя, которое вы заблокировали, но ссылаться на различные другие домены). Трудно сказать, насколько распространен этот тип поведения, но если вы хотите сделать жизнь для них более трудной вы можете скрыть информацию о совпадении спама, просто установив ваше сообщение MediaWiki:Spamprotectionmatch пустым. Вы должны делать это только в том случае, если вы очень хорошо осведомлены о вышеприведенных пунктах о ложных срабатываниях и тщательно разработали свое регулярное выражение, чтобы избежать их.

Скрытый спам CSS

MediaWiki довольно снисходительна, когда речь заходит о HTML-тегах и определениях стилей CSS (см. HTML в вики-тексте Meta-Wiki)

Это дало спамерам возможность изобрести хитрый трюк, чтобы скрыть свой спам от посторонних глаз. Он не отображается на ваших страницах, но отображается в Ваших полях редактирования, а изменения отображаются на дисплее "последние изменения". Таким образом, это вызывает путаницу у ваших законных пользователей, и это до того, как вы увидите последствия от размещения ссылок спамера. Как правило, "скрытый спам CSS" - это очень плохо. Просто потому, что вы не можете видеть его (легко), но это не означает, что вы можете игнорировать его.

Проблема была выявлена людьми в chongqed.org в 2005 году, но стала намного хуже в 2006 году, до такой степени, что кажется, что большинство спамеров MediaWiki используют этот трюк.

Мы можем использовать регулярное выражение, чтобы предотвратить трюки CSS, которые они используют. Два из них включены в полный приведенный выше пример (объединены с помощью символа '|'):

Чтобы предотвратить скрытый спам CSS формы <div style="overflow:auto; height:0px;":

$wgSpamRegex = "/".
  "overflow\s*:\s*auto|".
  "height\s*:\s*[0-4]px|".
  "/i";

Чтобы предотвратить скрытый спам CSS формы style="display:none;":

$wgSpamRegex = "/style\s*=\s*"\s*display\s*:\s*none\s*"/i;
     # Which parses as follows:
     # "       = PHP string wrapper
     # /       = RegEx opening wrapper

     # style   = search for the string 'style'
     # \s*=\s* = search for an equals sign with any amount of whitespace (including no whitespace) on either end
     # display = search for the string 'display'
     # \s*:\s* = search for a colon sign with any amount of whitespace (including no whitespace) on either end
     # none\s* = search for the string 'none' followed by any amount of whitespace (including no whitespace)

     # /       = RegEx closing wrapper
     # i       = RegEx switch makes tests case-insensitive
     # "       = PHP string wrapper
     # ;       = PHP line end

Для немного более строгой настройки вы можете вообще запретить различные атрибуты тега style:

$wgSpamRegex = "/\<.*style.*(display|position|overflow|visibility|height)\s*:.*>/i";

...но вы можете обнаружить, что это начинает ограничивать ваших пользователей больше, чем вам бы хотелось.

Блокировать ВСЕ внешние ссылки

Вы можете заблокировать все внешние ссылки, используя это регулярное выражение:

# Блокировать ВСЕ внешние ссылки
$wgSpamRegex = "/https?:\/\//";
$wgSummarySpamRegex = "/https?:\/\//";

Это крайне ограничительно для законных пользователей вики, поскольку они больше не могут ссылаться на какой-либо внешний сайт. Это плохое решение проблемы спама, хотя оно немного лучше, чем полная блокировка.

Если вы собираетесь использовать это, убедитесь, что на вашей странице "MediaWiki:Spamprotectiontext" есть объяснение того, что вы сделали.

Ограничьте внешние ссылки до 100

Вы можете ограничить общее количество внешних ссылок, разрешенных на страницу, скажем, 100, с помощью этого

# Ограничить общее количество внешних ссылок, разрешённых на странице (? в *? делает * "нежадным" и важен для эффективности)
$wgSpamRegex = "/(http:(.|\n)*?){101}/";

Если вы сделаете это, убедитесь, что на Вашей странице "MediaWiki:Spamprotectiontext" есть объяснение того, что вы сделали.

pcre.backtrack_limit

Внимание Внимание: Если ваше регулярное выражение спам-фильтра тихо терпит неудачу, ему может потребоваться больше памяти! Or you may need to write your regex better so it does not waste itself: making * ungreedy by adding a ? to it, like so *?, can greatly help efficiency! Test your home brewed regexes in a PCRE Regex Evaluator (click the PCRE tab there).


PHP начиная с версии 5.3.7 имеет pcre.backtrack_limit, который по умолчанию равен 1000000 (1M). Однако это всё еще может быть слишком низко. Попробуйте добавить следующую строку в свой файл "LocalSettings.php":

// Perl Compatible Regular Expressions backtrack memory limit
ini_set( 'pcre.backtrack_limit', '2M' );

Если этого все еще недостаточно, вы можете постепенно увеличивать этот лимит, пока он не будет соответствовать вашим фактическим требованиям вики.

См. также