Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Security] Nieświadome ocenianie, Nie wysyłać oceny przez GET?
WebCM
post
Post #1





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

Ostrzeżenie: (0%)
-----


Kod:
  1. <ul class="rate avg3">
  2. <li><a href="vote.php?rate=1" class="r1">1</a></li>
  3. <li><a href="vote.php?rate=1" class="r2">2</a></li>
  4. <li><a href="vote.php?rate=1" class="r3">3</a></li>
  5. <li><a href="vote.php?rate=1" class="r4">4</a></li>
  6. <li><a href="vote.php?rate=1" class="r5">5</a></li>
  7. </ul>

Chcę umożliwić także głosowanie użytkownikom z wyłączoną obsługą JS (AJAX). Chyba, że to bez sensu?

W przykładzie oceny są wysyłane metodą GET. Bardzo niebezpiecznie, bo użytkownik może zagłosować nieświadomie:
  1. <a href="vote.php?id=500&ocena=1">Cud na boisku - Polacy wygrali 5:0</a>
  2. <img src="vote.php?id=4&ocena=5" /> - tak, z dowolnego miejsca w Internecie

Najlepiej wysyłać ocenę metodą POST. Tylko zostaje pytanie:
A. zastosować alternatywny formularz dla użytkowników bez JS
B. oprzeć głosowanie o <input type="image" />, ale prawdopodobnie tracę kontrolę nad gwiazdkami w CSS
C. generować gwiazdki za pomocą JS, a domyślnie wyświetlać tylko ocenę z linkiem do alternatywnego <form>

Chociaż w przypadku POST też jest zagrożenie, że trafisz na stronę ze złośliwym skryptem JS. Tylko znacznie mniejsze.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Exek
post
Post #2





Grupa: Zarejestrowani
Postów: 120
Pomógł: 10
Dołączył: 16.08.2007

Ostrzeżenie: (0%)
-----


Najlepiej rzuć głosowanie POSTem, a w linkach generuj jakiś unikalny klucz zapisywany w sesji, sprawdzany w POSTcie.
Go to the top of the page
+Quote Post
dadexix
post
Post #3





Grupa: Zarejestrowani
Postów: 439
Pomógł: 21
Dołączył: 28.06.2007
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


POST + Ciastka...

A dodatkowo <noscript> a w nim zwykjły form z selectem....


Tylko ile osob nie uzywa js?
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Znane http://en.wikipedia.org/wiki/Cross-site_request_forgery poczytaj i popatrz na rozwiazania
Go to the top of the page
+Quote Post
WebCM
post
Post #5





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

Ostrzeżenie: (0%)
-----


Problem znany, lecz zabezpieczenie trudniejsze. Jest jeszcze jedno rozwiązanie:

  1. <form method="POST" class="rate">
  2. </form>

Potem wystarczy przypisać style do przycisków i nałożyć tło, czyli gwiazdki. Jest 1 problem - między przyciskami występuje 1 spacja, gdyż każdy <button> w kodzie znajduje się w osobnej linijce dla lepszej czytelności.

Chociaż pomysł z kluczem jest ciekawy. Tylko gdzie go trzymać? W zmiennej sesji? Zagrożenie związane z GET powinno zmniejszyć się. Chociaż nie... Złośliwy użytkownik umieści na obcym forum "obrazek" o URL = towar.php?id=X, a później URL = glosuj.php?id=X i po sprawie. Pierwsze żądanie spowoduje przypisanie kodu do zmiennej sesyjnej, a drugie zagłosuje na określony towar.

Na razie najlepszą ochroną jest dobrze wykorzystany REFERER. Może jeszcze coś pominąłem.

W przypadku POST można jeszcze inaczej zabezpieczyć formularz. Zapisać kod do sesji i umieścić go w polu typu HIDDEN. Chociaż w tym przypadku można wykraść kod i spreparować formularz, stosując podobnie jak powyżej 2 żądania "obrazki".

Zatem jednak lepiej wysyłać ocenę metodą POST.

Tylko co zrobić z osobami, które wyłączyły JavaScript? Uniemożliwić im głosowanie? Ewentualnie utworzyć link w <noscript> prowadzący do alternatywnego formularza. To może znów stanowić problem dla użytkowników PDA lub telefonów komórkowych, bo chyba wszystkie modele obsługują JavaScript i AJAX. Każde żądanie kosztuje!

Jakie jest wasze zdanie? Jakie są wady i zalety różnych rozwiązań? Które najlepsze i dlaczego?
Go to the top of the page
+Quote Post
bełdzio
post
Post #6





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


ja bym dal forme z radiobuttonami + labelami z tym ze radiobuttony bylyby ukryte przy pomocy css, klik w labela -> zaznaczenie radiobuttona -> klikniecie w submita glosuj -> ide spac (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.12.2025 - 07:40