Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Сети > Методики борьбы со СПАМом |
Автор: neosapient 27.2.2007, 14:45 |
Здравствуйте. Уверен, что пишу не в ту ветку форума (прошу модераторов подкоректировать мой выбор), но надеюсь, что нужные мне светлые головы здесь найдутся ![]() Пришло время начать делать бакалаворскую. Долго искал темы, те что выбирал Я, не могли осилить преподы (у них свой специфический круг знаний), те темы что предлагались мне, немог осилить я (уж очень специфичны, не интерестны и трудаемки по времени). И вот свершилось! первая более менее интерестная тема - сделать спам фильтр для почтового клиента... Вот только в моем представлении, это небольшая функция, которая просматривает текст письма и сверяет по базе, на наличие незаконных словосочетаний. Еще краем уха слышал, что где то есть черные списки ПК рассылающих спам по сети, но вроде бы эти списки уже не справляются с объемами (задачами) и их решили закрыть. Вопросы, пока теоретические: 1) Какие типы спама бывают? 2) Какие методики борьбы со СПАМом Вам известны? Думаю, штук 7-11 вполне хватит... 3) Чем опастны письма? Понятно, что это трафик, забитость каналов, а к письму может быть прикреплен архив с вирусами или троянец, но еще что? 4) Как ловят спамеров? Их вообще как-то ловят? Какие спицифические улики выводят на спамеров? 5) За что сажают у нас и за бугром? Какие статьи УК есть? 6) Есть ли исхоники антиспамовских программ в интернете? Есть ли шанс написать приличную (всмысле на 5) баколаврскую работу по этой теме? З.Ы. Ну, думаю, если шанс есть, то не буду создавать новых веток, здесь собирем обширный материал рунета и будем обсуждать ключевые места кода. |
Автор: neosapient 28.2.2007, 18:47 | ||||
Ответ конечно веселый, но... 1) По каким критериям можно делить спам, какие виды спама принадлежат к определенному критерию? 2) Интерисуют методики борьбы, чтоб реализовать. Кстати, к фильтрации по ключевым словам нашел статьи по вычислению спамерского ПК http://antispam.ru
Дай ссылочку ![]() ![]() |
Автор: ptr 4.3.2007, 16:07 | ||
Какие вопросы - такие и ответы.
Например: 1. По способам распространения: e-mail, sms и т.д. 2. По типу содержимого: реклама, разного рода мошенничества, вирусные рассылки, рассылки для блокирования или вывода из строя почтовой системы и т.д. Основные методики - "цветные" списки, ну и широко распространённый Байес. Ну например 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 есть много чего... ![]() |
Автор: neosapient 26.3.2007, 21:06 | ||
Читал и даже пытался что то сделать: http://forum.vingrad.ru/topic-116427/hl/smtp/index.html, кстати всем помогавшим спасибо ![]() Сейчас вопрос стоит так: надо настроить SMTP сервер на своей машине и отослать туда письмо из моей программы |
Автор: ptr 27.3.2007, 05:19 |
Подключаешься к туда, где у тебя стоит сервер. Если на локальной машине, то на localhost. Почтовые ящики надо создавать на сервере. Да и кстати какой сервер? |
Автор: neosapient 27.3.2007, 11:11 | ||||||
Этот логический вывод Я смог сделать САМ - значит несовсем безнадежен ![]()
Сервер от M$ под WinXP SP2 Pro Добывается здесь: - ПУСК - Настройка - Панель иправления - Установка и удаление программ - Вкладка "Установка компонентов Windows" - Выделяешь "Internet Information Services (IIS)" - Нажимаешь на кнопку "Состав" - Ставишь галачку напротив "Служба SMTP" (автоматически выделяться дополнительно необходимые компоненты).
В этом хуже, как их создавать не разобрался. Когда слал, то ожидал сообщений об ошибках в папках для отчетов, но ничего не приходило. Можешь посоветовать другой SMTP-сервер, чтоб поставить локально на своей машине, и имел интуитивно понятный интерфейс? |
Автор: ptr 27.3.2007, 14:19 | ||
Посмотри, например, 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 |
http://www.hmailserver.com/documentation/ ![]() 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, ты как всегда выручаешь ![]() За ссылки спасибо, обязательно завтра просмотрю (сегодня времени нет) А беглый осмотр показал - книжка весьма интерестная |
Автор: neosapient 4.4.2007, 22:21 | ||||
Ящик вроде создался ![]() Но вот через telnet к нему не подключиться |
Автор: ptr 5.4.2007, 11:00 |
И в чём проблема? |
Автор: neosapient 8.4.2007, 18:43 | ||||
Глобально проблема стоит так: для почтового ящика не задать пароль... Подключался через telnet к своей машине - localhost Работал по протоколу SMTP (там не требуется авторизации) и всё хорошо проходило. Работал по протоколу ESMTP, и авторизацию пройти не удалось. Сейчас пытаюсь написать класс для протокола POP3, но там также нужна авторизация Значит так. На локальной машине localhost установлен hMailServer. На нем создан домен something.com Далее создан почтовый ящик ken (задать пароль почтовому ящику неудается... :( ![]() Вот собственно и весь диалог с hMailServer...
|
Автор: neosapient 8.4.2007, 21:43 | ||||
Вот еще проблемка Протокол POP3. Вызов LIST Должно
по факту отрабатывает
То есть функция recv(...) за один раз принимает только первую строку вплоть до "\n\r" А при повторном вызове виснет. Типа сервер ничего в неё не шлет, а наоборот ждет что-то от меня, но ЧТО? |
Автор: ptr 17.4.2007, 13:23 | ||||
А как ты хотел? Чтобы ты ввёл имя ящика и тебе сразу сказали, что его нет. Это же мечта спаммера. Тебе уже всё написали. Пользователь [email protected].
Ну ты блин даешь ![]() В accounts->... есть поле Account password: <<ENCRYPTED>>. |
Автор: neosapient 17.4.2007, 15:21 | ||||
пароль ввожу, но он не фиксируется |
Автор: ptr 17.4.2007, 15:49 |
В смысле не фиксируется? Ты "применить" нажимал? |
Автор: neosapient 28.4.2007, 19:01 | ||||
нажимал Ладно, основноё вопрос сейчас другой:
|
Автор: ptr 29.4.2007, 14:29 |
Выкладывай код (там где приём данных и где виснет). |
Автор: neosapient 30.4.2007, 18:10 |
Там сам разобрался Была одна грубая ошибка - после логина и после пароля ставил пробел и лишь затем "\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 | ||
Думаю точно также, но... Заюзал для расшифровки Base64Decode(...), которая выполняется с ошибкой. |
Автор: korbian 4.6.2007, 13:36 |
в base64 входят символы:
|
Автор: 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 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 + |