2013-06-01 67 views
3

我想知道是否有可能讓用戶銷燬會話變量。用戶是否可以銷燬他們的php會話

例如,如果他們清除他們的cookies會摧毀他們的會話變量?我想製作一個系統記錄一個人完成了多少次失敗嘗試,並準備創建一個會話變量,而不是將數據插入到SQL數據庫中。任何建議最有效的方式將是偉大的!

+0

爲什麼不給用戶附上計數器?如果這個人不是他/她自稱的那個人,那就是一種虐待。至於ip,geo-ip本地化可以幫助從統計角度來說,如果用戶x總是從X國登錄,並且在某個時候在不同國家有多次失敗嘗試,那麼很可能是濫用否? – happy

回答

3

不,會話存儲在服務器的tmp文件夾中。所有用戶都有會話ID(通常存儲在cookie中)。

所以,即使用戶清除他們的cookie,會話也會在服務器上保持活動狀態,直到PHP垃圾收集生效。

但是,如果用戶確實刪除了會話ID,則服務器會生成一個新的會話ID。沒有辦法限制網站訪問者可以進行的登錄嘗試次數,但是您可以對數據庫中的用戶帳戶嘗試登錄的次數添加限制。

你會這樣做,但會改變數據庫中的users表。添加time_locked_out字段,並將其設置爲默認nulllogin_attempts字段,其​​中默認0

如果帳號被嘗試登錄超過3次,請將time_locked_out字段設置爲當前時間,並且不要讓它在該時間(或其他)之後30分鐘後再次嘗試登錄。

+0

好的,只是爲了確保他們可以解開自己的會話身份證對嗎?因爲我打算在會話變量中記錄該用戶失敗的嘗試次數,但我想確保他們無法執行某些操作,例如清理那些Cookie,並讓該計數器因爲有新的ID而被重置。 – user2443941

+0

如果他們刪除了他們的cookies,計數器在技術上會被重置,因爲當他們回到您的網站時,服務器會產生一個新的會話,並將計數器設置爲'0'。您需要限制用戶使用數據庫嘗試登錄的次數,而不是依賴會話或cookie。 –

3

你並不是真的想要統計一個人的失敗的登錄嘗試;相反,您想要針對一個帳戶對失敗的登錄嘗試進行計數。這需要一個會話跨越機制,所以你應該回到繪圖板。

例如,您可以在用戶表中保留「上次失敗登錄」和「最近失敗登錄次數」列。此外,決定失敗的登錄閾值(登錄後採取防禦措施的次數)和謹慎時間範圍(如果沒有登錄失敗的時間過長,計數器重置)。

每當嘗試登錄:

  • 如果最後失敗的登錄時間是比過去的「戒心的時間跨度」和失敗的計數器等於或大於閾值,不能正確處理登錄通常而是每當登錄失敗出現錯誤

  • 如果最後失敗的登錄時間比過去的「戒心時間跨度」 ,更新上次失敗的登錄時間到現在和失敗的登錄次數重置爲零
  • 無條件通過增加失敗的登錄計數一個

每當登錄成功:

  • 復位雙方最後失敗的登錄時間和失敗的登錄計數

關於原廠l問題:清除cookie不會破壞用戶會話信息(應該存儲在服務器上),但它會使它成爲孤立的,並且會一直存在,直到會話GC機制啓動並清除它。

+0

一個人(嘗試猜測同事帳戶)的嘗試與嘗試進入單個帳戶的人一樣糟糕。你有什麼「會話跨越」的例子嗎?關於企業網絡的誤報呢? –

+0

@AbsoluteƵERØ:我寫了「destroy *用戶會話信息*」(數據),而不是「會話」。重申你的第二點評論:首先,這不是我如何解釋這個問題;其次,用超時保護帳戶會使攻擊變得毫無價值 - 使得許多無價值的攻擊並行進行,就像做一個一樣無害,所以我不確定一個人如何嘗試猜測同事帳戶會改變圖片;第三,如果有人想記錄每次嘗試失敗的IP地址(以確定來源),我不會阻止它們。我不明白你想對假陽性說什麼。 – Jon

+0

我不確定第一條評論來自哪裏。 (我確定這是爲其他人準備的。)如果您想弄清楚某人如何利用您的網站,那麼來自每次攻擊的所有數據都會很有幫助。沒有任何攻擊是無害的。它需要帶寬和資源(包括你的時間)試圖弄清楚發生了什麼。嘗試不一定是攻擊。在你的情況下,如果有人試圖猜測同事的密碼。他們猜測兩次,然後同事回來,他們有三次更多的嘗試,因爲石板被擦乾淨。他們將來自同一知識產權(兩個不同的人)。 –

0

不,用戶不能銷燬會話。用戶可以做的就是停止使用它(例如通過刪除cookie)。

會議以這種方式工作:

  1. 服務器創建一個會話,並生成一個唯一的ID。
  2. 服務器將唯一ID發送給客戶端,並由瀏覽器本地存儲爲cookie。
  3. 每次用戶(瀏覽器)想要重新加載會話時,只需在加載頁面時發送cookie信息。
  4. 您的服務器識別發送給它的唯一ID並重新加載會話(基本上,如果您使用PHP,您的PHP腳本將重新生成會話變量,就這些)。

從現在起,客戶端向您的網站發出的每個請求都會包含唯一的ID作爲Cookie數據。但是如果用戶刪除了cookie呢?會話將不會被使用,但它仍然存儲在您的服務器中(直到過期時間發生)。

+0

而且,試圖解決你的問題......最好的方法是在數據庫中存儲用戶的標識符(例如用戶名)以及他嘗試執行所需操作的次數。這樣,當他試圖這樣做時,您可以比較傳遞的數據與數據庫數據並執行適當的操作。 –

0

會話將數據存儲在2個不同的地方,如果它是基於cookie的會話。

有一個唯一的標識符發佈給客戶端,基於該唯一標識符的信息存儲在服務器端,鏈接到該標識符。

當用戶清除cookie時,只會將其會話標識符從客戶端刪除,而不會將與標識符綁定的實際數據刪除。通常情況下,登錄或登錄同一帳戶的用戶只需發出一個新的會話ID。從本質上講,銷燬cookie只會破壞與數據的鏈接,因爲用戶不再擁有會話標識符。

但是,可以使用內部帳戶ID作爲會話標識符,該標識符可以記錄有多少用戶登錄到1個特定帳戶的全局計數。您需要使用以下方式手動設置會話ID:http://php.net/manual/en/function.session-id.php並使用您自己的內部帳戶標識符設置ID。

一個非常簡單的解決方案是使用session_id()將$ _SESSION變量鏈接到用戶的帳戶ID。在登錄時,你可以用用戶ID開始會話,然後增加一個會話變量(類似於$ _SESSION ['logged_in_count'] ++)。在註銷時,使用設置爲用戶ID的ID開始用戶會話,並減量(如$ _SESSION ['logged_in_count'] - )。這樣,您可以在登錄腳本中設置邏輯,以防止基於用戶可能具有的最大併發連接數的任何新登錄。這只是一個簡單的例子,但您也可以在時間戳中添加混合或任何其他類型的約束,以使邏輯更接近您的理想流程。

+0

有時會話也通過地址欄傳輸。 –