Jak user nie umie klikać to nie mój problem

Formularz będzie na tyle prosty, że nie będzie wielkim wyczynem uzupełnić go raz jeszcze (6 pól, 3 comboxy i captcha) ;p Ponadto to w jego interesie będzie się zarejestrować

(strona o dość specyficznej tematyce)
W wypadku komentarzy to w ogóle by nie zdało egzaminu. Wyobraź sobie, że nawet jak będzie captcha to mając 2 zakładki to captcha będzie aktualna tylko w tej drugiej (używam własnej captchy i kod jest przechowywany w $_SESSION.
Ten twój magiczny sposobik musiałbym też do tokena wdymać.
Może będę to robił parami? Coś w stylu klucz i podklucz. Według mnie to zda egzamin. Dzięki temu każda otwarta strona będzie mogła mieć własny key. Coś w stylu lol.php?lubie=packi&key=blablabla&subkey=tratata A przy sprawdzaniu trzepanie $_SESSION['secureKey'] w poszukiwaniu klucza tablicy o nazwie 'tratata' i sprawdzi czy wartość zmiennej z takim kluczem tablicy równa się z 'blablabla'. $_SESSION['secureKey']['tratata'] bedzie miał wartość 'blablabla'
Dobrze rozumuję?
== EDIT ==
O jaa.. dopiero po kilku przeczytaniach twojego "$_SESSION['secureKey'][md5(uniqid()] = true);" zrozumiałem idee jegzo działania. Coś w stylu tym co ja napisałem, tylko, że klucz w GET będzie kluczem w tablicy $_SESSION['secureKey'] a potem skrypt sprawdzający obczai, czy jest taki klucz i czy ma wartość true

Czyli to co wcześniej wyskrobałem wymięka przy tym ;p Bo tu o jeden GET mniej i w ogóle mniej kodu

Jest tylko jeden mankament. Jeśli jakiś user wejdzie sobie w formularz i przemieli mój skrypt np 20 razy przez F5 to utworzy się 20 tablic w $_SESSION['secureKey'] no i generalnie kaszanka trochę będzie. Może np. zrobić, że może tam być tylko 5 tablic? Jeśli przekroczy 5 tablic to wszystkie zostaną usunięte a najnowszy klucz zostanie wygenerowany i zapisany raz jeszcze ;>
A tak btw. to wkradł Ci się tam błąd:
$_SESSION['secureKey'][md5(uniqid())] = true;
== EDIT2 ==
Wykombinowałem sobie takie cacko:
function generateKey() {
$count = count($_SESSION['secureKey']); if($count > 5) {
unset($_SESSION['secureKey']); }
$_SESSION['secureKey'][$key] = true;
}
function checkSecureKey() {
if(isset($_GET['key']) && isset($_SESSION['secureKey']) && $_SESSION['secureKey'][$_GET['key']] == 'true') { unset($_SESSION['secureKey']); return true;
}
unset($_SESSION['secureKey']); return false;
}
Nie wiem czy będzie śmigało ale na logikę powinno hulać

== EDIT3 ==
Powyższy przykład miałby kłopot z wygenerowaniem klucza i przekazaniem go przez GET bo przecież są tam tablice. Posiedziałem jednak i wymyśliłem sbie coś takiego:
function generateKey($mode = 0) {
$count = count($_SESSION['secureKey']); $lastID = $_SESSION['secureKey']['lastKeyID'];
if($count = 5) {
$unsetID = $lastID - 4;
unset($_SESSION['secureKey'][$unsetID]); }
$lastID++;
$keyID = $lastID;
$_SESSION['secureKey']['lastKeyID'] = $keyID;
$_SESSION['secureKey'][$keyID] = $key;
if($mode == 0) {
return $_SESSION['secureKey'][$keyID];
} else {
print $_SESSION['secureKey'][$keyID]; }
}
function checkSecureKey() {
if(isset($_GET['key']) && isset($_SESSION['secureKey'])) { $keyID = $_SESSION['secureKey']['lastKeyID'];
$count = count($_SESSION['secureKey']); for($i = 0; $i < $count; $i++) {
if($_SESSION['secureKey'][$keyID] == $_GET['key']) {
$_SESSION['secureKey'][$keyID] = 'empty';
return true;
}
$keyID--;
}
return false;
}
}
Śmiga aż miło. Keneruje tokeny to max 5 a potem tworzy następny i usuwa najstarszy. Kod chyba najprościej napisany jak się tylko da

Więc albo przyznaje każdemu userowi jeden token i mam małe funkcje, albo przyznaje mu pięć i mam je nieco większe.
Jak by było coś nie zrozumiałe: $_SESSION['secureKey']['lastKeyID'] przechowuje ID najnowszego klucza z tokenem. Pętla przetrzepuje każde 5 tablic z kluczami począwszy od najnowszej. Jeśli się zgadza z podanym przez usera to nadaje mu wartość 'empty' i zwraca true. Nie mogę niestety użyć unset() dla tablicy, która trzymała klucz bo potem skrypcik mógłby działać nieprawidłowo bo mógłby mieć dziury w ID tablic.
Swoją drogą chyba jednak zostanę przy tym, by userowi dać tylko jeden token. Przy metodzie z pięcioma może sobie wygenerować kilka tokenów, wkleić je do swojego formularza na swojej stronie i próbować się wbić do mnie z wcześniej wygenerowanymi tokenami.
Wiem, ze sporo tego ale jak już tu dobrnąłeś to co o tym myślisz? ;>