Анти-Анонимайзер: новый вариант, с учетом предыдущей критики
Я сам очень не люблю читать чересчур длинные треды. Поэтому завожу новый - в продолжение Анти-Анонимайзер в виде утилиты - может быть, поможете? Тем более, что название темы уже явно другое.
Надеюсь, я не слишком надоел :) Но сейчас, как мне кажется, я вижу уже достаточно законченный вариант продукта. Хотелось бы вынести его на обсуждение, послушать критику - уже в этом, относительно "причесанном" варианте.
Напоминаю. Речь идет о создании инструмента "Анти-Анонимайзер". Цель: позволить хозяину форума или гостевой книги защититься от анонимного спама. В частности, от 3 угроз: 1) целенаправленное заваливание форума случайно генерируемым спамом с целью уничтожить форум; 2) невольное нарушение договора с хостером из-за публикации на форуме нелегального контента; 3) невольное участие в конфликте между преступником, опубликовавшим свое сообщение, и полицией (либо другими преступниками). Подробно эти угрозы описаны здесь: Анти-Анонимайзер в виде утилиты - может быть, поможете? (328817) (Мое мнение - эти угрозы являются частью большой социальной проблемы, возникшей в связи с легкостью публикации материалов в веб. Масштабы проблемы сильно недооценены. Об этом см. следующий текст: http://webwarper.net/wwantianonymizerru.htm, кроме устаревших разделов про Анти-Антинонимайзер.)
На всякий случай подчеркну, что не ставлю в качестве цели борьбу с обыкновенным рекламным спамом. Для этого вполне достаточны другие, хорошо известные механизмы. (Слово "спам" многих сбивало с толку в предыдущих обсуждениях, так как обычно представляется именно реклама.)
Технически, Анти-Анонимайзер должен распознать попытку работы через бесплатный публичный прокси, включая socks (http://www.samair.ru/proxy/). И либо определить правильный IP компьютера, за которым сидит пользователь, либо прийти к выводу, что это невозможно (реакция - запрет постингов в форум). Под "правильным IP" понимается адрес, по которому компьютер пользователя был "виден" из Internet хотя бы в некоторый момент. Знание такого IP помогает либо решить описанные проблемы 1-3), либо очень сильно уменьшить их последствия. (Важно: в случаях 2 и 3 не ставится цель физически найти спамера. Для этого есть детективы. Цель - "отвести удар" от владельца форума, явно указав на компьютер, за которым сидел истинный виновник. Неважно, если это был динамический IP, выделенный провайдером - все равно это конкретная физическая подсетка, за которую отвечают конкретные люди. А не случайный прокси из Аргентины.)
Допускается, что часть посетителей (скажем, работающих за офисным NAT) может потерять право постинга в форум. Этот пункт вызывал максимум критики в предыдущих обсуждениях. На всякий случай повторюсь: я не утверждаю, что Анти-Анонимайзер окажется применим ко всем форумам. Моя цель - защитить хозяев тех форумов, чья тематика или популярность позволяет согласиться с потерей (в смысле постинга) части пользователей, особенно работающих в офисах. Форумов в мире очень много, и, очевидно, 99% из них (как и 99% сайтов вообще) довольно малы и созданы "чайниками". Для которых угрозы 2) и 3) куда важнее, чем потеря части пишущих посетителей (скажем, потеря одного или двух человек из того десятка, которые за последнюю неделю оставили хоть одно сообщение). При всем этом, разумется, я стараюсь свести подобные случаи к минимуму.
Итак, предлагаю на рассмотрение следующий вариант продукта. Анти-Анонимайзер будет пытаться установить двустороннюю связь с некоторым демоном на моем сервере (webwarper.net). А именно:
- Анти-Анонимайзер, исполняемый на клиенте, запускает на клиентском компьютере TCP/IP-сервер (цикл вызовов accept).
- Анти-Анонимайзер обращается (через сокеты, хотя это не принципиально) к демону на webwarper.net
- Демон в ответ сообщает клиенту IP-адрес, с которого произошло обращение к демону (возможно, это будет адрес socks-прокси или NAT).
- Демон начинает "стучаться" на этот IP-адрес (к определенному порту). При этом демон пытается передать исходному клиентскому компьютеру некий ключ-подпись, строящийся (секретным алгоритмом) на основе IP клиента.
- Если TCP/IP-серверу на клиентском компьютере удается определить факт, что к нему "стучатся", и получить ключ, то этот ключ-подпись вместе с полученным ранее IP записывается к cookie. Если TCP/IP-сервер на клиентском компьютере в течение минуты "ничего не слышит", то cookie не устанавливается. У посетителя остается возможность попытаться еще раз.
Все эти действия должны быть выполнены хотя бы один раз, чтобы посетитель получил право постить в форум. Если требуемый cookie имеется, он передается вместе с каждым постингом. Серверный скрипт, пользуясь известным ему секретным алгоритмом, проверяет значение ключа-подписи. Если все правильно, постинг разрешается. (Если нет - это, вероятно, попытка взлома.) В текущем варианте, я хочу потребовать, чтобы все постинги были возможны только через сервис WebWarper - тогда все проверки можно выполнить на сервере webwarper.net, никому не открывая секретный алгоритм и не заставляя веб-мастера встраивать нетривиальные проверки в движок форума.
А теперь с точки зрения пользователя.
Перед первым постингом у посетителя открывается небольшое "окно авторизации" (веб-страничка), где написано что-то вроде: "Сайт защищен Анти-Анонимайзером. Чтобы получить право отправлять сообщения, вы должны пройти получить идентификационный код, основанный на вашем IP-адресе." И далее варианты:
- получить с помощью Java-апплета;
- получить с помощью внешней exe-утилиты (для Windows);
- получить с помощью внешнего Perl-скрипта (.pl-файл);
- получить с помощью внешней Java-утилиты (.jar-файл).
В вариантах b), c), d) предлагается полученный код ввести тут же в окошечке. Внизу странички пишется предупреждение, что если у вас стоит FireWall, то вы должны будете разрешить прямое соединение извне с вашим компьютером. (FireWall из XP SP 2 задаст соответствующий вопрос автоматически.) Утилита (или .pl/jar-файл), конечно, подразумевается очень маленькой, скачиваемой почти мгновенно.
Вариант a), конечно, самый интересный. Как выяснилось, JRE 1.3+ (к сожалению, не 1.1.4) позволяет организовать TCP/IP-сервер в апплете. И хотя обращения извне блокируются (exception в методе accept, когда обращающийся IP нелокальный), но сам факт обращения зафиксировать можно, причем вместе с информацией об обратившимся IP. Этого уже достаточно, чтобы умеренно хитрым способом передать ключ-подпись (поочередно обращаясь с нескольких IP, "привязанных" к компьютеру webwarper.net).
Если пользователь выбирает вариант a), открывается еще одно окошко с явно видимым, большим апплетом (object/embed), который в процессе исполнения пишет всякие сообщения (типа "Direct connection to webwarper.net..."), а в конце показывает найденный им IP-адрес. Если Java отсутствует, автоматически предлагается скачать JRE 1.3 - это 6 мегабайт (самая маленькая из найденных мной Java-машин, см. Самая маленькая JVM, загружаемая через object/embed) Кроме того, тут же приводятся ссылки на java.com - для тех, кто хочет качать другую версию (или на случай, когда автозакачка не срабатывает, как в Opera).
В вариантах b-d) пользователь запускает внешнюю утилиту или скрипт, после чего уже "руками" (через clipboard) копирует нужный код в окошко на странице.
Вариант a), конечно, рассчитан либо на тех, у кого уже есть современная Java-машина (это процентов 30 пользователей), либо на ценителей безопасности, которые предпочтут скачать 6 или даже 12 MB, но не запускать утилиты неизвестного происхождения. Очень хорошо, если удастся добавить аналогичный вариант с Flash. Но пока это представляется маловероятным.
Когда IP и секретный код-подпись получены, они запоминаются в кукисе. В следующий раз описанное окно авторизации уже автоматически не появится, разве что по специальной ссылке.
Насколько я понимаю, описанная схема не сработает только в случае, когда посетитель "сидит" за сетевым экраном, не пропускающим входящие потоки данных на IP компьютера. Как мне кажется (поправьте, если не прав), это в точности те же самые случаи, когда ICQ не может передавать файлы. Когда (точнее, если) сие будет реализовано, я, конечно же, начну собирать статистику - сколько процентов случаев соединения окончились неудачей - и постараюсь опубликовать ее здесь.
"Взламывать" эту защиту, как мне кажется, бессмысленно - подделать IP не удастся, не зная алгоритм генерации ключа-подписи. Так что наличие открытых исходных кодов, скажем, Perl-скрипта не нарушает безопасность.
Что скажете, уважаемые коллеги? Нет ли "дыр", которые я не заметил? Не слишком ли все это "безобразно"? Как всегда, буду рад критике :)
Меня вот пока все-таки беспокоят socks. Как ни досадно, сейчас за полчаса не смог найти на http://www.samair.ru/proxy/ ни одного работающего socks-прокси, где можно было бы проверить технологию. (Те, кто работали, выдавали ошибку еще на этапе socket-соединения апплета с сервером. Т.е. против них была бы эффективна даже исходная, забракованная ныне защита, с односторонним доступом.)
Читаю материалы, учусь. Вот, прочел такое (http://www.computerra.ru/offline/1998/238/1170/): "В протоколе Socks5 есть запросы (от Socks-клиента Socks-серверу) со следующим смыслом: ... Работай сервером от моего лица на таком-то TCP-порте, принимай входящие соединения и передавай мне для обработки". Значит ли это, что если моя утилита (или апплет) запущены через соксификатор, то попытка создать "слушающий" серверный сокет будет передана socks-прокси, тот запустит аналогичный TCP/IP-сервер, который будет принимать запросы от моего демона на webwarper.net (на IP socks-прокси!) и передавать их клиентской утилите? Как socks-прокси "догадается", кому именно из многих компьютеров, находящихся под его защитой, следует передать эти запросы? Ведь запрос, который посылает демон на webwarper.net, будет адресован к IP socks-прокси на фиксированный порт, вне всякой связи с предыдущим диалогом, когда утилита обращалась к демону.
Надеюсь, я не слишком надоел :)
Вам честно ответить?
Даниил, ХОТЬ ОДИН человек из обсуждавших высказал ХОТЬ МИНИМАЛЬНЫЙ интерес и одобрение Вашей идее? Для кого Вы этот бразильский сериал пишете?
Ну, по моим впечатлениям, большинство отвечающих относятся к идее нормально, а некоторые даже высказывают очень конструктивную критику - с начала "сериала" мне изрядно помогли, указав на упущенные моменты. За что очень благодарен. Насчет "одобрения" - я в общем-то его не ждал, я просил как раз критики. И действительно, варианты, описанные ранее, даже по сравнению с нынешним довольно ужасны. Может быть, с помощью уважаемых обсуждающих удастся еще улучшить замысел.
Пока что заметил еще одну небольшую уязвимость в новом решении. Зашифрованный IP (содержащий секретный ключ-подпись), полученный утилитой, можно передать другому человеку и вообще опубликовать в Internet. При наличии достаточного количества таких законных зашифрованных IP спам становится угрозой. Решение очевидно - зашифрованный IP должен включать отметку времени и действовать только некоторое время (сутки? неделю?) Кроме случая, когда посетитель не использует вообще никаких прокси, и его обратный адрес REMOTE_ADDR (в момент отправки сообщения) соответствует введенному им зашифрованному IP.
Ну, по моим впечатлениям, большинство отвечающих относятся к идее нормальноIMHO, читатели делятся на две категории:
Первые думают: "о, он крутой чувак!", некоторые даже, наверное, задумаются о том, что Вы — второе пришествие Христа на землю, который всех спасет от спама, но не понимают технических деталей, которые Вы предлагаете.
Вторые понимают реализацию и тихо офигивают. Некоторые даже поняли, что доказать Вам ничего не получится и "стоят в стороне".
Не обижайтесь, пожалуйста, но я отношусь ко второй категории, и считаю саму идею полным бредом и бесполезной тратой времени.
Это важно, хоть и печально. Может все же потратите немного времени и хоть выскажетесь, что именно не нравится?
Идея реализация, в сущности, банальна. Хочешь зайти на защищенный форум - поставь к своему броузеру микродобавку, которая превратит броузер, для данного форума, в систему типа точка-точка, вроде ICQ или других чатов. Иначе говоря, сообщи надежным способом свой IP. Неужели это намного хуже традиционных требований авторизации? При том, что традиционная авторизация при борьбе со спамом - всегда полумера, не позволяющая даже забанить спамера сколь-нибудь избирательно (подсетка/район/город, а всегда лишь весь мир)?
Даниэль Алиевский[досье]
Даниил, мне кажется, вы как-то чрезмерно увлеклись идеей защиты форумов путем анти-анонимайзера. Я понимаю, что название красивое и покупаться должно хорошо, но клиентов ваших мне жалко - они потеряют слишком много нужных им пользователей за счет ваших технологий защиты - не спаммеров, а тех кто хочет с форумом работать.
Вам уже на протяжении нескольких тредов это твердят, а вы упорно "бьетесь головой об стену". Будь это какой-нибудь PHPClub, здесь уже появился бы местный Ромик, а так вы только выводите из себя коллег. Послушайте что вам говорят, а то здесь не останется тех кто отвечает в ваши темы.
Не подумайте что вас гонят, но те кто отвечает в тредах про анонимайзеры уже устали вас убеждать и желание помочь может угаснуть перед желанием плюнуть, а то и перейти в аггрессию.
Давайте мы вам лучше других идей понакидаем ;)
Я понял, что и правда всем надоел. И, вероятно, придется отказаться от затеи - или, по крайней мере, отложить до лучших времен. Но как же мне реагировать, когда, например, вы, Владимир, пишете что-то неверное? Ведь проблему-то я решил! У спамера нет возможности подделать свой IP, если запускается независимая утилита (или апплет с двусторонним обменом). Или, по крайней мере, никто мне не указал пока на такую возможность.
И насчет "установки программы" тоже неправда получается. Ясно же, что мою программу не надо будет устанавливать. Достаточно щелкнуть по ссылке на exe, скачать и ответить "Run". Это же тривиальная утилита, состоящая из единственного диалогового окна с кнопкой "получить ключ". Нажимаешь, и видишь этот ключ в строчном редакторе в этом самом диалоговом окне. Зачем тут инсталлятор?
...В очередной раз подумал, а кому я пишу? Для чего это всё?
Алексей В. Иванов[досье] Чудеса какие-то. То есть что же, вы хотите сказать, что сейчас никто и никогда не скачивает exe-программ? Все каталоги софта типа download.com и freesoft.ru, с их десятками тысяч программ и утилит, существуют на субсидии правительств и фальсифицируют счетчики download? Я точно знаю, что мою собственную програмку webwarper.exe совершенно осознанно скачивают минимум 100 человек в день. Более того, на сегодня ее ежедневно запускают - в чем я тоже уверен благодаря соответствующей статистике - порядка 2000-3000 человек. Несмотря на "четкие комментарии браузеров". А если говорить об ActiveX (вместо утилиты) - их реально существует очень много, помимо Macromedia и Java. И ведь ими пользуются. Давайте же постараемся быть объективными. Я понимаю, что программа может быть неудачной, неудобной, подозрительной и т.д. Скажите, где у меня это - я подумаю, как исправить. Но что почти каждая скачанная программа приводит к четырехзначным телефонным счетам и лечению - не могу поверить. Ради бога, извините, если не прав - совсем не хочу раздражать своими ответами. Боюсь, что невольно получается :(
Владимир Палант[досье] У меня ведь тоже XP SP2. И этот FireWall, разумеется, задает вопросы насчет той же ICQ. Я ведь написал в начале постинга, что порекомендую посетителю не блокировать соединение утилиты. Ну не хочет человек - пусть не пишет в форум и не пользуется ICQ. Вопрос доверия! В любом случае, либо человек соглашается сообщить свой IP (что технически для него сводится к нескольким щелчкам мышки), либо нет. Если соглашается, то никакое перенаправление трафика не поможет спамеру фальсифицировать IP. Разве нет? Ведь мой демон на webwarper.net будет обращаться к обратному IP-адресу, ожидая получить определеный ответ. Изнутри VMWare программа попросту ничего ему не ответит. А как SOCKS-ификатор типа SocksCap сумеет это обеспечить? Ведь socks-прокси (обратный IP-адрес) понятия не имеет, кому именно из его многочисленных клиентов следует передать запрос демона с секретным ключом-подписью. Из всех вариантов обмана я вижу только VPN, когда компьютеру действительно присваивается некий новый уникальный IP-адрес, по которому демон мог бы обратиться. И весь трафик идет через этот адрес. Но разве существуют опубликованные базы подобных бесплатных VPN?
Да, я, может быть, рискую осложнить жизнь некоторым пользователям некоторых форумов (но регистрация в форумах тоже осложняет жизнь). Но не всем же! Уже хорошо, если хоть некоторые форумовладельцы смогут вздохнуть спокойнее. Про это я сразу оговорился. Зато спамеров я "вычисляю" гарантированно, никакие анонимайзеры их не спасут. Разве нет?
Если честно, не понимаю я, что именно вызывает такую бурю негативных эмоций. Хочу "нажиться на дураках" и к тому же рекламирую это? Так вроде нет, проект некоммерческий, мне пока одна головная боль от этого. Не слушаю аргументов? Так вроде слушаю, подробно отвечая на каждый. Где-то "дыра" - так укажите, я скажу спасибо. Пока нашли одну (socks) - прекрасно, я уже сказал спасибо, придумал альтернативу, даже лучшую, не требующую качать 6 MB. Что же не так?
Про попытку установки обратного соединения я вообще не говорил — это нереально, NAT везде. Тем более, что SOCKS5 позволяет принимать соединения на прокси (уж не знаю, как у SocksCap с поддержкой этой функции).
Зато спамеров я "вычисляю" гарантированно
Да. Смешно. Больше не отвечаю.
Владимир Палант[досье] NAT везде (хотя нет ни одной ссылки на статистику, сколько это "везде"), но и ICQ не так уж редко работает на direct connection (точка-точка)...
Что касается SOCKS5 - да, позволяет, про что я и спрашивал во втором постинге. Надеясь, что мне объяснят, чего я не понял. "Быстрый" ликбез на уровне google, очевидно, недостаточен. С точки здравого смысла кажется совершенно непонятным, как именно socks5-прокси "догадается", кому именно из его потенциальных клиентов отослать запрос на некий порт, адресованный TCP/IP-серверу, "крутящемуся" где-то под защитой этого socks-прокси. Ну да ладно... Может, найдутся добрые люди, объяснят.
Владимир, ладно, давайте предположим, что я полный "чайник" и ничего вообще не понимаю. Ложной гордостью обычно не страдаю. Может быть, все же подскажете, где я ошибся? И как именно опытный спамер (с вашей квалификацией, например) может обмануть мою защиту? Не хотите засорять форум, может, хоть в частном порядке объясните? Хотя, наверно, я прошу слишком многого - мои извинения.
Неа, идей по вашему сервису у меня нету - у меня зато много других.
Вы думаете всем людям на форуме интересны мои или ваши идеи?
В общем, мне кажется довольно очевидным, что идея с независимой утилитой, которую здесь встретили "в штыки", вряд ли порадует и авторов форумов. Апплет мог бы быть решением (тем более flash-скрипт), но то, что я предложил выше - "дыра", и опираться на нее вряд ли стоит: Уязвимость в Java-машине? К тому же это требует настройки FireWall.
Идея в порядке бреда (наверно, от неграмотности). А все ли варианты Internet-соединений перехватывает SOCKS5? В популярных статьях написано слишком популярно :) (насчет UDP и DNS). Нет ли таких вариантов соединения, причем в одну сторону (не требующих обратного обращения к серверу на клиентском компьютере), которые SOCKS5 "неподвластны" и которые при этом реализуемы из Java-апплета? Что-нибудь вроде ping?
Никак не могу смириться с положением, что нет способа обнаружить наличие SOCKS-прокси между апплетом и сервером. Что нельзя сообщить истинный IP - это, конечно, нормально, ибо должен быть законный способ анонимизации. Но что нельзя определить сам факт анонимности и дать серверу возможность отказать в доступе в такой ситуации - как-то неправильно. (В обычном-то мире всякая организация вправе решать, принимает она посетителей анонимно или требует удостоверение личности.) Тем более что для независимых приложений такая возможность очевидна - двусторонний обмен данными.
Но проблема спама остается нерешенной. Вычищаю вручную, но его только больше становиться. Уезжаешь на дачу на пару дней, и по приезду приходится удалять из гостевой сотни (!!!) непонятных записей вида "cool site" со скрытыми ссылками. Мне бы для защиты хватило бы просто запрета записи сообщений, содержащих ссылки, и я бы был доволен. Но пока не знаю, как это сделать, в сети не нашел.
Мне бы для защиты хватило бы просто запрета записи сообщений, содержащих ссылки, и я бы был доволенЕсли Вы используете PHP, то htmlspecialchars Вам поможет.
Чем поможет? Количество спама уменьшить или ссылки из него удалить?
Во всех 1000 наспамленных сообщениях? Круто.
Человек говорит, ему роботы делают сотни сообщений и их приходится вычищать.
Вы предлагаете в этих сотнях сообщений убрать ссылки, но оставить сами сообщения. Логика?
Между прочим, в моей гостевой проблема абсолютно такая же. (Сапожник, как водится, без сапог. :))
Пока что я вставил несколько проверок в скрипт добавления сообщения. Вот слегка урезанный кусок рабочего Perl-кода, вдруг автору пригодится:
my $usercomment= ... (добавляемое сообщение); if (length($usercomment)>600) {myError( "Извините, Ваш комментарий слишком велик: допускается не более 600 символов");} $usercomment=~s/\r//gs; $usercomment=~s/\n/<br>\n/gs; my $linkCount= 0; $usercomment=~s[((?:ht|f)tp://(?:[\w\-]+\.)+\w+(?:\:\d+)?(?:[/\?\#][/\?\#\w\.,;!^\|%\~\-\+\=\&\*]*)?)][\$linkCount++,"<a href=\"$1\">$1</a>"]goei; if ($linkCount>4 or $usercomment=~/\bsex\b|\bsexual\b|\[url\=/) { myError("Извините, Ваш комментарий содержит слишком много ссылок или неразрешенные слова (например, [url=...])"); }
На входе $usercomment, в формате простого текста. Громоздкий regexp превращает в HTML-ссылки все записи вроде http:// и ftp:// (аналогичные regexp есть в здешнем FAQ по Perl-у), а заодно подсчитывает ссылки. Я пока запрещаю постинги более чем с 4 ссылками; спам уменьшился, но не радикально. Автор постинга, как я понял, готов запретить ссылки совсем. Также некоторые тупые роботы норовят добавить "ссылки" в формате [url=...]; это я блокирую сразу.
Если кто-нибудь подскажет готовое цивилизованное обновляемое решение (скажем, regexp для вычистки основных популярных спамеров), буду благодарен.
Наверно, вы правы. Так и сделал: действительно, в 90% полезных постингов ссылок не было (кроме моих, модераторских). Посмотрим, что получится. Спасибо.