Нет автоматическим регистрациям
В предыдущей статье я описал свои проблемы с удалением кучи зарегистрированных спам-юзеров в блоге, пришло время избавится от регистрации спам-юзеров таким же кардинальным образом, как я избавился от спам-комментариев. Естественно подразумевается, что и регистрации в блоге и написание комментариев осуществляется спам-скриптами, так как защититься от ручного спама весьма и весьма проблематично. Но ручной спам это лишь тысячная доля от всего спама и беспокоиться о нем вряд ли стоит. Метод защиты от авто-регистраций в блоге аналогичен методу защиты от спам-комментариев - будем использовать подмену полей. Причем вся эта защита займет у вас максимум 5 минут, да и то половина из этих 5 минут уйдет на обновление файла wp-login.php на сервере вашего хостера.
За авторизацию и регистрацию в блоге на WordPress отвечает файл wp-login.php. Подменять мы будем поле user_login, оно много где используется в этом скрипте, но нас интересует только регистрация, все остальное мы оставим в первоначальном виде. Открываем файл wp-login.php и ищем строчку:
399 | $user_login = $_POST['user_login']; |
заменяем ее на:
399 400 401 | $user_login = $_POST['user_login']; if(!empty($user_login)) wp_die('Спаму нет!'); $user_login = $_POST['real_user_login']; |
теперь находим:
414 415 416 417 | <p> <label><?php _e('Username') ?><br /> <input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr(stripslashes($user_login)); ?>" size="20" tabindex="10" /></label> </p> |
и заменяем эти строки на:
414 415 416 417 418 419 420 421 | <div style="display: none;"><p> <label><?php _e('Username') ?><br /> <input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr(stripslashes($user_login)); ?>" size="20" tabindex="10" /></label> </p></div> <p> <label><?php _e('Username') ?><br /> <input type="text" name="real_user_login" id="user_login" class="input" value="<?php echo esc_attr(stripslashes($user_login)); ?>" size="20" tabindex="10" /></label> </p> |
Вот, собственно, и все. Что мы сделали? Мы добавили новое текстовое поле для ввода логина под именем "real_user_login", а старое поле "user_login" сделали невидимым. И встроили проверку на заполненность этого невидимого текстового поля. В итоге получается, что человек не заметит ни малейшей разницы при регистрации в блоге, а вот спам-скрипт заполнит именно поле "user_login" и получит ошибку регистрации "Спаму нет!". Для полной уверенности в том, что спам-регистрации больше не пройдут измените название поля "real_user_login" на любое другое, не содержащее слово "user_login".
Но что делать, когда за авторизацию и регистрацию в блоге отвечает сторонний плагин? Например, популярный плагин Themed Login and Register? Да абсолютно тоже самое, по аналогии с приведенным хаком. В качестве примера приведу изменения и для Themed Login and Register, открываем файл плагина themed-logreg.php и ищем строчку:
869 | <label for="user_login"><?php _e('Username:') ?></label><br /> <input type="text" name="user_login" id="user_login" size="20" maxlength="20" value="<?php echo wp_specialchars($user_login); ?>" /><br /></p> |
заменяем ее на:
869 870 871 872 | <div style="display: none;"> <label for="user_login"><?php _e('Username:') ?></label><br /> <input type="text" name="user_login" id="user_login" size="20" maxlength="20" value="<?php echo wp_specialchars($user_login); ?>" /><br /> </div> <label for="user_login"><?php _e('Username:') ?></label><br /> <input type="text" name="real_user_login" id="user_login" size="20" maxlength="20" value="<?php echo wp_specialchars($user_login); ?>" /><br /></p> |
теперь находим:
783 | $user_login = sanitize_user( $_POST['user_login'] ); |
и заменяем на:
783 784 785 | $user_login = sanitize_user( $_POST['user_login'] ); if(!empty($user_login)) wp_die('Спаму нет!'); $user_login = sanitize_user( $_POST['real_user_login'] ); |
Вот и все. Таким образом можно исправить любые плагины, которые отвечают за регистрацию пользователей в блоге. Проверить работу данного хака очень легко – удалите текст style="display: none;" из div'а и попробуйте зарегистрироваться, заполнив первое поле "Логин". Если вы все сделали правильно, то зарегистрироваться вы не сможете.
Напоминаю: от уже зарегистрированных спам-юзеров вы можете избавится с помощью плагина Clean Up Users, а от спам-комментариев с помощью этого метода.
Понравился пост? Подпишись на обновления по RSS или Twitter !
#21,
Статья нуждается в правке. Поправил шаблон, подожду малеха, идут ли регистрации ботов.
#22,
а что в ней сейчас не так?
вроде работает и сейчас.
#23,
Ну, во-первых, php-код изменился в файле.
Во-вторых, после обновления wordpress стало очень много регистраций, а раньше вообще тишь да гладь была
#24,
ну это наверное да, просто у меня за регистрацию отвечает плагин Themed Login Plugin - я в нем один раз сделал эти изменения и уже много лет ничего не правлю - все и так работает.
а регистрации после обновления - так совпало у вас, ничего принципиально нового в движке по этому поводу не менялось, просто вы попали в список спам-ботов, с чем могу вам поздравить (посочувствовать) :)
#25,
Ну у меня тоже рега-вход неординарно выполенены, через главную с плагином wppost, от регистраций в нем даже письма не приходят, а вот о тех, кто регаются через wp-login я узнаю сразу через e-mail уведомления. Раздражает.
#26,
ну так отрубите через .htaccess доступ к wp-login.php вообще для всех и не надо будет изобретать велосипед :)
#27,
На последней версии WordPress (4.1) работает. И на самом деле в коде ничего особо не изменилось. Я говорю про авторизацию/регистрацию через wp-login. Там только в теге появился ещё атрибут for и теперь конструкция в целом выглядит а в остальном всё точно так же. Проверил на своём блоге - всё работает.
#28,
извините не прочитал примечание. К предыдущему посту
в теге
теперь конструкция в целом выглядит
ещё раз прошу прощения.
#29,
да ничего :) я про этот хак давно забыл - как когда-то поправил плагин Themed Login Plugin, так больше его и не ковыряю :)
#30,
Странно, тут пишут, что на 4.1 работает и код не изменился. А у меня WP 4.0 и второй участок в файле wp-login.php кода выглядит иначе, чем в посте:
Вы можете подсказать, как нужно изменить такой код для того, чтобы работал сабж?
#31,
Коллеги, здравствуйте. Фича, предложенная автором поста, работает, но нашелся один небольшой баг: после разлогинивания (выхода) из админки ВП перестал меня пускать обратно. Пришлось возвращать старый вп-логин.рнр. Или я что-то не так делаю?
#32,
видимо. что пишет - "спаму нет"?
проверяйте код, где-то ошиблись вы.
#33,
Все оказалось правильным. Но "Спаму нет!" не появляется. Вычитал в одном из комментов здесь что если неправильно ввести логин-пароль первый раз при входе, то остальные попытки он начинает считать спамом и не пускает. Вы бы этот пункт отразили у себя в статье, где-нить в примечаниях. Вдруг я не один такой? )))) А если с первого раза все правильно - то все ОК. В любом случае, спасибо за статью, весьма полезна!
#34,
нет такого в этом хаке. такой проверкой обладают некоторые плагины "безопасности", этот же хак проверяет только заполненность нужного поля и все. поэтому чтобы вас не пускало - не в хаке дело. вы код для него где взяли? а то в статье он устарел, правильный тут в комментах выложен.
#35,
Здравствуйте, Flector!
Подскажите, пожалуйста, как использовать ваш хак против спам-регистраций, если на сайте установлен плагин Theme My Login? Вносить изменения в wp-login.php, или в каком-то файле плагина? Если в плагине, подскажите, где надо внести изменения в коде, не могу разобраться...
Спасибо!
#36,
Вопрос (выше) остается насущным... Может, кто из гостей сайта подскажет?
#37,
именно в файлах плагина. в каких именно - посмотрю сегодня чуть позже.
#38,
могу посоветовать забить - посмотрел я плагин, там реально в куче мест надо менять имя поля для ввода имени пользователя. не в одном и не в двух местах - а в куче мест. проще включить в этом плагине капчу и тупо забить.
#39,
Понял, спасибо! Буду пробовать в деле Google Captcha, сейчас ее сильно хвалят в инете.