Спонсор поста: дизайн интерьера, форум о дизайне интерьера
__________________________________
В этой статьей я достаточно подробно расскажу, как я сделал свою капчу и как вообще делается капча в виде плагина для 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 на другое или по-другому сделаю проверку), выпущу плагин с новой версией – и все, спама опять не будет
Конечно, вышесказанным я немножко отпугнул «простого пользователя». Но, пожалуйста, не бойтесь. В компьютерах, которые изобрел человек, как известно царь и бог – человек. То есть – взломать могут что угодно, когда угодно. Есть даже такое выражение «В каждой программе есть хотя бы одна ошибка». Сломать могут любую капчу, главное – «плотно» ей заняться.
Да и не Россию мы тут спасаем от третьей мировой, чего это я Я призываю все же сделать свой блог комфортнее и удобнее – поставить капчу «в один клик» и забыть про ужас о вводе цифр
Оставьте свой комментарий
|
11.08.2008 в 1:28 пп
11.08.2008 в 2:52 пп
А как вам такая мысль: есть картинка и на ней число от 1 до 9 прописью (понятным и видным шрифтом без всяких там искажений). Все что надо сделть пользователю, это вписать число цифрой. Помойму боты еще не умеют распознавать цифры которые написаны текстом в виде картинки. Плюс в том что думать комментатору над капчей не надо, просто ввел цифру и все
11.08.2008 в 3:00 пп
14.08.2008 в 9:46 пп
14.08.2008 в 10:04 пп
15.08.2008 в 5:05 пп
19.08.2008 в 4:36 пп
22.08.2008 в 12:58 дп
22.08.2008 в 1:09 дп
30.10.2008 в 9:22 пп
01.11.2008 в 5:43 пп
02.11.2008 в 3:38 дп
05.11.2008 в 4:52 дп
сделал закладку на ваш блог.
05.12.2008 в 12:46 пп
Постиавил себе на блог вместо картиночной капчи.
Посмотрим, что скажут читатели.
22.03.2009 в 11:49 дп
28.04.2009 в 9:54 пп
30.04.2009 в 10:55 пп
01.05.2009 в 1:36 дп
03.05.2009 в 7:42 дп
05.05.2009 в 12:21 дп
07.06.2009 в 7:48 пп
24.07.2009 в 10:53 дп
09.08.2009 в 1:36 пп
10.08.2009 в 5:37 пп
25.08.2009 в 9:24 дп
Следующим этапом хочется получить законченный плагин, чтобы ничего уже руками не ковырять в движке
10.09.2009 в 7:56 пп
или нет?
15.09.2009 в 10:31 пп
15.09.2009 в 11:06 пп
21.09.2009 в 10:42 пп
05.11.2009 в 10:56 дп
05.01.2010 в 1:47 дп