有沒有一種方法可以在沒有放置會話cookie的情況下啓動PHP中的持久會話?是否有其他方式來維護跨頁面的會話,例如基於IP地址的解決方案?沒有cookie的PHP會話
我的理由是,儘管大多數用戶都有Cookie,但我想知道是否有辦法讓登錄系統爲禁用它的人工作(即使我認爲禁用Cookie只是不必要的偏執狂,親自)。
有沒有一種方法可以在沒有放置會話cookie的情況下啓動PHP中的持久會話?是否有其他方式來維護跨頁面的會話,例如基於IP地址的解決方案?沒有cookie的PHP會話
我的理由是,儘管大多數用戶都有Cookie,但我想知道是否有辦法讓登錄系統爲禁用它的人工作(即使我認爲禁用Cookie只是不必要的偏執狂,親自)。
我不認爲這是過分的要求你的用戶啓用cookies。當人們完全關閉它時,我發現它很愚蠢。
否則,您可以將您的session.use_only_cookies
設置爲「0」,以強制將會話ID的附件添加到您的php中的URL中。然而,這種方法有幾個缺點。主要是保持URL內的狀態,而不是Cookie標頭。如果用戶要複製並粘貼他們所在頁面的URL,並且其他人要點擊它們,他們都將使用同一個會話。
<?php
ini_set("session.use_cookies", 0);
ini_set("session.use_only_cookies", 0);
ini_set("session.use_trans_sid", 1);
ini_set("session.cache_limiter", "");
session_start();
您可以在URL中的會話ID工作,禁用Cookie有:
ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
session_start();
// IP check
if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){
session_regenerate_id();
session_destroy();
session_start();
}
$_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR'];
// session stuff
注:它的高度discougared在URL中使用會話ID。使用無線網卡時,IP地址可能會發生變化,並且代理服務器具有相同的IP地址。點擊「舊網址」時(舊會話ID)很容易被破壞。
您可能還有興趣創建自己的會話處理函數(與數據庫結合使用)。您將忽略會話ID,並將其綁定到IP地址。 (見例子http://php.net/manual/en/function.session-set-save-handler.php)
參考文獻:
綁定到一個IP地址似乎是一個不好的方法。 一些(公司?)用戶可能位於代理之後,其中多個用戶可以具有相同的IP地址。 – Leander 2013-05-30 11:22:36
@Leander Wooord!這可能會導致非常糟糕的情況,整個公司/家庭/學生生活場所可以訪問您的用戶帳戶。 – Sliq 2013-08-26 17:59:46
在德國,最大的ISP(電信)甚至有很多人使用自己的代理。所以在最壞的情況下,一個洞ISP網絡將使用一個帳戶。這真的很煩人,因爲如果你不想依賴X-HTTP-Forwarded-For頭部,它幾乎不可能禁止IP地址。 – Gellweiler 2014-08-16 08:28:28
可以的session.use_trans_sid
的INI值設置爲true,以激活附加會話ID到每一個URL。看看this。
爲了安全起見,您應該將會話限制爲創建會話的IP。但這並不完全安全,因爲具有相同IP的人(例如代理之後)可以重用該相同的會話。
您可以保存每個IP會話ID在數據庫:SESSION_ID,IP和獨特的臨時密鑰(用於記錄用戶)或任何你喜歡的其他條件:
有三個字段創建一個MySQL表。然後關閉會話cookie和use_trans_sid。
然後創建一個代碼來管理基於這個新表的會話行爲!session_start()
後
保存SESSION_ID在表格中,後來收到它從表(通過IP和任何其他條件),然後調用
session_id($in_table_session_id);
更多的信息和完整的指南,請參見:https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe
再次,這是約束力IP並不是完全有效的,特別是對於多個用戶共享相同IP的示波器(例如大學,公司或組織代理等) – 2017-10-11 22:52:10
你可以創建一個數據庫記錄或臨時文件,並在每次頁面加載時檢查$_SERVER
變量。這是一個安全風險,但有足夠的變量(看看列表here),你可能會覺得你已經有機會劫持到可接受的水平;只有你知道你的應用需要有多安全。
我相信OP要'session.use_cookies'設置爲1 – 2010-09-18 08:27:04
而且應該指出,這些設置不會改變PHP代碼中的JS超鏈接和位置標題。 – 2010-09-18 08:33:58
事實上,誰仍在2010年瀏覽cookies?雖然仍然有可能,但我懷疑有人仍然這樣做;因此這個問題是相當學術的。 (即使蜘蛛現在可以有餅乾) – Piskvor 2010-09-24 12:03:41