2011-11-06 20 views
0

我在過去兩天發佈了幾個關於cookie的問題。我幾乎完成了我的家庭作業,但我有一個問題。希望最後一個關於PHP cookies

我需要讓我的用戶儘可能多地登錄我的網站的評論部分,但是,如果他們在30秒內失敗5次,他們會被鎖定3分鐘。要算出5次嘗試,我這樣做:

if(isset($_COOKIE['cookie1'])){ 
     if(isset($_COOKIE['cookie2'])){ 
     if(isset($_COOKIE['cookie3'])){ 
      if(isset($_COOKIE['cookie4'])){ 
       header('Location: reading_cat.php'); 
       setcookie("locked_out", "cookie", time()+180); 
      }setcookie("cookie4", "cookie4", time()+30); 
     }setcookie("cookie3", "cookie3", time()+30); 
     }setcookie("cookie2", "cookie2", time()+30); 
    }setcookie("cookie1", "cookie1", time()+30); 

這很好,除了一個問題。當用戶嘗試失敗時,會設置cookie。如果他未能嘗試2,則選中cookie 1,如果存在cookie 2,則打開。在這種情況下,每次添加一個連續的cookie時,出於某種原因,所有的cookie都會將其到期日寫入添加的最後一次cookie的時間。

要更改:cookie 1在6:00時被添加,沒有秒,並且過期時間爲6:00和30秒。 Cookie 2在6點和15秒添加,到期時間爲6點和45秒。我認爲餅乾應該保持不變,但是當我檢查時,現在餅乾餅乾和餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾餅乾因此,在這種情況下,所有的cookie在同一時間到期(這是不好的)。

我在做什麼錯?

+6

真是一團糟!老兄,你應該考慮改變你使用的整個代碼。 –

+3

設置一千個不同的餅乾也沒有意義。將**數量的嘗試**寫入*一個* cookie並簡單地檢查該值。這實際上不會是篡改證據,但更有意義。 – deceze

+0

夠公平的,這是我第一次做這些東西。我瞭解製作一個名爲count的cookie,並檢查它已增加了多少次,但是如何檢查用戶在30秒內嘗試了5次?用戶可以在15秒內嘗試4次,然後等待30秒,然後再次嘗試5次。如果我完全是一個計數,就沒有辦法說出來。 –

回答

2
$attempts = !empty($_COOKIE['attempts']) ? unserialize($_COOKIE['attempts']) : array(); 
$attempts[] = time(); 
$attempts = array_slice($attempts, -5); 

setcookie('attempts', serialize($attempts)); 

這爲您提供了最近5次嘗試的FIFO隊列及其時間戳。 $attempts[0]包含最早嘗試的時間戳。這應該給你你需要的信息。

+0

謝謝,那太棒了!那真好;那真甜。我感謝你抽出時間。雖然我從其他意見中瞭解到原始代碼很糟糕,但是您能否向我解釋爲什麼Cookie會重新寫入到期時間?我只是好奇這是爲什麼? –

+0

@Phill因爲你總是*重寫cookie。沒有「其他」。 – deceze

+0

噢,當然。謝謝。我很感激。非常明顯。喜歡上面的答案,但如果我使用了,我的老師會想知道我是如何學習過這些方法的。很確定他會弄明白。 –

1

這不是一個很好的做法。你應該有一個會話計數器或cookie計數器。另外,任何知道自己在做什麼的人都可以繞過cookie和會話,所以你想要阻止那些人的IP地址而不是cookie攔截器。

+0

這是一項家庭作業,其唯一目的是確保我們可以使用cookies。它與最佳實踐,安全等無關。只是一個練習。我不允許使用會話,我必須使用cookies。這是我的專欄的明確規定。正如我剛纔所說,我可以使用計數器,但是如何檢查用戶在30秒內嘗試了5次?用戶可以每十秒嘗試一次,只要他們願意,應該允許這樣做。櫃檯不會告訴我們這些。 –

+0

在這種情況下,請使用一個包含失敗嘗試次數的cookie。 –

+0

包含失敗嘗試次數的計數器只是一個計數器,並且它不能說明在30秒內發生了多少次。這就是爲什麼我以我最初的方式做到了這一點,它會檢​​查以確保嘗試失敗,如果沒有4,它將不會鎖定。 –