Kontrola vícenásobného přístupu II. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



PHP

Kontrola vícenásobného přístupu II.

php_ipcheck

18. dubna 2001, 00.00 | Pokračování článku o kontrole vícenásobého přístupu. Reakce čtenáře na dané téma vyústila v článek v němž přesně dokumentuje svoji metodu kontroly. Jak na to přes UniqID se dozvíte v tomto článku!

V článku "Kontrola vícenásobního přístupu" boli spomenuté 3 rôzne spôsoby kontroly či návštevník stránky nespôsobuje opakovaným klikaním zvýšenie svojich preferencií, napr. v anketách alebo hitparádach.

Dovolím si doplniť 4. spôsob kontroly, ktorý umožňuje obmedziť hlasovanie na konkrétnu položku v konkrétnej ankete, či hitparáde a nie je viazaný na IP adresu. Príklad využíva databázový systém MySQL.

Tento spôsob využijeme v prípade, že Váš web server obsahuje viacero ankiet alebo hitparád (napr. skladieb). Vtedy chceme obmedziť, aby návštevník opakovane nehlasoval pre rovnakú položku (napr. skladba A), ale mal možnosť hlasovať aj pre inú položku (skladbu B) alebo v inej hitparáde.

Najlepšie bude začať príkladom - predstavme si hitparádu hudobných skladieb:
Skupina, Skladba, Body
Depeche Mode, Strange Love, 15
Eiffel 65, Blue, 12
Snap, Power, 9


Chceme umožniť, aby návštevník mohol hlasovať za svoje obľúbené skladby (napr. Blue a Power). Na druhej strane chceme obmedziť, aby nezvyšoval preferencie svojej skladby tým, že bude opakovane na ňu klikať (napr. aby Blue predstihla Strange Love stačilo by 4x kliknúť). Avšak má návštevníkovi zostať možnosť hlasovať aj za inú skladbu (napr. Power), prípadne v inej hitparáde na našom serveri. Tu je rozdiel oproti spôsobom popísaným v predošlom príspevku, kedy takúto možnosť návštevník nemá. Taktiež je možné previesť opakované hlasovanie po uplunutí "bezpečnej" doby, napríklad po 5 minútach. Obmedzenie v dlhšom rozsahu (napr. celý deň) nemá zmysel, pretože návševník môže uzavrieť browser a spustiť ho znovu - čím sa vytvorí nová session a teda môže hlasovať znova. Nič nie je ideálne, ale väčšinu chytrákov uvedený spôsob odradí.
Keďže posledne boli uvedené spôsoby kontroly návštevníka podľa IP adresy, dovolím na doplnenie uviesť aj iný spôsob - podľa session. Pod session mám na mysli znova spustený browser. Tým pádom sa neobmedzuje súčasné hlasovanie ostatných návštevníkov z rovnakej IP adresy.
Kontrola jedinečnosti návštevníka je prevedená podľa jedinečného session ID, vytvoreného napríklad:

$sessionid = MD5(UniqID(""));

Jedinečné session ID sa vytvorí pri vstupe užívateľa na stránku (alebo web server). Takéto session ID si doporučujem predávať ako parameter pri každom volaní skriptu (poprípade použiť cookie bez nastavenia expirácie, t.j. ponechať platnosť cookie iba po dobu trvania session). Session ID je vhodné tiež uložiť v databáze pre ďalšie účely identifikácie návštevníka.

Čas sa bude kontrolovať podľa času posledného hlasovania, ktorý nám zabezpečí samo MySQL, ak použijeme typ položky timestamp.

Na rozlíšenie ankety, hitparády použijeme položku typ a na rozlíšenie položky v ankete, hitparáde položku cislo.

Výsledná tabuľka môže vyzerať takto - nazvime ju "hlasuj":

CREATE TABLE hlasuj (sessionid char(32) NOT NULL, ts timestamp(14), typ int(11) NOT NULL, cislo int(11) NOT NULL, PRIMARY KEY (ts), KEY bolo (userID, ts, typ, cislo));

A teraz môžeme prejsť k samotným ukážkam časti skriptov obsluhujúcich kontrolu viacnásobného prístupu, napríklad hlasovania. Vynechávam spojenie s databázou,ktoré si doplňte podľa vašeho konkrétneho použitia. Doporučujem umiestniť tieto skripty do tej časti Vašeho webu, kde dochádza k obsluhe hlasovania.

Pred prevedním zápisu nového hlasovania skontrolujeme, či rovnaký návštevník nehlasoval v rovnakej hitparáde za rovnakú položku:

  $minminut = 5; // po kolkych minutach moze hlasovat znova na polozku
  $xx = Date("YmdHis",Time()-$minminut*60);
  $sql = "select * from hlasuj where sessionid='$sessionid' and ts>='$xx'
          and typ=$typ and cislo=$cislo";
  $result = @mysql_query($sql);
  if ($row = @mysql_fetch_row($result))
    vystraha();
  else
    hlasovanie();

V prípade, že v tabuľke "hlasuj" sa nachádza záznam spĺňajúci podmienku, znamená to, že návštevník už hlasoval na danú položku a ešte neuplynula doba potrebná na povolenie opakovaného hlasovania. Preto sa vypíše výstraha a nerealizuje sa hlasovanie. V opačnom prípade dôjde k spracovaniu hlasovania (napr. sa zvýši počet bodov skladby v hitparáde).

Konkrétne hodnoty $typ, $cislo je potrebné nastaviť podľa kliknutia návštevníka na konkrétnu položku v konkrétnej hitparáde. Definície funkcií vystraha(), hlasovanie() si každý doplní podľa svojho použitia.

Súčasťou úspešného hlasovania, t.j. funkcie hlasovanie(), musí byť pridanie záznamu do tabuľky hlasuj:

  $sql = "insert into hlasuj set sessionid='$sessionID', typ=$typ, cislo=$cislo";
  $result = @mysql_query($sql);

Čas hlasovania sa nastaví sám, pretože sme položku "ts" v tabuľke "hlasuj" definovali typu timestamp.

Aby sa v tabuľke "hlasuj" nehromadili staré záznamy o hlasovaní, tak je ju potrebné pravidelne prečistiť. Napríklad vymazať záznamy staršie 2 dni:

  $xx = Date("Ymd",Time()-24*60*60); //
  $sql = "delete from hlasuj where ts<$xx";
  $result = @mysql_query($sql);

Tento skript doporučujem umiestniť do hlavného skritpu Vašich stránok. Ideálne priamo do funkcie, ktorá sa vyvoláva iba raz denne, pretože opakované volanie vymazania v rámci rovnakého dňa už nemá čo vymazať a zbytočne predlžuje dobu behu skriptu.

Keďže slová "raz denne" znejú zaujímavo, budem príkladu jedného spôsobu realizácie takejto funkcie, venovať osobitný článok.

Verím, že príspevok vhodne doplnil problematiku kontroly viacnásobného prístupu návštevníkov na Vaše stránky. Ukážku realizácie tu spomenutého spôsobu je možné vidieť napríklad na webe www.vole.cz

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: