Modifikacia hlasovania na dekahity.sk

14.06.2004 11:22 | blackhole

Zacalo to okolo obeda, ked zimors na #cs vyhlasil ze istej skupine na hlasovani dekahitov natukal kopu hlasov... skusil som to tiez a zistil som ze hlasovanie je zalozene na cookies - ked zahlasujete, server vam posle cookie a ked ju browser zozerie, uz viac hlasovat nemozete.

Nastastie mam browser nastaveny tak, aby sa na kazdu cookie pytal, ci suhlasim. Standardne nesuhlasim (iba ak to naozaj inac nejde), takze som okamzite mohol kliknut viackrat na toho isteho interpreta. Hlasy sa samozrejme vzdy zaratali.

Skusil som stiahnut stranku wgetom (naco dvihat hlasy manualne ak sa da urobit skript), ale ten mi vyhlasil chybu:

uhlar@work% wget 'http://www.dekahity.sk/hlasuj?id=24&pocet_hlasov=6391'
--14:57:07-- http://www.dekahity.sk/hlasuj?id=24&pocet_hlasov=6391
=> `hlasuj?id=24&pocet_hlasov=6391'
Resolving localhost... done.
Connecting to localhost[127.0.0.1]:8080... connected.
Proxy request sent, awaiting response... 302 Moved Temporarily
Location: [following]
http://www.dekahity.sk/hlasuj?id=24&pocet_hlasov=6391: Redirection cycle
detected.

cas je iny nakolko clanok pisem az den po akcii)

Tak som si otvoril druhy browser (na rychlejsej masine), kde sa dalo klikat rychlejsie. Parkrat som klikol, zvysil pocet hlasov a vratil sa k prvemu browseru. Na moje prekvapenie som po kliknuti v starom browseri vratil pocet hlasov na nizsie miesto. Zacal som mat silne podozrenie, ze kolko hlasov zadam pri kliknuti, tolko sa zarata na serveri bez kontroly kolko hlasov bolo predtym. To by spravne nefungovalo ani so zapnutymi cookies - staci aby si niekto natiahol stranku, a o nejaky cas zahlasoval - vsetci co by si stranku natiahli potom a hlasovali pred nim, by o svoje hlasy prisli.

Kedze wget som neprinutil zacyklit sa, skusil som to rucne - vypytat si dokument priamo od servera. Vysledok bolo na dekahitoch vidiet okamzite po refreshi - vyvolenej osobe som dvihol hlasy z 10 na 6379... Stacilo si vypytat nejake URL:

GET http://www.dekahity.sk/hlasuj?id=cislo1&pocet_hlasov=cislo2 HTTP/1.0
Referer: http://www.dekahity.sk/hlasuj?id=cislo1&pocet_hlasov=cislo2

kde cislo1 a cislo2 nahradime cislom interpreta a poctom hlasov, pricom sa na serveri tvarime, ze sme prisli z tej istej URL (co urobi presne browser vdaka tomu ze ho skript spravujuci hlasovanie presmeruje na seba sameho). Teda, zadame hlavicku Referer: s parametrom totoznym so zadanym URL. Priklad vidime na obrazku dekahity1.jpg a vysledok na obrazku dekahity2.jpg.

Yano ma upozornil na letne dekahity, overil som si to (obrazok dekahity3.jpg) a zistil som ze aj tam sa to da oklamat (dekahity4.jpg). Zistil som tiez, ze viac hlasov ako 2147483647 (dve miliardy a nejake
drobne) nie je mozne zadat. To cislo som si nevyberal nahodne, je to najvyssie cislo ake je mozne za istych okolnosti spracovat. Vacsinou staci - nepredpokladame, ze by na dekahitoch hlasovala tretina obyvatelov zemegule. Taktiez vsak nepredpokladame ze to bude niekto hackovat ;

Dodatocne mi napadlo vyskusat si zaporne cisla - tie by sa tam vynimali tiez dobre. Vysledok - obrazok dekahity5.jpg. Tiez som si ofotil uvodnu stranku dekahitov (dekahity-titul.jpg) a firmy (gfxpulse.jpg), ktora sa chvali ze im robila design, podla mna otrasny (a dlho sa nacitava).

Co nam z toho celeho vyplyva:
Spoliehat sa na to, ze browser bude aceptovat cookies, nie je mozne. Nema tiez zmysel cookies vyzadovat - niektore browsery umoznuju obmedzit cookies na jjednu session, takze stranka by si sice myslela ze cookies ma browser povolene ale po jeho restarte by si kazdy mohol zahlasovat znovu.

Je uplny nezmysel zadavat pocet hlasov do stranky, tie sa musia udrziavat na serveri - aj nahodnym sposobom sa takto daju hlasy stracat. Popisal som vyssie.

Jediny pomerne spolahlivy sposob ako zabmedzit uvedenym problemom, je vytvorit pouzivatelom konta, a zamedzit tomu, aby si ich jeden pouzivatel vytvoril viac. Kvoli samotnemu hlasovaniu na dekahitoch si konto urobi clovek asi tazko. Ak sa vsak konta budu vytvarat s platnostou na viac serverov (v tomto pripade napriklad na vsetky hlasovania na markize, plus vyjadrovanie sa k clankom a podobne), mohlo by to stacit.

Mozno by sa na slovensku uzivil jeden server, ktory by mal za ulohu autentizovat pouzivatelov, pricom by nedal ziadnemu serveru ich osobne data - kazdemu spolupracujucemu servery by len podal nejaky identifikator, pricom pre jedneho pouzivatela by bol identifikator stale rovnaky, pre rozlicnych pouzivatelov vzdy iny, a identifikator jedneho pouzivatela by bol na kazdom serveri iny.

Podobny princip (autentizacia pouzivatelov a zaroven neprezradenie ich totoznosti) uz prevadzkuju platobne portaly ako PayPal, na slovensku napriklad TatraPay, aj ked za intym ucelom. Najde sa niekto, kto nam implementuje takuto sluzbu?

screenshot1
screenshot2

IRC LOGfantomas