Защита сайта от спамеров и угона аккаунтов

f88adca35698118af0b6ba6c49ba44fbВ этой статье не будет ничего принципиально нового, однако некоторым будет весьма интересен взгляд со стороны спамера (уже бывшего) со стажем. Идея написать на хабр пришла давно, после прочтения этой статьи, которая только вызвала улыбку. Так уж вышло, что давным-давно, во времена учебы в университете, я искал удаленную работу, поскольку на стипендию трудно выживать, не говоря уже о каких-то развлечениях. Тогда один товарищ пригласил меня в компанию, где работал сам. Работа была простая – оставлять где угодно ссылки на определенные сайты, попутно добавляя к ним какое-то сообщение, т.е. обычный спам. Тут, как понимаете, абсолютно никакая капча, проверка cookies или javascript не спасет ситуацию, поскольку регистрируется настоящий человек с помощью обычного браузера. По поводу автоматических спамилок ситуация похожая, если они разновидности «заскриптованный браузер». Однако есть способы усложнить жизнь спамерам и, если не полностью убрать, то значительно снизить поток спама на свой сайт.

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

Защита от попадания сайта в базу ресурсов

База ресурсов – это огромная мусорка со списком сайтов, на которых потенциально можно построить линк. Такие базы используются для заправки всяких спамерских программ, которые будут пытаться сделать свое грязное дело. Процент успешности не очень высок, около 5-10% (в зависимости от качества базы), однако, имея миллион сайтов в базе (и это даже не большая база), можно получить 50000-100000 ссылок, а это уже очень много. Естественно, это делается не за один раз, поскольку сайт в мгновение ока окажется в бане поисковых машин, но ведь строить можно постепенно и продвигать более одного сайта одновременно. Но это уже другой вопрос, а мы возвращаемся к теме. Самым популярным и логичным способом поиска сайтов для баз является правильное использование все тех же поисковых машин. И ищутся сайты по футпринтам (отличительным особенностям) их платформ. Например, спамеру удалось однажды оставить линк на сайте, который использует WordPress. Он решает, что нужно добавить как можно больше подобных сайтов в свою базу ресурсов, он открывает google и вводит что-то вроде «inurl:wp-login.php», после чего можно спокойно добавлять сайты в свою базу (естественно, это все делается автоматически). Если ему нужна определенная тематика, например «недвижимость», то запрос будет таким: «недвижимость inurl:wp-login.php». Добавлением подобных ключевых слов можно также обойти ограничение поисковых систем на максимальное количество выводимых результатов. Отсюда логичный вывод: избавляйтесь от футпринтов. Для популярных CMS есть полно плагинов, которые делают «красивые ссылки» — используйте их. Также не забывайте удалять с футеров сайта всякие там «Powered by blah-blah», а если хотите отдать дань разработчикам, то измените текст или замените его на картинку.
Конечно, есть и более изощренные способы, которыми спамеры составляют базы, но их обзор сам по себе потянет на статью. Если общество проявит интерес к этому вопросу, то, возможно, я напишу обо всем намного подробнее.

Защита от линкбилдеров

2708b9d339302b1b98d803519aae2717Линкбилдеры – это люди, которые по задумке должны делать качественный спам. Особенность их в том, что они проходят практически везде, где по задумке должен пройти только человек. Продуктивность линкбилдеров куда ниже, чем у программ, и составляет около 40 линков в день. Они пытаются отвечать на тематические вопросы в комментариях, от чего их выявление часто затруднительно.
Самым радикальным шагом для защиты от них будет введение модерации сообщений. Ее можно облегчить всяким правилами, типа «модерация только сообщений с линками» или «модерация пользователей, у которых сообщений меньше 5». Я бы еще добавил модерацию по дате регистрации, спамер вряд ли вспомнит о вашем сайте спустя 5 дней или около того.
Если любая модерация для вас является неприемлемой, спамера можно часто остановить на этапе регистрации. Большая часть спамеров использует, так называемые, сервисы «временной почты». Самым известным и популярным среди них является mailinator. Популярность его обусловлена тем, что на него ссылаются тысячи доменов, которых нет в открытых источниках, а также можно добавлять свои. Т.е. спамер покупает (или регистрирует бесплатный) домен, привязывает его к mailinator и получает собственный почтовый сервер, с помощью которого спамит до тех пор, пока домен не попадет в спам-базы. Однако такие домены можно обнаружить, т.к. их MX Record ссылается на сервис одноразовой почты. MX Record родных доменов не ссылается на сервис, однако редиректит на него при GET запросе. Очень не помешает проверять принадлежность почтовых доменов к таким сервисам. Если не хотите лишней нагрузки на свои сервера – делайте эти проверки на JavaScript, хоть это и понизит уровень защиты, но линкбилдеры редко отличаются интеллектом и хорошо, если они вообще знают такое слово.
Ну и, конечно же, не забуду добавить о таких сервисах, как «черные списки». Они проверяют наличие IP и Email в своих спам базах, подключаются с помощью простого API и обеспечивают неплохую базовую защиту.
Также довольно важным является не показывать спамеру, что вы знаете о том, что он спамер. Если ваши триггеры определили спамера, не нужно выводить ему большими красными буквами о том, какими плохими вещами он занимается – он просто сменит прокси/почту и попробует заново. Разумным решением будет вывести псевдо сервисное сообщение, например «Проводятся технические работы, регистрация временно отключена» или вообще сымитировать какую-то пятисотую ошибку (Internal Error).

Защита от спамерских программ

