Язык:  EN  RU

Статьи : Использование правил для фильтрации спама

Списки черных и белых правил являются одним из важных механизмов фильтрации почтовых сообщений. Правила позволяют однозначно отнести письмо к определенному классу на основе анализа информации в заголовках или в теле письма.

Каждое правило состоит из одного или нескольких условий. Отдельное условие содержит в себе шаблон для поиска некоторой подстроки в определенной части письма и логические флаги. Шаблоны представляют собой регулярные выражения - специальным образом сформированные строки, которые позволяют эффективно искать в тексте последовательности символов с практически неограниченной гибкостью. Полный синтаксис регулярных выражений довольно объемный и непростой для изучения, но в большинстве случаев полное понимание всех тонкостей не требуется. Для построения шаблонов в типичных случаях достаточно иметь общее представление о базовых конструкциях языка регулярных выражений. Полное описание синтаксиса регулярных выражений можно найти в соответствующей литературе или например здесь - http://www.citforum.ru/internet/php/regexp.shtml.


Для условий могут быть установлены флаги "Сильное" и "Не". По умолчанию правило срабатывает только когда удовлетворены все его условия, но если срабатывает "Сильное" условие, то правило считается сработавшим независимо от остальных условий. Флаг "Не" означает логическое отрицание, т.е. срабатывание условия если строка по шаблону не найдена.

Рассмотрим несколько примеров построения правил для фильтрации писем. В тексте фигурируют описания условий правил в виде, который используется в списке условий определенного правила. Т.е. например конструкция вида "Header{Subject} =~ some text" означает что для правила создано условие для фильтрации заголовка под названием subject, на основе шаблона "some text".


1) Требуется отфильтровать в спам все письма, содержащие в теме различные варианты слова viagra. Для этого можно создать новое черное правило с условием такого вида:

Header{Subject} =~ v.{0,2}i.{0,2}a.{0,2}g.{0,2}r.{0,2}a

Под данный шаблон подпадут слова, которые содержат буквы слова viagra в том же порядке, с некоторым количеством любых других символов между ними (числом от 0 до 2). Т.е. например шаблоном будут распознаны такие слова как v11i22agra, viaaggra и т.п. В шаблоне символ '.' используется как замена любого другого символа, а конструкция вида "{0,2}" сразу после точки означает что в этом месте может находиться комбинация из любых символов количеством от 0 до 2.


2) Нужно отфильтровать в спам все заголовки, в которых одновременно встречаются восклицательный и вопросительный знаки. Создаем черное правило с условием вида:

Header{Subject} =~ \?.*!|!.*\?

Символ '?' является специальным, поэтому чтобы он воспринимался в шаблоне как простой знак вопроса нужно поставить перед ним в шаблоне символ '\' (квотировать). Символ '*' после точки означает, что предыдущий символ может встретиться в тексте 0 или более раз. Шаблон состоит из двух условий, разделенных знаком '|'. В первой части шаблона ищутся строки где сначала идет вопросительный знак, потом восклицательный. Во второй части наоборот ищутся строки где восклицательный знак встречается первым. Под шаблон подпадают оба случая, т.к. знак '|' означает логическую операцию ИЛИ.


3) Нужно отфильтровать в спам варианты слова viagra, где вместо символа i может стоять один из следующих символов - "1lj".

Header{Subject} =~ v[1lj]agra

В квадратных скобках шаблона перечислены возможные символы на месте 'i'. Т.е. распознаются все варианты: v1agra, vlagra, vjagra.
4) Надо чтобы все письма с определенной строкой в тексте не фильтровались. Для этого создадим белое правило такого вида:

Body =~ ключевая_строка

Фильтр будет искать строку "ключевая_строка" в теле письма и распознавать такие сообщения как не-спам.

5) Удаление писем с пустым адресом отправителя (черное правило):

not Header{From} =~ \S+ 

6) Удаление писем, направленных на определенный почтовый ящик, но не содержащих адреса этого ящика в полях To и CC (черное правило с тремя условиями):

Header{Received} =~ mailbox@domain\.com
not Header{To} =~ mailbox@domain\.com
not Header{CC} =~ mailbox@domain\.com

