Как сделать свою капчу (плагин) для WordPress? » lamara-nsk.ru


lamara-nsk.ru
Это блог о сео, деньгах, заработке в сети, разработке своих проектов, программировании
и "жизни программиста", бизнесе, блогосфере, фрилансе и многом другом.


Контакты, Реклама в блоге




Как сделать свою капчу (плагин) для WordPress?

Автор DimoninG, написано 10.08.2008
Рубрика WordPress, на WordPress  

Спонсор поста: дизайн интерьера, форум о дизайне интерьера
__________________________________

В этой статьей я достаточно подробно расскажу, как я сделал свою капчу и как вообще делается капча в виде плагина для WordPress. Вы легко сможете сделать капчу на свой вкус, распространять ее, хвастаться перед друзьями – ведь Вы сделали не просто интересную капчу, а еще и в виде плагина ;) Звучит-то страшно. Но не все так сложно на самом деле.

Чтобы понимать о чем речь, я рекомендую Вам скачать мою капчу, я буду объяснять на ее примере.

Сначала нам нужно сделать заготовку плагина. Обычно плагин для WordPress может состоять из скольки угодно файлов и вообще иметь любую структуру. Ядро движка определяет – какой файл плагина является заголовочным (главным) по специальному PHP-комментарию в самом начале файла. Вот как он выглядит:

<?php
/*
Plugin Name: DCaptcha
Plugin URI: http://lamara-nsk.ru
Description: Smart captcha for wordpress comments.
Author: DimoninG
Version: 0.1b
Author URI: http://lamara-nsk.ru
*/
.................. дальше код плагина ...................

Записи вроде «Plugin Name:» и аналогичные как раз и служат для того, чтобы ядро WordPress смогло определить – плагин это или нет. Все эти поля отлично переводятся по словарю, да и вообще не составляют никакой тайны: название, адрес плагина, описание, автор, версия, адрес сайта автора.

Здесь я немного поясню для тех, кто никогда плагины для WordPress не писал. В WordPress все сделано очень просто. Для каждого действия в ядре предусмотрена какая-то функция. Например, есть функция для вывода заголовка – get_title (или как-то так, сейчас не о ней). Если Вы в своем плагине просто создадите собственную функцию с таким же именем, то WordPress автоматически вызовет Вашу функцию после вызова встроенной в ядро. И передаст ей все те же параметры, что передал «родной» get_title!

Альтернатива – это вручную указать, какую собственную функцию вызывать после вызова одной из стандартных функций WordPress’а (здесь будет сделано именно так).

Другими словами – мы можем совершать некоторые действия после вызова любых функций и совершения любых операций самим движком WordPress.

В данном случае нам придется работать с постингом комментариев и выводом формы комментирования. Это для того, чтобы в форме добавить собственно капчу, а при комментировании проверить – прошел ли пользователь капчу или нет.

Добавляем капчу в форму постинга комментариев.

Во всем плагине это самый сложный момент. Все необходимые действия выполняет наша функция dcaptcha_draw ($id); Вот и она (она же есть в самом плагине, см. ссылку выше):


function dcaptcha_draw ($id){
global $user_ID;

if ($user_ID){
return $id;
}

// здесь было CSS-оформление капчи,
// я его пропустил
<script language="javascript">
function dcaptcha_change(){

if (document.getElementById('dcaptcha_captcha1').className ==
"dcaptcha_yellow"){
document.getElementById('dcaptcha_captcha1').className = "dcaptcha_red";
document.getElementById('dcaptcha_sess').value = 0;
}
else{
document.getElementById('dcaptcha_captcha1').className = "dcaptcha_yellow";
document.getElementById('dcaptcha_sess').value = 1;
}
}

</script>

<div id="dcaptcha"><p>
<div class="dcaptcha_red" id="dcaptcha_captcha1" onclick="dcaptcha_change();">
<b>Да человек я, человек! =)</b></div>
<label for="dcaptcha_captcha1"><small><b>Если Вы человек - кликните
на красный прямоугольник!</b></small></label></p>
</div>
<input type="hidden" name="dcaptcha_sess" id="dcaptcha_sess" value="0">

