Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczenie ankiet przed multigłosowaniami
Forum PHP.pl > Forum > PHP
Blackhole
Hej!
Zrobiłem mechanizm do głosowania w ankietach. Przed wielokrotnym głosowaniem zabezpieczam się ciastkiem i adresem IP. U mnie na FF działa dobrze, na IE podobno też.
Jeden z użytkowników napisał mi jednak, że w Operze można głosować wiele razy, jeśli po oddaniu głosu wciśnie się przycisk WSTECZ. Pisze, że to może wina innego silnika i że
Cytat
Jeśli chcesz zrobić sobie dowolną ilość głosów wystarczy przy pierwszym głosowaniu w przeglądarce kliknąć wstecz i możesz ponownie głosować. Licznik sumuje każdy raz jako kolejny głos.
Sprawdziłem to na kilku sondach, na LK dodałem 50 głosów(zweryfikuj sobie jak masz możliwość, kliknięcia co 0.5s).
Wszystko odbyło się na Operze w wersji 10.54, na IE wszystko w porządku.

Sprawdzałem ciasteczka, i z tego co widzę nawet jak wyczyściłem bufor ciasteczkowy, to rozpoznawał poprawnie sondaże.
Po za tym w normalnych warunkach działa dobrze, tzn zagłosować można tylko raz. Chodzi tylko o sytuację wyboru za pierwszym razem, cofnięcia się do strony poprzedniej i głosowanie jest ponownie dostępne. Z punktu widzenia kodu w serwerze ta sama sesja nie powinna być zaliczania jako nowa.
Prawdopodobnie problem jest w samej Operze, ma inny silnik niż IE, i prawdopodobnie symuluje cofnięcie realnie, czyli z zmianom kodu ciasteczka na poprzednie. W IE kod ciasteczka pozostaje ten sam, i jest modyfikowany tylko przez serwer.
Jakie macie sprawdzone sposoby, by takie zabezpieczenie działało wszędzie i skutecznie?
tehaha
no jeżeli problemem jest tylko luka w postaci przycisku wstecz, to możesz po pierwszym wysłaniu formularza ustawiać zmienną sesyjną np jakieś $_SESSION['sent'] = true;
i przy każdym wysłaniu sprawdzasz czy ta zmienna jest ustawiona, jeżeli tak to nie uznajesz głosu
Wicepsik
Stwórz sobie w bazie tabele która będzie przechowywała adresy IP osób które już zagłosowały. Gdy użytkownik zagłosuje w ankiecie sprawdzasz czy jego IP jest w bazie. Jeśli nie ma to zatwierdzasz ankietę, jeśli nie to wyświetlasz stosowny komunikat o tym, że już dana osoba głosowała w ankiecie.
croc
Najskuteczniejszy sposób to głosowanie tylko dla zalogowanych bądź potwierdzanie głosu mailem (to ostatnie upierdliwe) laugh.gif Wszelkie inne sposoby są łatwe do oszukania, a IP nie jest do końca sprawiedliwe. IP to nie jest cecha osoby tylko sieci. Wyobraź sobie wielką kafejkę internetową, w której siedzą dwaj potencjalni respondenci. Obaj chcą zagłosować, ale nie mogą tylko dlatego, że przypadkowo korzystają z tej samej sieci.
Blackhole
Co do tego IP i właściwości sieci macie rację. Poza tym na neostradzie (o ile wiem) często zmienia się IP, więc jej userzy mogliby częściej głosować.

Co myślicie o takim zabezpieczeniu?
- po zagłosowaniu ustawiam cookie, wpisuję też IP do bazy i ustawiam w sesji, że głos został oddany
- gdy ktoś usunie cookie, to przy kolejnej odsłonie strony sprawdzam, czy jego IP jest w bazie lub w sesji jest info o zagłosowaniu; jeśli tak, to ponownie ustawiam cookie
- gdy zmieni się IP usera, to sprawdzam, czy ma cookie lub info w sesji; gdy ma, wpisuję IP do bazy
- gdy zniknie info sesji, sprawdzam istnienie cookie lub wpisu o IP w bazie; gdy jest, ustawiam info w sesji
phpion
@up:
A co jeśli ktoś się rozłączy (zmieni adres IP) oraz usunie cookie? Jedyne sensowne i skuteczne zabezpieczenie to ograniczenie głosowania tylko dla zalogowanych użytkowników.
Blackhole
Wykonanie tych 3 rzeczy na raz jest bardzo mało prawdopodobne, a jeśli już, to też zniechęcające do ingerowania w wyniki takim sposobem.
Ograniczenie głosowania tylko dla zalogowanych zmniejsza mocno ilość ankietowanych.
erix
Cytat
Wykonanie tych 3 rzeczy na raz jest bardzo mało prawdopodobne

Do pierwszego ataku (D)DoS, który będzie miał na celu zmanipulowanie wyników ankiety. Projektując cokolwiek, co wchodzi w interakcję z danymi od użytkownika ZAWSZE zakładamy NAJGORSZY możliwy przypadek.

Cytat
Ograniczenie głosowania tylko dla zalogowanych zmniejsza mocno ilość ankietowanych.

Pozostaje więc zbieranie wszystkich głosów i późniejsza analiza statystyczna (odstępy czasowe, etc).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.