Нет автоматическим регистрациям
В предыдущей статье я описал свои проблемы с удалением кучи зарегистрированных спам-юзеров в блоге, пришло время избавится от регистрации спам-юзеров таким же кардинальным образом, как я избавился от спам-комментариев. Естественно подразумевается, что и регистрации в блоге и написание комментариев осуществляется спам-скриптами, так как защититься от ручного спама весьма и весьма проблематично. Но ручной спам это лишь тысячная доля от всего спама и беспокоиться о нем вряд ли стоит. Метод защиты от авто-регистраций в блоге аналогичен методу защиты от спам-комментариев - будем использовать подмену полей. Причем вся эта защита займет у вас максимум 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, а от спам-комментариев с помощью этого метода.
Рекомендую также:

#1, 30 августа, 2009 в 17:24
Спасибо! Очень полезный материал, ведь есть же люди, которым не лень копать весь этот код :)
У меня, впрочем, регистрация закрыта, но потом, думаю, ее открою...
#2, 30 августа, 2009 в 19:37
А вообще какая польза от открытия регистраций? Ведь можно ж писать и без них.
#3, 30 августа, 2009 в 19:45
например, когда в блоге используется форум - вот тогда без регистрации сложновато.
#4, 30 августа, 2009 в 22:31
Прошу прощения, я не подумал об этом.
#5, 10 октября, 2009 в 18:04
Здравствуйте. А не могли бы вы перечислить плагины которые отвечают за регистрацию пользователей? Знаю два из них Register plus и Themed Login and Register, но у каждого есть минусы из-за которых пользоваться ими нет желания.
#6, 2 декабря, 2009 в 03:55
Сергей, а какие минусы у Register plus?
#7, 4 декабря, 2009 в 12:36
они вообще для разных вещей служат. первый для расширенной регистрации пользователей в блоге, а второй для встраивания формы регистрации\входа на блог в дизайн шаблона.
#8, 21 февраля, 2010 в 12:44
Здравствуйте, большое спасибо за способ, пошел ставить у себя на сайте. Это гораздо лучше и оптимальнее чем всякие тяжелые для сервера плагины типа Sabre и т.д. У меня WordPress - сайт на VPS с 10 тыс. уников, поэтому нагрузка критична. Ваш модернизированный плагин для очистки неактивных юзеров тоже попробую. Читаю Вас постоянно :)
#9, 22 февраля, 2010 в 01:43
надеюсь, что информация будет вам полезна ))
#10, 13 марта, 2010 в 04:39
Спасибо! Пошел поставил, посмотрим что да как. А то каждый день по куче спамеров регается...
#11, 13 апреля, 2010 в 19:39
Раньше имел сайт на ipb там так же делал, очень полезная вещь!
#12, 22 июня, 2010 в 02:47
Есть ли возможность использовать данный способ без хака wordpress? Очень не удобно постоянно при обновлении движка хаки восстанавливать.
#13, 2 августа, 2010 в 23:13
К сожалению, после обновления Вордпресса оказалось, что правок в wp-login нужно больше, чем раньше. Без тотальной замены имён форма не давала зарегиться.
#14, 16 августа, 2010 в 13:11
В этом коде есть одна ошибка! Если человек с первого раза неправильно введет логин, то второй раз его определят как спам!
Код должен быть примерно таким
#15, 18 октября, 2010 в 09:27
честно говоря не понял, в чем изменение то? ну $_POST я вижу, а в реале то что от этого изменится?