我想知道是否有可能讓用戶銷燬會話變量。用戶是否可以銷燬他們的php會話
例如,如果他們清除他們的cookies會摧毀他們的會話變量?我想製作一個系統記錄一個人完成了多少次失敗嘗試,並準備創建一個會話變量,而不是將數據插入到SQL數據庫中。任何建議最有效的方式將是偉大的!
我想知道是否有可能讓用戶銷燬會話變量。用戶是否可以銷燬他們的php會話
例如,如果他們清除他們的cookies會摧毀他們的會話變量?我想製作一個系統記錄一個人完成了多少次失敗嘗試,並準備創建一個會話變量,而不是將數據插入到SQL數據庫中。任何建議最有效的方式將是偉大的!
不,會話存儲在服務器的tmp
文件夾中。所有用戶都有會話ID(通常存儲在cookie中)。
所以,即使用戶清除他們的cookie,會話也會在服務器上保持活動狀態,直到PHP垃圾收集生效。
但是,如果用戶確實刪除了會話ID,則服務器會生成一個新的會話ID。沒有辦法限制網站訪問者可以進行的登錄嘗試次數,但是您可以對數據庫中的用戶帳戶嘗試登錄的次數添加限制。
你會這樣做,但會改變數據庫中的users
表。添加time_locked_out
字段,並將其設置爲默認null
和login_attempts
字段,其中默認0
。
如果帳號被嘗試登錄超過3次,請將time_locked_out
字段設置爲當前時間,並且不要讓它在該時間(或其他)之後30分鐘後再次嘗試登錄。
好的,只是爲了確保他們可以解開自己的會話身份證對嗎?因爲我打算在會話變量中記錄該用戶失敗的嘗試次數,但我想確保他們無法執行某些操作,例如清理那些Cookie,並讓該計數器因爲有新的ID而被重置。 – user2443941
如果他們刪除了他們的cookies,計數器在技術上會被重置,因爲當他們回到您的網站時,服務器會產生一個新的會話,並將計數器設置爲'0'。您需要限制用戶使用數據庫嘗試登錄的次數,而不是依賴會話或cookie。 –
你並不是真的想要統計一個人的失敗的登錄嘗試;相反,您想要針對一個帳戶對失敗的登錄嘗試進行計數。這需要一個會話跨越機制,所以你應該回到繪圖板。
例如,您可以在用戶表中保留「上次失敗登錄」和「最近失敗登錄次數」列。此外,決定失敗的登錄閾值(登錄後採取防禦措施的次數)和謹慎時間範圍(如果沒有登錄失敗的時間過長,計數器重置)。
每當嘗試登錄:
:
每當登錄成功:
關於原廠l問題:清除cookie不會破壞用戶會話信息(應該存儲在服務器上),但它會使它成爲孤立的,並且會一直存在,直到會話GC機制啓動並清除它。
一個人(嘗試猜測同事帳戶)的嘗試與嘗試進入單個帳戶的人一樣糟糕。你有什麼「會話跨越」的例子嗎?關於企業網絡的誤報呢? –
@AbsoluteƵERØ:我寫了「destroy *用戶會話信息*」(數據),而不是「會話」。重申你的第二點評論:首先,這不是我如何解釋這個問題;其次,用超時保護帳戶會使攻擊變得毫無價值 - 使得許多無價值的攻擊並行進行,就像做一個一樣無害,所以我不確定一個人如何嘗試猜測同事帳戶會改變圖片;第三,如果有人想記錄每次嘗試失敗的IP地址(以確定來源),我不會阻止它們。我不明白你想對假陽性說什麼。 – Jon
我不確定第一條評論來自哪裏。 (我確定這是爲其他人準備的。)如果您想弄清楚某人如何利用您的網站,那麼來自每次攻擊的所有數據都會很有幫助。沒有任何攻擊是無害的。它需要帶寬和資源(包括你的時間)試圖弄清楚發生了什麼。嘗試不一定是攻擊。在你的情況下,如果有人試圖猜測同事的密碼。他們猜測兩次,然後同事回來,他們有三次更多的嘗試,因爲石板被擦乾淨。他們將來自同一知識產權(兩個不同的人)。 –
不,用戶不能銷燬會話。用戶可以做的就是停止使用它(例如通過刪除cookie)。
會議以這種方式工作:
從現在起,客戶端向您的網站發出的每個請求都會包含唯一的ID作爲Cookie數據。但是如果用戶刪除了cookie呢?會話將不會被使用,但它仍然存儲在您的服務器中(直到過期時間發生)。
而且,試圖解決你的問題......最好的方法是在數據庫中存儲用戶的標識符(例如用戶名)以及他嘗試執行所需操作的次數。這樣,當他試圖這樣做時,您可以比較傳遞的數據與數據庫數據並執行適當的操作。 –
會話將數據存儲在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'] - )。這樣,您可以在登錄腳本中設置邏輯,以防止基於用戶可能具有的最大併發連接數的任何新登錄。這只是一個簡單的例子,但您也可以在時間戳中添加混合或任何其他類型的約束,以使邏輯更接近您的理想流程。
有時會話也通過地址欄傳輸。 –
爲什麼不給用戶附上計數器?如果這個人不是他/她自稱的那個人,那就是一種虐待。至於ip,geo-ip本地化可以幫助從統計角度來說,如果用戶x總是從X國登錄,並且在某個時候在不同國家有多次失敗嘗試,那麼很可能是濫用否? – happy