Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Методики борьбы со СПАМом


Автор: neosapient 27.2.2007, 14:45
Здравствуйте.

Уверен, что пишу не в ту ветку форума (прошу модераторов подкоректировать мой выбор), но надеюсь, что нужные мне  светлые головы здесь найдутся  smile 

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

И вот свершилось! первая более менее интерестная тема - сделать спам фильтр для почтового клиента...

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

Еще краем уха слышал, что где то есть черные списки ПК рассылающих спам по сети, но вроде бы эти списки уже не справляются с объемами (задачами) и их решили закрыть.

Вопросы, пока теоретические:
1) Какие типы спама бывают?
2) Какие методики борьбы со СПАМом Вам известны? Думаю, штук 7-11 вполне хватит...
3) Чем опастны письма? Понятно, что это трафик, забитость каналов, а к письму может быть прикреплен архив с вирусами или троянец, но еще что?
4) Как ловят спамеров? Их вообще как-то ловят? Какие спицифические улики выводят на спамеров?
5) За что сажают у нас и за бугром? Какие статьи УК есть?
6) Есть ли исхоники антиспамовских программ в интернете?

Есть ли шанс написать приличную (всмысле на 5) баколаврскую работу по этой теме?

З.Ы.
Ну, думаю, если шанс есть, то не буду создавать новых веток, здесь собирем обширный материал рунета и будем обсуждать ключевые места кода.

Автор: ptr 28.2.2007, 18:32
Цитата(neosapient @  27.2.2007,  17:45 Найти цитируемый пост)
1) Какие типы спама бывают?

Смотря по каким критериям делить.

Цитата(neosapient @  27.2.2007,  17:45 Найти цитируемый пост)
2) Какие методики борьбы со СПАМом Вам известны?

Методики борьбы или определения спама?

Цитата(neosapient @  27.2.2007,  17:45 Найти цитируемый пост)
3) Чем опастны письма? Понятно, что это трафик, забитость каналов, а к письму может быть прикреплен архив с вирусами или троянец, но еще что?

Ну, наверно, почти всё ты и перечислил. Я бы ещё добавил мошенничества.

Цитата(neosapient @  27.2.2007,  17:45 Найти цитируемый пост)
4) Как ловят спамеров? Их вообще как-то ловят?

Как-то ловят smile .

Цитата(neosapient @  27.2.2007,  17:45 Найти цитируемый пост)
6) Есть ли исхоники антиспамовских программ в интернете?

Есть.

Ветка кстати  не та.

Цитата(neosapient @  27.2.2007,  17:45 Найти цитируемый пост)
Есть ли шанс написать приличную (всмысле на 5) баколаврскую работу по этой теме?

Думаю можно. Кстати ты будешь бакалавром smile .

Автор: neosapient 28.2.2007, 18:47
Ответ конечно веселый, но...

1) По каким критериям можно делить спам, какие виды спама принадлежат к определенному критерию?
2) Интерисуют методики борьбы, чтоб реализовать. Кстати, к фильтрации по ключевым словам нашел статьи по вычислению спамерского ПК http://antispam.ru


Цитата

Цитата

6) Есть ли исхоники антиспамовских программ в интернете?

Есть.

Дай ссылочку  smile  smile 

Автор: ptr 4.3.2007, 16:07
Цитата(neosapient @  28.2.2007,  21:47 Найти цитируемый пост)
Ответ конечно веселый, но...

Какие вопросы - такие и ответы.

Цитата(neosapient @  28.2.2007,  21:47 Найти цитируемый пост)
1) По каким критериям можно делить спам, какие виды спама принадлежат к определенному критерию?

Например:
1. По способам распространения: e-mail, sms и т.д.
2. По типу содержимого: реклама, разного рода мошенничества, вирусные рассылки, рассылки для блокирования или вывода из строя почтовой системы и т.д.

Цитата(neosapient @  28.2.2007,  21:47 Найти цитируемый пост)
2) Интерисуют методики борьбы, чтоб реализовать.

Основные методики - "цветные" списки, ну и широко распространённый Байес.

