Итак, есть блог на WordPress с формой для голосования, которая реализована с помощью плагина WP-Polls. Появилось желание потестировать плагин на защищенность от накрутки перед использованием.
Ниже приведу результаты моих экспериментов над несчастным WP и не менее несчастным WP-Polls.
Дан блог на WordPress с голосованием на WP-Polls. Голосование доступно для всех посетителей. Защита от повторного голосования осуществляется блокировкой по IP. В опросе возможен выбор только одного варианта.
Необходимо написать скрипт, который может влиять на результаты голосования.
При добавлении голосования, на страницу вставляется следующая форма:
После выбора варианта на сервер ajax'ом отправляется запрос вида:
где poll_id — id опроса, а poll_1 — варианты ответа ( после подчеркивания в имени переменной идет id опроса).
Реализация защиты от повторного голосования
Воспользуемся тем, что WP — проект с открытым кодом и изучим исходники плагина.
Очевидно, что нам нужна функция
В функции check_voted_ip($poll_id) выполняется запрос к БД на предмет наличия записи с данным id опроса и ip пользователя. IP адрес возвращается функцией
Из этой функции следует, что мы со спокойной душой выставляем ручками заголовок "X_FORWARDED_FOR", который и будет использован плагином для проверки повторного голосования.
Не буду приводить листинг скрипта по накрутке опроса ввиду его тривиальности. Достаточно на наиболее любимом вами языке программирования написать скрипт/программу, которая будет отправлять POST запрос на адрес плагина с необходимыми параметрами, при этом, при каждом запросе должен выставляться уникальный заголовок «X_FORWARDED_FOR».
В данной статье приведен вариант обхода защиты от повторного голосования в плагине WP-Polls для WordPress. В представленном материале не рассматривается вариант использования proxy-серверов ввиду большей трудоемкости по сравнению с представленным методом.
Естественно, что результаты работы скрипта легко исправляются через административную панель WP. Данная информация представлена исключительно в ознакомительных целях.
В процессе разбора исходного кода плагина, был обнаружен еще один способ накрутки, который отрабатывает не совсем корректно.
Этот способ связан с возможностью плагина реализовывать опросы, в которых пользователь может выбрать несколько вариантов ответов. На сервер они передаются через запятую:
При обработке скриптом этот параметр бьется по запятой в массив, по которому выполняется цикл:
Поэтому, для накрутки одного из вариантов достаточно передать строку вида:
чтобы увеличить кол-во голосов за данный ответ в N раз.
Недостаток заключается в том, что кол-во голосовавших все равно увеличится только на 1 и поползет отображение результатов голосования )
Ниже приведу результаты моих экспериментов над несчастным WP и не менее несчастным WP-Polls.
Исходные данные
Дан блог на WordPress с голосованием на WP-Polls. Голосование доступно для всех посетителей. Защита от повторного голосования осуществляется блокировкой по IP. В опросе возможен выбор только одного варианта.
Необходимо написать скрипт, который может влиять на результаты голосования.
Изучаем предметную область
При добавлении голосования, на страницу вставляется следующая форма:
После выбора варианта на сервер ajax'ом отправляется запрос вида:
POST http://test.ru/wp-content/plugins/wp-polls/wp-polls.php poll_1: 1 poll_id: 1 rndval: 1221566428538 vote: true
где poll_id — id опроса, а poll_1 — варианты ответа ( после подчеркивания в имени переменной идет id опроса).
Реализация защиты от повторного голосования
Воспользуемся тем, что WP — проект с открытым кодом и изучим исходники плагина.
Очевидно, что нам нужна функция
check_voted($poll_id)
в которой вызывается check_voted_ip($poll_id)
.Начинаем шалить
В функции check_voted_ip($poll_id) выполняется запрос к БД на предмет наличия записи с данным id опроса и ip пользователя. IP адрес возвращается функцией
get_ipaddress()
:function get_ipaddress() { if (empty($_SERVER["HTTP_X_FORWARDED_FOR"])) { $ip_address = $_SERVER["REMOTE_ADDR"]; } else { $ip_address = $_SERVER["HTTP_X_FORWARDED_FOR"]; } if(strpos($ip_address, ',') !== false) { $ip_address = explode(',', $ip_address); $ip_address = $ip_address[0]; } return $ip_address; }
Из этой функции следует, что мы со спокойной душой выставляем ручками заголовок "X_FORWARDED_FOR", который и будет использован плагином для проверки повторного голосования.
Реализация
Не буду приводить листинг скрипта по накрутке опроса ввиду его тривиальности. Достаточно на наиболее любимом вами языке программирования написать скрипт/программу, которая будет отправлять POST запрос на адрес плагина с необходимыми параметрами, при этом, при каждом запросе должен выставляться уникальный заголовок «X_FORWARDED_FOR».
Заключение
В данной статье приведен вариант обхода защиты от повторного голосования в плагине WP-Polls для WordPress. В представленном материале не рассматривается вариант использования proxy-серверов ввиду большей трудоемкости по сравнению с представленным методом.
Естественно, что результаты работы скрипта легко исправляются через административную панель WP. Данная информация представлена исключительно в ознакомительных целях.
P.S.
В процессе разбора исходного кода плагина, был обнаружен еще один способ накрутки, который отрабатывает не совсем корректно.
Этот способ связан с возможностью плагина реализовывать опросы, в которых пользователь может выбрать несколько вариантов ответов. На сервер они передаются через запятую:
poll_1: 1,2,3,4
При обработке скриптом этот параметр бьется по запятой в массив, по которому выполняется цикл:
foreach($poll_aid_array as $polla_aid) { $wpdb->query(" UPDATE $wpdb->pollsa SET polla_votes = (polla_votes+1) WHERE polla_qid = $poll_id AND polla_aid = $polla_aid "); }
Поэтому, для накрутки одного из вариантов достаточно передать строку вида:
poll_1: 1,1,1,...,1
чтобы увеличить кол-во голосов за данный ответ в N раз.
Недостаток заключается в том, что кол-во голосовавших все равно увеличится только на 1 и поползет отображение результатов голосования )