Pull to refresh

Накручиваем голосование в WordPress

Reading time3 min
Views4.3K
Итак, есть блог на WordPress с формой для голосования, которая реализована с помощью плагина WP-Polls. Появилось желание потестировать плагин на защищенность от накрутки перед использованием.
Ниже приведу результаты моих экспериментов над несчастным 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 и поползет отображение результатов голосования )
Tags:
Hubs:
+5
Comments5

Articles