Цитата(neosapient @  28.2.2007,  21:47 Найти цитируемый пост)
Дай ссылочку

Ну например http://spamassassin.apache.org/. Правда я не уверен что он тебе поможет.

Автор: neosapient 5.3.2007, 09:00
OK
Нашел ссылку www.spamtest.ru

Автор: neosapient 25.3.2007, 17:17
В продолжении вопроса "http://forum.vingrad.ru/index.php?showtopic=141919" родился новый:
Как я могу отослать себе письмо
Я указываю SMTP сервером localhost, но вот какое имя почтового ящика указать теряюсь.
Как то термины в справке мелкософта  с моими расходяться.

Вообщем так: надо настроить SMTP сервер на своей машине и отослать туда письмо из моей программы...
Помогите

Автор: drZmeu 26.3.2007, 11:40
neosapient читай форум про smtp есть много чего... smile 

Автор: neosapient 26.3.2007, 21:06
Цитата

neosapient читай форум про smtp есть много чего...   

Читал и даже пытался что то сделать:
http://forum.vingrad.ru/topic-116427/hl/smtp/index.html, кстати всем помогавшим спасибо  smile 

Сейчас вопрос стоит так: надо настроить SMTP сервер на своей машине и отослать туда письмо из моей программы

Автор: ptr 27.3.2007, 05:19
Цитата(neosapient @  25.3.2007,  20:17 Найти цитируемый пост)
Я указываю SMTP сервером localhost,

Подключаешься к туда, где у тебя стоит сервер. Если на локальной машине, то на localhost.

Цитата(neosapient @  25.3.2007,  20:17 Найти цитируемый пост)
но вот какое имя почтового ящика указать теряюсь.

Почтовые ящики надо создавать на сервере.

Да и кстати какой сервер?

Автор: neosapient 27.3.2007, 11:11
Цитата

Подключаешься к туда, где у тебя стоит сервер. Если на локальной машине, то на localhost.

Этот логический вывод Я смог сделать САМ - значит несовсем безнадежен  smile 

Цитата

Да и кстати какой сервер? 

Сервер от M$ под WinXP SP2 Pro
Добывается здесь:
- ПУСК 
- Настройка
- Панель иправления
- Установка и удаление программ
- Вкладка "Установка компонентов Windows" - Выделяешь "Internet Information Services (IIS)"
- Нажимаешь на кнопку "Состав"
- Ставишь галачку напротив "Служба SMTP" (автоматически выделяться дополнительно необходимые компоненты).

Цитата

Почтовые ящики надо создавать на сервере.

В этом хуже, как их создавать не разобрался.
Когда слал, то ожидал сообщений об ошибках в папках для отчетов, но ничего не приходило.

Можешь посоветовать другой SMTP-сервер, чтоб поставить локально на своей машине, и имел интуитивно понятный интерфейс?

Автор: ptr 27.3.2007, 14:19
Цитата(neosapient @  27.3.2007,  14:11 Найти цитируемый пост)
Можешь посоветовать другой SMTP-сервер, чтоб поставить локально на своей машине, и имел интуитивно понятный интерфейс?

Посмотри, например, http://www.hmailserver.com/.

Автор: neosapient 27.3.2007, 14:41
что-то я хелпа не нашел, а закладок много.
Помоги создать почтовый ящик в этой програмке

Автор: Бонифаций 27.3.2007, 14:46
Я думаю Вам интересно будет прочитать  работу Грэхема "A plan for spam" о применении обучаемых Баесовских фильтров против спама. На ее основе сейчас работает большинство коммерческих и опен-сорсных спам-фильтров

http://www.paulgraham.com/spam.html

Автор: neosapient 27.3.2007, 18:56
Спасибо, интерестно будет почитать

Автор: ptr 28.3.2007, 06:08
Цитата(neosapient @  27.3.2007,  17:41 Найти цитируемый пост)
что-то я хелпа не нашел, а закладок много.

http://www.hmailserver.com/documentation/ smile .

Цитата(neosapient @  27.3.2007,  17:41 Найти цитируемый пост)
Помоги создать почтовый ящик в этой програмке