<script>
var commentField = document.getElementById("url");
var submitp = commentField.parentNode;
var answerDiv = document.getElementById("dcaptcha");
submitp.appendChild(answerDiv, commentField);
</script>
<?php
}

Я пропустил CSS-оформление капчи, т.к. к функциональной части плагина оно не имеет никакого отношения. Описываю остальное.

В глобальной переменной $user_ID содержится ID пользователя, под которым сейчас залогинен комментатор. То есть – если Вы зарегистрированы и вошли в аккаунт, Вам присвоен некий user_ID и именно в этой переменной он «проходит» весь движок. Соответственно, если Вы залогинены – капчу мы не показываем.

Дальше. Я не буду разбирать сам JavaScript-код. Дело в том, что его написать можно каким угодно – он тоже в некотором роде имеет отношение к оформлению (идее капчи). Здесь с помощью JavaScript-а осуществляется «окраска» прямоугольника в белый или красный цвет, в зависимости от того, кликнул ли комментатор на капчу или нет.

Обращаю Ваше внимание! Если кликнул – значит человек. Если кликнул – мы записываем в скрытое поле dcaptcha_sess значение 1 (по умолчанию 0). Именно по значению этого поля мы и будем определять – человек это или робот.

Кроме того, здесь присутствует еще один javascript-код. Я был удивлен, но только с помощью JavaScript можно установить капчу в форме комментирования именно там, где хочется – то есть (у меня) прямо над блоком ввода комментария. По умолчанию все, что выводит плагин с помощью функции вывода формы комментирования записывается уже после этой формы. Поэтому приходится прибегать к уловкам и встраивать в дерево иерархии объектов на странице нашу форму с капчей, иначе она будет не там, где нам хотелось бы.

Вот код установки капчи в нужное место (он выше тоже приведен):

<script>
var commentField = document.getElementById("url");
var submitp = commentField.parentNode;
var answerDiv = document.getElementById("dcaptcha");
submitp.appendChild(answerDiv, commentField);

Тут не происходит ничего страшного – сначала мы получаем идентификатор поля с ID равным url и записываем его в переменную commentField. В поле с ID равным url комментатор как раз записывает адрес своего блога. Потом мы получаем идентификатор нашей формы с капчей (она у меня заключена в большой div, который имеет ID равный dcaptcha). И последней операцией мы говорим браузеру, чтобы он сделал наш div дочерним по отношению к полю ввода url. То есть – поставил наш div после поля ввода url.

Промежуточный итог.

Мы сделали плагин, который добавляет к форме комментирования капчу. Капча работает так – если на нее кликнули, JavaScript-скрипт записывает в поле dcaptcha_sess единицу, что и означает, что это человек.

Постинг коммента.

Теперь нам нужно сделать пару заключительных штрихов. Когда комментарий постится в блог, нужно проверять, какое значение у переменной dcaptcha_sess (она проходит через POST-запрос, а значит в массиве $_POST, как и все остальные поля комментария). Если dcaptcha_sess равна 1, значит писал человек (кликнул на капчу как и просили), можно постить. Если нет – это спам.

Для этого сделана очень простая функция:


function comment_post ($id){
	global $user_ID;

	if ($user_ID){
		return $id;
	}

	if ($_POST['dcaptcha_sess'] != '1'){
		wp_set_comment_status($id, 'delete');
		echo "wrong captcha. no spam, please.";
		exit;
	}
}

Как ни странное – сам WordPress сначала записывает комментарий в базу, а уже потом вызывает нашу функцию-дополнение к собственной. Поэтому в качестве параметра мы получаем ID комментария, который комментатор добавил только что.

Как и в функции dcaptcha_draw сначала мы проверяем – а не был ли залогинен пользователь? Если был – постим комментарий сразу. Дальше мы проверяем $_POST['dcaptcha_sess']. Если она не равна единице, а значит это добавлено ботом (или человек забыл нажать на капчу), то мы – сначала удаляем комментарий, используя стандартную функцию wp_set_comment_status (в качестве параметров передаем ей ID комментария для удаления и ключевое слово, означающее, что комментарий надо удалить). Потом мы пишем, что неверно введена капча и завершаем вообще все скрипты.