Где mailbox@domain.com – это адрес вашего ящика. Первое условие проверяет, что письмо направлено именно на указанный адрес. Остальные два условия проверяют наличие указанного адреса в полях To и CC. Правило срабатывает когда удовлетворены все условия, т.е. письмо пришло на определенный ящик и не содержит его адреса ни в поле To, ни в CC.
Если у вас есть несколько почтовых ящиков, то можно создать по такому правилу для каждого из них.

7) Блокировка писем в определенной кодировке (черное правило):

Header{Content-Type} =~ iso-2022-jp

Данное правило будет блокировать письма в японской кодировке. Чтобы блокировать другие кодировки нужно подставить в выражении условия нужное название.

8) Блокировка писем с несколькими адресами в поле To, с несколькими одинаковыми символами в начале названия почтовых ящиков (черное правило):


Header{To} =~ \b<?([\w\-.]{2})[^@, ]*@.*(?:\b<?\1[^@, ]*@.*){3}

 

Данное правило будет блокировать письма с 4 или более адресов в поле To, которые имеют одинаковые первые 2 символа. В условии первое число {2} задает количество символов в начале адреса для сравнения. Число {3} в конце выражения задает минимальное количество адресов с одинаковыми символами в начале минус один, необходимое для срабатывания правила. Т.е. для поиска например минимум пяти адресов, в конце выражения {3} надо заменить на {4}.

9) Если нужно чтобы некоторое правило срабатывало только для определенного почтового ящика, то нужно добавить в него еще одно условие:

Header{Received} =~ mailbox@domain\.com

Где mailbox@domain.com – адрес почтового ящика, для которого должно работать правило. 



Для проверки регулярных выражений можно использовать утилиту RegExpCheck.

Набор готовых черных правил для фильтрации спама можно скачать отсюда:
http://antispamsniper.com/ru/misc/black_rules.zip

Правила нужно импортировать из файла на странице редактирования черных правил. Имейте ввиду, что черные правила используются для однозначного распознавания писем как спам и как следствие фильтр будет удалять соответствующие сообщения с сервера, если они не подпадают ни под одно из белых правил или других белых условий. Перед использованием фильтра требуется проверить в режиме тестирования, что ни одно из сохраненных нормальных писем не подпадает под черные правила. Если такое все таки произойдет, то можно отключить ненужные правила убрав галку у пункта в соответствующем списке.



Основные правила и метасимволы регулярных выражений.


1. Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним '\'.
2. Строка символов обозначает строку этих символов.
3. Множество возможных символов (класс) заключается в квадратные скобки '[]', это значит, что в данном месте может стоять один из указанных в скобках символов. Если первый символ в скобках это '^' - значит ни один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ '-', обозначающий диапазон символов. Например, a-z - один из малых букв латинского алфавита, 0-9 - цифра и т.д.
4. Все символы, включая специальные, можно обозначать с помощью '\' как в языке С.
5. Альтернативные последовательности разделяются символом '|' Заметьте что внутри квадратных скобок это обычный символ.
6. Внутри регулярного выражения можно указывать "подшаблоны" заключая их в круглые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.

 

\ - считать следующий метасимвол как обычный символ.
^ - начало строки
. - один произвольный символ. Кроме '\n' - конец строки.
$ - конец строки
| - альтернатива (или)
() - группировка
[] - класс символов

Метасимволы имеют модификаторы (пишутся после метасимвола):
* - повторяется 0 или большее число раз
+ - повторяется 1 или большее число раз
? - 1 или 0 раз
{n} - точно n раз
{n,} - по меньшей мере раз
{n,m} - не меньше n, но и не больше m

Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,} , '+' - {1,} и '?' - {0,1}. n и m не могут быть больше 65536.

\t - символ табуляции
\n - новая строка
\r - перевод каретки
\а - перевод формата
\v - вертикальная табуляция
\a - звонок
\e - escape
\033 - восьмеричная запись символа
\x1A - шестнадцатеричная
\c[ - control символ
\l - нижний регистр следующего символа
\u - верхний регистр -//-
\L - все символы в нижнем регистре до \E
\U - в верхнем -//-
\E - ограничитель смены регистра
\Q - отмена действия как метасимвола

\w - алфавитно-цифровой или '_' символ
\W - не алфавитно-цифровой символ
\s - один пробел
\S - один не пробел
\d - одна цифра
\D - одна не цифра

\b - граница слова
\B - не граница слова
\A - начало строки
\Z - конец строки