Этот пункт можно условно разделить на два вероятных сюжета: ваш сайт лишь один из огромной базы спамера и ваш сайт – цель. В первом случае все довольно просто: достаточно убрать футпринты, слегка подправить страницу регистрации (об этом позже) и, скорее всего, никто не пробьется. Куда труднее сделать защиту от массовой регистрации, если спамеру нужно много аккаунтов именно на вашем сайте. В статье, на которую я сослался вначале, есть доля здравого смысла, но лишь доля. Известно, что капча давно не является гарантом защиты от ботов, есть очень много сервисов, где все ваши капчи решаются индусами за копейки. Но убрать капчу со страницы регистрации – очень глупое решение, поскольку регистрация станет не только абсолютно бесплатной для спамера, но и невероятно быстрой (решение капчи индусом в среднем занимает 30 секунд). Что касается скрытых полей, то, например, в моей программе давно учтено, что в автоматическом режиме заполнять нужно только видимые поля, имеющие ненулевую высоту и ширину. Таким образом даже те спамеры, которые ничего об этом не знают, с легкостью обходят эту «защиту». Помимо способов, описанных ранее, а также телефонной валидации (которую я не рассматриваю вообще по понятным причинам), я могу посоветовать лишь один действительно очень сложный для обхода: капча, где нужно выполнить какое-то действие, вроде сложить простой пазл. Хороший примером такой капчи является PlayThru.
Не помешает еще кастомизация страницы регистрации. Вряд ли обычный пользователь будет читать исходный код, так зачем называть поля (тут я имею в виду атрибуты «name» и «id») столь очевидными именами, как «username», «email»? Любая уважающая себя программа справится с такой формой регистрации в автоматическом режиме. Желательный минимум – сделать эти атрибуты просто нечитабельными или специально поменять местами (например поле логина назвать «email»). Но можно (и желательно) пойти еще дальше – сделать эти атрибуты динамическими. Вы спросите, как серверу обрабатывать динамические имена параметров? Могу предложить скрытый input с ключом шифрования известного только вам алгоритма. Таким образом последовательность следующая:
Сервер генерирует случайный ключ -> Сервер шифрует названия атрибуты -> Пользователь получает страницу с зашифрованными атрибутами input’ов и скрытый input с вашим ключом -> При сабмите формы сервер дешифрует атрибуты и определяет какой за что отвечает.
Но, чтоб этот подход сработал на 100%, поля должны быть одинакового размера, типа, выводится в случайном порядке на странице и, желательно, добавить одно или несколько полей «Оставьте это поле пустым». И окончательным штрихом будет использование изображений одинакового размера и динамическим адресом вместо label.
А ведь можно пойти еще дальше и не передавать скрытому input’у значения ключа напрямую, а предоставить это динамически сгенерированной на сервере функции JavaScript, которая должна будет вернуть нужный ключ. Это сведет на нет любые попытки зарегистрироваться с помощью программ, тупо посылающих POST запросы.
Конечно, это все сложновато, но отлично защитит ваш сайт практически без неудобств для реальных пользователей.

А как быть с формой авторизации?

Тут все зависит от сайта. Многие не понимают почему на хабре, чтоб залогиниться, нужно всегда вводить капчу. Я согласен, что это дурной тон, но это один из двух известных мне способов защитить ваши аккаунты. Подобные методы имеют место там, где к аккаунту могут быть привязаны какие-то привилегии, которые не должны быть доступны каждому по умолчанию. На хабре это инвайты, на некоторых других сайтах — деньги или привязанные цифровые покупки. Любой аккаунт могут угнать и неважно, какой сложности у вас пароль. Делают это с помощью брута по купленным базам вида email:password. А базы продаются миллионами строк за смешные деньги. Добываются, насколько мне известно, сливом с различных форумов через SQL уязвимости. Вот и подумайте, сколько аккаунтов можно набрутить имея базы с реальными комбинациями почты/логина и пароля. Вообще, чтобы защитить себя, в идеале на каждом сайте должен быть разный пароль. Тогда, если базу этого сайта сольют, вам ничего не угрожает. Чтоб запомнить все пароли, можно, например, к одному основному паролю добавлять пару букв из названия сайта, на котором регистрируетесь. Но это уже совсем другая тема, а мы вернемся к нашей. Брут осуществляется посланием POST запросов на адрес авторизации и, если нет такой проблемы, как капча, то это все будет происходить очень быстро и, к тому же, бесплатно. А вот если добавить капчу, то брут займет в десятки раз больше времени и проверка базы в 1 млн. строк будет стоить примерно $1400. Но, как я писал выше, есть другой способ защитить сайт без капчи, который, как ни странно, кажется мне более надежным. Суть его в том, чтобы привязываться к конкретному браузеру и/или IP, а когда пользователь заходит с другого компьютера, то попросить его ответить на секретный вопрос. Мне уже встречались такие реализации и, возможно, разработчикам хабра стоит сделать что-то подобное. Как дополнительную защиту, можно использовать трюк с ключом шифрования, тогда создать брут-программу для такого сайта будет теоретически возможной, но крайне сложной задачей.

Напоследок

Очень редко мне встречались сайты, которые действительно серьезно подходили к защите, несмотря на свои красочные заявления. Аккаунты таких гигантов, как Twitter, Skype, Sony, PayPal очень легко угоняются, что подтверждается обширным рынком их продажи. Куда труднее угнать аккаунты, например, VK или Google. Если на сайте нет обязательного подтверждение номера мобильного телефона, то написать авторегистратор — дело пары часов, никто дальше добавления скрытых полей не заходит. А зря, мне даже представить страшно, какие они суммы тратят ручную зачистку.

Есть еще метод определять брут, независимо от Proxy и User-Agent. Суть его состоит в проверке и сравнении установленных плагинов и шрифтов.