Таким образом, если капча введена неверно (на нее не кликнули) – WordPress закрывается и остается только сообщение о кривой капче. А если все хорошо – эта ветка скрипта (удаление комментария и завершение работы) вообще не выполняется и с уже добавленным в базу комментарием ничего не происходит.

И финальный шаг.

Нужно указать WordPress’у, что мы хотим вызывать наши функции-обработчики наравне с его собственными функциями. Для этого мы воспользуемся функцией add_action, где первым параметром идет имя функции WordPress’а, а вторым – нашей, которую и нужно вызвать одновременно с его функцией. Вот так:


add_action('comment_post', "comment_post");
add_action('comment_form', "dcaptcha_draw");

Готово. Поздравляю, мы сделали капчу.

О «классическом» механизме работы капчи.
О взломе моей капчи.
И о взломе капчи с zarabotai.lv.

Я обещал это рассказать. Без грустного не обошлось. Чтобы все было понятно, сначала я объясню «классический» механизм работы капчи, где нужно вводить цифры с картинки.

Классическая капча работает так: случайным образом генерируется картинка; значение, отображенное на ней записывается в переменную сессии для данного пользователя. После этого оно сравнивается со значением, введенным самим пользователем в поле и если они не совпали – это спам.

В чем суть? Суть в том, что спам-бот не может прочитать сессию – для него единственный выход – это разобрать, что написано на картине. А чем сложнее картинка, тем сложнее спам-боту разобрать, что на ней написано.

О взломе моей капчи и о взломе капчи с zarabotai.lv.

Здесь же, для взлома нужно всего-навсего передать значение 1 для поля dcaptcha_sess в POST-запросе, это легче, чем писать скрипт разбора картинки. Другое дело, что в спам-базах обычно десятки тысяч сайтов, для каждого руками подобрать способ взлома – можно сойти с ума. Поэтому спаммеры обычно выбирают блоги, сайты и форумы со «стандартными» капчами (иначе для каждого блога и сайта нужно собственноручно создать скрипт, который мог бы спамить – дорого и малоэффективно)

В этом и секрет счастья – так сказать, эффект нестандартности капчи. Таких больше нет ;) Если моя капча появится на 10.000 блогах – скорее всего она обратит на себя внимание спаммеров и ее взломают.

На этом же самом и основана капча с zarabotai.lv – какое-то поле изменяет свое знание. Ну или похожая проверка.

Здесь оговорюсь – не всегда и капча-картинка спасет. Например, стандартную капчу от форума phpBB довольно давно сломали и уже насыпались терабайты спама на все форумы, где установлена стандартная капча. И она как раз вариант капчи с картинкой!

Ммм… Я как-то так подошел к тому, что в любую капчу можно сломать. ;) И если мою сломают, я за 5 минут чуть-чуть где-нибудь изменю ее (например, изменю название dcaptcha_sess на другое или по-другому сделаю проверку), выпущу плагин с новой версией – и все, спама опять не будет ;)

Конечно, вышесказанным я немножко отпугнул «простого пользователя». Но, пожалуйста, не бойтесь. В компьютерах, которые изобрел человек, как известно царь и бог – человек. То есть – взломать могут что угодно, когда угодно. Есть даже такое выражение «В каждой программе есть хотя бы одна ошибка». Сломать могут любую капчу, главное – «плотно» ей заняться.

Да и не Россию мы тут спасаем от третьей мировой, чего это я :lol: Я призываю все же сделать свой блог комфортнее и удобнее – поставить капчу «в один клик» и забыть про ужас о вводе цифр ;)



Отзывов (31) на «Как сделать свою капчу (плагин) для WordPress?»