http://www.hmailserver.com/documentation/v4.3/?page=basic_configuration

Кстати о книгах. Думаю http://openlib.org.ua/ru/books/id/197/ будет тебе полезна.

Автор: neosapient 28.3.2007, 22:55
PTR, ты как всегда выручаешь  smile 
За ссылки спасибо, обязательно завтра просмотрю (сегодня времени нет)
А беглый осмотр показал - книжка весьма интерестная

Автор: neosapient 4.4.2007, 22:21
Цитата

Цитата

Помоги создать почтовый ящик в этой програмке

http://www.hmailserver.com/documentation/v...c_configuration


Ящик вроде создался smile

Но вот через telnet к нему не подключиться

Автор: ptr 5.4.2007, 11:00
Цитата(neosapient @  5.4.2007,  01:21 Найти цитируемый пост)
Но вот через telnet к нему не подключиться 

И в чём проблема?

Автор: neosapient 8.4.2007, 18:43
Цитата

И в чём проблема? 

Глобально проблема стоит так: для почтового ящика не задать пароль...

Подключался через telnet к своей машине - localhost
Работал по протоколу SMTP (там не требуется авторизации) и всё хорошо проходило.
Работал по протоколу ESMTP, и авторизацию пройти не удалось.

Сейчас пытаюсь написать класс для протокола POP3, но там также нужна авторизация

