You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.utf8.txt 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. API Rspamd.
  2. ===========
  3. API rspamd описано подробно в Doxygen документации.
  4. Логика работы фильтров rspamd.
  5. ==============================
  6. 1) Все фильтры регистрируются в конфиг файле в описании цепочек фильтров:
  7. header_filters=regexp,my_func
  8. где имя фильтра - это либо название c модуля, либо название перл функции
  9. Типы фильтров:
  10. * header_filters - фильтр заголовков
  11. * mime_filters - фильтр для каждой mime части
  12. * message_filters - фильтр всего сообщения целиком
  13. * url_filters - фильтры URL ссылок
  14. Свои результаты фильтры регистрируют при помощи добавления результата в метрику.
  15. 2) Метрика - это символьное значение, в котором регистрируют свои результаты фильтры
  16. Существует метрика по умолчанию - "default", в которой регистрируют результаты фильтры,
  17. для которых явно не определена метрика
  18. Для каждой метрики существует специальная функция консолидации, которая рассчитывает коэффициенты
  19. результатов согласно внутренней логике соответствия символов и коэффициентов. По умолчанию такой
  20. функцией является простая сумма, которая настраивается особым образом в конфигурационном файле:
  21. # Блок factors
  22. factors {
  23. # Например, "SURBL_DNS"=5.0
  24. "SYMBOL_NAME" = coefficient;
  25. };
  26. Также для метрики можно зарегистрировать особую функцию, прописав в описании метрики
  27. metric {
  28. name = "test_metric";
  29. function = "some_function";
  30. required_score = 20.0;
  31. };
  32. Пока поддерживаются только перловые функции.
  33. 3) Результат - это пара значений: SYMBOL:FLAG, при этом, SYMBOL - это
  34. строчка, характеризующая результат, а FLAG - сработал данный фильтр или нет
  35. (1 или 0). Результат добавляется в метрику, после чего передается функции консолидации.
  36. 4) Итог - на выходе мы имеем обработанное сообщение, список метрик и их символов и результаты
  37. проверки.
  38. Протокол.
  39. =========
  40. Формат ответа:
  41. SPAMD/1.1 0 EX_OK
  42. \ / \/
  43. Версия Код
  44. ошибки
  45. Spam: False ; 2 / 5
  46. Это формат совместимости с sa-spamd (без метрик)
  47. Новый формат ответа:
  48. RSPAMD/1.0 0 EX_OK
  49. Metric: Name; Spam_Result; Spam_Mark / Spam_Mark_Required
  50. Metric: Name2 ; Spam_Result2 ; Spam_Mark2 / Spam_Mark_Required2
  51. Заголовков типа metric может быть несколько.
  52. Формат вывода символов:
  53. SYMBOL1, SYMBOL2, SYMBOL3 -- формат совместимости с sa-spamd
  54. Symbol: Name; Param1,Param2,Param3 -- формат rspamd
  55. Формат ответа зависит от формата запроса:
  56. PROCESS SPAMC/1.2
  57. \ / \ /
  58. Команда Версия
  59. SPAMC - протокол совместимости с sa-spamd
  60. RSPAMC - новый протокол rspamd
  61. В любом из режимов работы поддерживаются следующие заголовки:
  62. Content-Length - длина сообщения
  63. Helo - HELO, полученный от клиента
  64. From - MAIL FROM
  65. IP - IP клиента
  66. Recipient-Number - число реципиентов
  67. Rcpt - реципиент
  68. Queue-ID - идентификатор очереди
  69. Эти значения могут использоваться в фильтрах rspamd.
  70. Регулярные выражения
  71. ====================
  72. Регулярные выражения разбираются модулем regexp, поэтому их настройка выглядит следующим образом
  73. .module 'regexp' {
  74. SYMBOL = "regexp_expression";
  75. };
  76. header_filters = "regexp";
  77. Обратите внимание, что модуль regexp надо регистрировать как header filter, так как иначе он не будет работать.
  78. Эту проблему надо исправлять, но это не первоочередная задача.
  79. Формат регэкспов такой:
  80. /pattern/flags
  81. При этом может быть такой формат:
  82. headername=/pattern/flags
  83. если регэксп ищет соответствие хедера и выражения
  84. Флаги регэскпов:
  85. i, m, s, x, u, o - такие же, как у perl/pcre
  86. r - "сырой" незакодированный в utf8 regexp
  87. H - ищет по заголовкам
  88. M - ищет по всему сообщению (в "сыром" виде)
  89. P - ищет по всем mime частям
  90. U - ищет по url
  91. X - ищет по "сырым" хедерам (тут нужно учитывать фолдинг и ставить, где надо, /m для multiline матчинга)
  92. Выражение регэкспов может содержать сложные выражения из нескольких регэкспов, операторов логики и скобок:
  93. SOME_SYMBOL = "To=/blah@blah/H & !(From=/blah@blah/H | Subject=/blah/H)"
  94. Также можно использовать переменные:
  95. $to_blah = "To=/blah@blah/H";
  96. $from_blah = "From=/blah@blah/H";
  97. $subject_blah = "Subject=/blah/H";
  98. тогда предыдущее выражение будет таким
  99. SOME_SYMBOL = "${to_blah} & !(${from_blah} | ${subject_blah})"
  100. Логические выражения rspamd
  101. ===========================
  102. Условия, содержащие регулярные выражения, функции, логические операции, скобки, могут использоваться
  103. для задания правил фильтрации. Общие правила работы:
  104. - логическими операциями могут быть логическое "И": '&', логическое "ИЛИ": '|' и логическое отрицание:
  105. '!'.
  106. - приоритет логических операций такой: & и | -> !, для изменения приоритета можно пользоваться скобками:
  107. (A&!B) | !(C|D)
  108. - пробелы в выражениях игнорируются
  109. - операнд, содержащий /re/args или же string=/re/args считается регулярным выражением, внутри регулярного
  110. выражения все символы '/' и '"' должны экранироваться символом '\'. Сам '\' при этом экранировать не нужно.
  111. - операнд, который принимает аргументы, считается функцией, аргументом функции может являться другая функция,
  112. при этом порядок вызова функций-аргументов - справа налево (как это сделано в gcc)
  113. - в rspamd встроен ряд функций:
  114. * header_exists - принимает в качестве аргумента имя хедера, возвращает true, если такой заголовок существует
  115. * compare_parts_distance - принимает в качестве аргумента число от 0 до 100, которое отражает разницу в процентах
  116. между частями письма. Функция работает с сообщениями, содержащими 2 текстовые части (text/plain и text/html) и
  117. возвращает true тогда, когда эти части различаются более чем на n процентов. Если аргумент не указан, то
  118. по умолчанию ищется различие в 100% (полностью разные части).
  119. * compare_transfer_encoding - сравнивает Content-Transfer-Encoding с заданной строкой
  120. * content_type_compare_param - сравнивает параметр content-type заголовка с регулярным выражением или строкой:
  121. content_type_compare_param(Charset, /windows-\d+/)
  122. content_type_compare_param(Charset, ascii)
  123. * content_type_has_param - проверяет, есть ли в заголовке content-type определенный параметр
  124. * content_type_is_subtype - сравнивает подтип content-type с регулярным выражением или строкой
  125. * content_type_is_type - сравнивает тип content-type с регулярным выражением или строкой
  126. content_type_is_type(text)
  127. content_type_is_subtype(/?.html/)
  128. * regexp_match_number - принимает в качестве первого параметра число, которое означает порог сработавших регэкспов и
  129. список регэкспов или функций, которые должны проверяться. Если число сработавших регэкспов или функций больше порога,
  130. функция возвращает TRUE, иначе - FALSE, например:
  131. regexp_match_number(2, ${__RE1}, ${__RE2}, header_exists(Subject))
  132. * has_only_html_part - функция возвращает TRUE, если в сообщении есть только одна HTML часть
  133. * compare_recipients_distance - вычисляет процент схожих получателей письма. Принимает аргумент - порог в процентах похожести.
  134. * is_recipients_sorted - возвращает TRUE, если список получателей сортирован (работает только если число получателей >= 5).
  135. * is_html_balanced - возвращает TRUE, если теги всех html частей сбалансированы
  136. * has_html_tag - возвращает TRUE, если заданный html тег найден
  137. Модуль chartable.
  138. ================
  139. Модуль предназначен для поиска слов со смешанными символами, например:
  140. kашa - часть в латинице, а часть в кириллице.
  141. Параметры модуля:
  142. .module 'chartable' {
  143. metric = "default";
  144. symbold = "R_MIXED_CHARSET";
  145. threshold = "0.1";
  146. };
  147. threshold - это отношение переходов между кодировками к общему числу символов в словах, например, имеем слово
  148. "kаша" (первая буква латинская), тогда общее число переходов - 3, а число переходов между кодировками - 1, тогда
  149. отношение - 1/3.
  150. Для включения модуля его необходимо добавить в список mime_filters:
  151. mime_filters = "chartable";