ae471697

    пишет:

    Спасибо! Эта капча с квадратиком просто супер!


    пишет:

    Хорошая капча, может себе кстати поставлю :smile:
    А как вам такая мысль: есть картинка и на ней число от 1 до 9 прописью (понятным и видным шрифтом без всяких там искажений). Все что надо сделть пользователю, это вписать число цифрой. Помойму боты еще не умеют распознавать цифры которые написаны текстом в виде картинки. Плюс в том что думать комментатору над капчей не надо, просто ввел цифру и все :smile:


    пишет:

    2bishai: так все капчи сейчас такие и есть O_o Боты наоборот уже могут распознать почти все даже самые изощренные и замазанные-искаженные картинки ;) В этом-то и дело. Нужен другой подход, чтобы «наверняка».


    пишет:

    DimoninG, я немного про другое, одно дело роботу надо просто распознать текст, другое дело он должен вычислить что «пять» == 5.


    пишет:

    2bishai, так ведь вычислить, что «пять» == 5 – это еще легче, чем распознать текст. Кстати, Вы натолкнули меня на забавную мысль о капче. Возможно потом сделаю, это будет точно уникальная капча ))


    пишет:

    DimoninG, так в том и дело, что надпись «пять» в виде картинке. Сначала боту придется распознать картинку, а потом еще сравнить, что «пять» == 5. То есть тут уже боту не обойтись распознаванием картинки и вставкой ее в текст, боту придется иметь базу с числами прописью и цифрами. Я таких не видел)

    Рад был натолнкнуть на мысль)


    пишет:

    2bishai: мы об одном и том же по сути. Для распознавания и Вашей и моей идеи капчи нужно просто подправить спам-бота вручную для этой капчи. :) Безопасность одинаковая, имхо.


    пишет:

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


    пишет:

    Номад Кочующий, могу. Стучите в аську: 361 266 067


    пишет:

    Да человек я, человек! =). Давно искал данную информацию, Премного благодарен.


    пишет:

    не в тему: если заметка стала популярной, поставьте в начало новости какой-нибудь полезный вам блок, ну к примеру “повысь мне карму в Хабрахабре”


    пишет:

    А как реализовать при разработке своего плагина функцию проверки на обновления и, соответственно, автоматическое обновление плагина?


    пишет:

    блин, сделай просто готовый плугин и продай.
    сделал закладку на ваш блог.


    пишет:

    Спасибо, Димон.
    Постиавил себе на блог вместо картиночной капчи.
    Посмотрим, что скажут читатели.


    пишет:

    А где можно найти информацию (желательно на русском языке) как создавать собственные плагины для wordpress? Как вынести какие-либо настройки в админку и тд.


    пишет:

    А чего сам своей капчей в блоге не пользуешься?


    пишет:

    Хотелось бы примерчик, посмотреть как работает капча :neutral:


    пишет:

    Степаныч, удивительно. Ну не знаю. Где же это может быть? Может на моем блоге? :)


    пишет:

    У меня капча не качаеться! :evil: Чё забросил чтоли? А блог милый очень явный плюс за труды! 591204


    пишет:

    нормуль, есть свои плюсы


    пишет:

    надо попробывать. у меня с этим постоянно проблемы


    пишет:

    Ссылка не работает ((


    пишет:

    удобная тема, согласен. у меня пару сайтов тоже есть на wp – спам их вечная проблема


    пишет:

    Реально спасибо за капчу. Очень понравилась, использую на некоторых сайта спама стало на много меньше


    пишет:

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


    пишет:

    Говорят пробивают ее все-же?
    или нет?


    пишет:

    мне кажется лучше разработать индивидуальную капчу, правильно было выше написано. Потому что нет достойных отпоров для спама


    пишет:

    Polly, блогу больше 2х лет и с момента разработки капчи (без ее усовершенствований и прочего) не было НИ ОДНОГО спам-коммента. Если это не защита, то покажите защиту.


    пишет:

    Хотелось бы готовый плагин :???:


    пишет:

    а что мешает спам ботам поставить галку? или я чего то не понимаю?


    пишет:

    Чет не понятно ссылка, что непашет? Меня уже замучали спамы, а вот ни одна капча нехочет работать!Вот сижу разбираюсь с траблой)


Оставьте свой комментарий

Что здесь почитать?



1.   Разработки.
1.1 Плагин "Я не робот"
1.2 Плагин "Код Adsense прямо в пост"

2.   Заработай.
2.1 Блогун: 20$ в день
2.2 Уходим от налогов в Sape
2.3 Хватит думать, пора зарабатывать

3.   Акции и конкурсы.
3.1 Ссылка за "Рабочий стол"

Показать весь список.

-->








Блог на движке WordPress и тема для него создана DimoninG'ом в 2007 году.
Все материалы авторские, их копирование запрещено законом об авторском праве.