Значит так. 
На локальной машине localhost установлен hMailServer. 
На нем создан домен something.com
Далее создан почтовый ящик ken (задать пароль почтовому ящику неудается... :( smile  )

Вот собственно и весь диалог с  hMailServer...
Код

+OK POP3
User ken
+OK Send your password          <-- Причем такой ответ и для несуществующих ящиков
Pass ken
-ERR Invalid user name or password. Please use full email address as user name.
Quit
+OK POP3 server saying goodbye...

Автор: neosapient 8.4.2007, 21:43
Вот еще проблемка

Протокол POP3. Вызов LIST
Должно
Код

CLIENT: LIST
SERVER: +ОК 2 messages (320 octets)
SERVER: 1 120
SERVER: 2 200
SERVER: . ...


по факту отрабатывает
Код

SERVER: +ОК 2 messages (320 octets)


То есть функция recv(...) за один раз принимает только первую строку вплоть до "\n\r"

А при повторном вызове виснет. Типа сервер ничего в неё не шлет, а наоборот ждет что-то от меня, но ЧТО?

Автор: ptr 17.4.2007, 13:23
Цитата(neosapient @  8.4.2007,  21:43 Найти цитируемый пост)
<-- Причем такой ответ и для несуществующих ящиков

А как ты хотел? Чтобы ты ввёл имя ящика и тебе сразу сказали, что его нет. Это же мечта спаммера.

Тебе уже всё написали. Пользователь [email protected].
Цитата(neosapient @  8.4.2007,  21:43 Найти цитируемый пост)
-ERR Invalid user name or password. Please use full email address as user name.


Цитата(neosapient @  8.4.2007,  21:43 Найти цитируемый пост)
Глобально проблема стоит так: для почтового ящика не задать пароль...

Ну ты блин даешь smile .
В accounts->... есть поле Account password: <<ENCRYPTED>>.

Автор: neosapient 17.4.2007, 15:21
Цитата(ptr @  17.4.2007,  13:23 Найти цитируемый пост)
Цитата(neosapient @  8.4.2007,  21:43 )
Цитата

Глобально проблема стоит так: для почтового ящика не задать пароль...

Ну ты блин даешь  .
В accounts->... есть поле Account password: <<ENCRYPTED>>. 

пароль ввожу, но он не фиксируется

Автор: ptr 17.4.2007, 15:49
Цитата(neosapient @  17.4.2007,  18:21 Найти цитируемый пост)
пароль ввожу, но он не фиксируется

В смысле не фиксируется? Ты "применить" нажимал?

Автор: neosapient 28.4.2007, 19:01
Цитата

В смысле не фиксируется? Ты "применить" нажимал? 

нажимал

Ладно, основноё вопрос сейчас другой:
Цитата(neosapient @  8.4.2007,  21:43 Найти цитируемый пост)
Протокол POP3. Вызов LIST
...
То есть функция recv(...) за один раз принимает только первую строку вплоть до "\n\r"
А при повторном вызове виснет. Типа сервер ничего в неё не шлет, а наоборот ждет что-то от меня, но ЧТО?




Автор: ptr 29.4.2007, 14:29
Выкладывай код (там где приём данных и где виснет).

Автор: neosapient 30.4.2007, 18:10
Цитата(ptr @  29.4.2007,  14:29 Найти цитируемый пост)
Выкладывай код (там где приём данных и где виснет). 

Там сам разобрался
Была одна грубая ошибка  - после логина  и после пароля ставил пробел и лишь затем "\r\n"
И другая вещь, после отправки LIST, надо отправить NOOP

Сейчас другая проблема, 
отправляю RETR, получаю размер письма
отправляю NOOP, получаю неполный заголовок письма
а как дальше получить оставшуюся часть письма?

В моей программе получение письма происходит в
файле TProtocolPOP3.cpp
методе GetMessage(...)
case 3: ...
if(i==3){
/*вот тут собственно и происходит поучение письма*/
}


Автор: ptr 2.5.2007, 14:14
Какие ещё NOOP? Зачем?
Я уже устал говорить, что send/recv отправляет/принимает байт не больше, чем ему сказано.

Автор: neosapient 2.5.2007, 14:57
А ты попробуй в функции GetListID закомментировать 
send(nSMTPServerSocket, (LPSTR)"NOOP\r\n", strlen("NOOP\r\n"), 0);
будут проблемы - всех данных не получишь и подвиснишь.

Автор: ptr 3.5.2007, 15:30
Ну закоментировал я NOOP. Ну да всё повисает. Но это уже твоя ошибка. Ты где-то лишний recv вызываешь. Да и убери все sleep.

Автор: neosapient 3.5.2007, 15:52
recv не лишнее, так как 
сначала приходит +ОК 2 messages (320 octets), 
и только при повторном recv (на котором виснет) получает список
1 120
2 200
А вот если ставить NOOP перед вторым вызовом recv (на котором виснет), то все отлично получается.

А Sleep`ы нужны для мелких задержек, так как сервер не справляется со скоростью формирования ответов (или я быстро закрываюсь). При наличии Sleep`ов сервер успевает сформировать полный ответ для меня

Так что так...

Эти вещи нужны, я шишки на них набил - значит нужны

Автор: neosapient 4.5.2007, 22:58
А... переписал в более цивильный вид - всё нормально работает, теперь буду искать ошибку в классах

Автор: ptr 5.5.2007, 07:57
Уже лучше. Я бы ещё добавил функцию чтения строки (до \r\n) и записи всей строки в сокет.

Автор: neosapient 6.5.2007, 13:35
Переписал класс (не полностью - местами)
Ну что в итоге - есть ошибки диагностируемые и не очень... :(

У меня есть метод 
char* TProtocolPOP3::iFindFirstInt(char* pzStr,int& iNum);
В первый параметр передается указатель на строку. Символы в строке перебераются, пока не получу ближайшее число. Через второй параметр это число возвращается. А сама функция возвращает указатель на первый символ после числа в исходной строке, либо ноль при неудаче.

Но проблема не в этом методе, а в операции new.
Есть метод, который помогает узнать список писем.
TProtocolPOP3::GetListID(int*& piMessageID, int*& piMessageSize, int& iNumMessage)
При первом запуске iFindFirstInt(...) из полученого с сервера сообщения узнаю, сколько писем в списке.
    // ищем кол-во писем
    ptr = iFindFirstInt(psBuf,iNumMessage);
Но далее, пытаюсь выделить память, а оператор new возвращает NULL
    // создаем возвращаемые переменные
    piMessageID = new int [iNumMessage];
    piMessageSize = new int [iNumMessage];
    if(piMessageID==NULL)return 0;
    if(piMessageSize==NULL)return 0;
Вопрос, почему в данной ситуации new не выделяет память? Как сделать так, чтоб память выделялась?

P.S. Такая фигня в VC7, в VC6 все  нормально работает

Автор: ptr 14.5.2007, 05:02
А что регулярные выражения уже не в моде? Ты уверен что new передаётся положительное число?

Автор: neosapient 14.5.2007, 14:23
Sorry, ненаписал, что вопрос уже решен
http://forum.vingrad.ru/forum/topic-149872/view-all/hl/neosapient/index.html

Вот рабочий вариант

Автор: neosapient 3.6.2007, 16:10
Продолжаем

Ищю ТЕМУ письма
вот с rambler.ru её вырезал

Subject: =?Windows-1251?B?UnVzRkFRLnJ1IC0gLyDKzszP3N7SxdDbIMggz84gLyDf5/vq6CDv8A==?=
 =?Windows-1251?B?7uPw4Ozs6PDu4uDt6P8gLyBDL0MrKw==?=

эквивалентно

RusFAQ.ru - / КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Какой функцией воспользоваться чтобы преобразовать первое во второе?

Автор: ptr 3.6.2007, 17:27
Это base64. Ну и win-1251.

Автор: neosapient 4.6.2007, 09:10
Цитата

base64

Думаю точно также, но... Заюзал для расшифровки Base64Decode(...), которая выполняется с ошибкой.

Автор: korbian 4.6.2007, 13:36
в base64 входят символы: 
  •  A-Z, a-z(верхний и нижний регистр латинских буквы)
  •  0-9 (цифры)
  •  + и /
откинь лишние символы и декодируй

Автор: ptr 4.6.2007, 14:54
neosapient, надеюсь ты не всю строку декодировал?

Расшифровываю:
=? - маркер начала.
Win-1251 - кодировка.
? - разделитель.
B - тип кодирования (B - base64, Q - Quoted-printable).
? - разделитель.
UnVzRkFRLnJ1IC0gLyDKzszP3N7SxdDbIMggz84gLyDf5/vq6CDv8A== - текст.
?= - маркер конца.
Для второй строки аналогично.

Таким образом надо декодировать VzRkFRLnJ1IC0gLyDKzszP3N7SxdDbIMggz84gLyDf5/vq6CDv8A== (RusFAQ.ru - / КОМПЬЮТЕРЫ И ПО / Языки пр) и 7uPw4Ozs6PDu4uDt6P8gLyBDL0MrKw== (ограммирования / C/C++).

А вообще почитай RFC 4096 и 2047.

Автор: neosapient 14.6.2007, 21:04
Теперь новая задача.
Не связаная напрямую с программированием.
Мне надо найти статистику по уровням фильтрации спама и уровням ложных срабатываний самых распрастраненных спам-фильтров (лучше для клиентских приложений)
Сводную таблицу через поиск в яндексе найти не удалось :(

Автор: korbian 15.6.2007, 12:56
Цитата(neosapient @  14.6.2007,  22:04 Найти цитируемый пост)
уровням ложных срабатываний самых распрастраненных спам-фильтров

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

Автор: neosapient 30.6.2007, 14:33
Сравнительный анализ серверных спам-фильтров


Название                 Используемые технологии           Фильтрация/УЛС
Brightmail                 лексические, сигнатурные,          95% / 0,0001%
                                фильтры URL    

Skeptic                     проверки IP,                                  95% / 0,0004% 
                                эвристические методы, 
                                 поддержка Unicode, 
                                 байесовая оценка    

MailShell                   сигнатурный детектор                  99% / нет (в тестах производителя)
                                 массовых рассылок, 
                                эвристические методы, 
                                байесовая оценка    

SpamAssassin         эвристические методы,                  70-98% / 0.0014-0.15%
                                байесовая оценка    

Спамтест                лингвистические эвристики            85-95% / 0,001-0.005%

Спамооборона       сигнатурный детектор                    90% / 0,001%
                               массовых рассылок    

Всем спасибо
Ptr +

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)