Как собраться в пансионат в Сочи

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

Какие надписи и изображения можно напечатать на футболках для семейного праздника

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

Типичные неисправности топливной системы автомобилей Mercedes

Топливная система является одним из ключевых элементов любого автомобиля, и модели Mercedes – не исключение. Несмотря на известное немецкое качество и надежность, с те...

Сколько носят брекет-систему

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

Автоматизация мобильной торговли: новое поколение бизнеса

В последние годы автоматизация стала одной из ключевых тенденций в различных отраслях, и мобильная торговля не является исключением. В динамичном современном мире, где...

Почему лучше арендовать сервер на сайте 1BX.host?

Аренда сервера - услуга, которой пользуются многие владельцы интернет-магазинов. И это неудивительно, ведь хранение информации требует больших ресурсов. Покупка собств...

Slothash: простая и легальная цепочка добычи криптовалюты

Мир криптовалют за последние годы стремительно развивается, привлекая все большее внимание инвесторов и энтузиастов. Добыча криптовалюты становится все более популярно...

Какой гранит используют в РФ для изготовления памятников

В России существует множество месторождений гранита, поэтому для изготовления надгробий широко используются различные его виды. Они различаются между собой по составу,...

Как привлечь подписчиков на YouTube: способы и их особенности

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

Какие металлические детали можно сделать при помощи фрезеровки?

Фрезеровка – распространенный способ изготовления разнообразных металлических деталей, позволяющий с высокой точностью воспроизводить самые сложные формы. Сегодня зака...

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

О безопасности сайта | 25 ноя 2016, 12:59 | Просмотров: 702

 

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

 

 

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

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

Сначала нам нужно сделать заготовку плагина

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

<?php

/*

Plugin Name: DCaptcha

Plugin URI: http://dimoning.ru

Description: Smart captcha for wordpress comments.

Author: DimoninG

Version: 0.1b

Author URI: http://dimoning.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 Я призываю все же сделать свой блог комфортнее и удобнее – поставить капчу «в один клик» и забыть про ужас о вводе цифр ;)

Оставить отзыв
Как сделать свою капчу (плагин) для WordPress? » Новости интернета: гаджеты, игры. программы