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

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

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

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

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

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

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

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

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

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

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

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

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

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

Особенности работы в вебкам студии

Работа в вебкам студии Москвы - это одна из самых уникальных и необычных профессий, которые появились в нашем современном мире. Это инновационная сфера, которая с кажд...

Допрос у следователя: как себя следует вести?

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

Как выбрать брус для строительства дома

Для возведения частных домов сегодня используют различные материалы. Среди них – кирпич, газобетонные блоки, СИП-панели, оцилиндрованное бревно и др. Одним из самых во...

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

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

 

Как сделать свою капчу (плагин) для 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? » Новости интернета: гаджеты, игры. программы