2010-09-18 206 views
47

有沒有一種方法可以在沒有放置會話cookie的情況下啓動PHP中的持久會話?是否有其他方式來維護跨頁面的會話,例如基於IP地址的解決方案?沒有cookie的PHP會話

我的理由是,儘管大多數用戶都有Cookie,但我想知道是否有辦法讓登錄系統爲禁用它的人工作(即使我認爲禁用Cookie只是不必要的偏執狂,親自)。

回答

50

我不認爲這是過分的要求你的用戶啓用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(); 
+1

我相信OP要'session.use_cookies'設置爲1 – 2010-09-18 08:27:04

+4

而且應該指出,這些設置不會改變PHP代碼中的JS超鏈接和位置標題。 – 2010-09-18 08:33:58

+0

事實上,誰仍在2010年瀏覽cookies?雖然仍然有可能,但我懷疑有人仍然這樣做;因此這個問題是相當學術的。 (即使蜘蛛現在可以有餅乾) – Piskvor 2010-09-24 12:03:41

3

您可以在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

參考文獻:

+5

綁定到一個IP地址似乎是一個不好的方法。 一些(公司?)用戶可能位於代理之後,其中多個用戶可以具有相同的IP地址。 – Leander 2013-05-30 11:22:36

+3

@Leander Wooord!這可能會導致非常糟糕的情況,整個公司/家庭/學生生活場所可以訪問您的用戶帳戶。 – Sliq 2013-08-26 17:59:46

+1

在德國,最大的ISP(電信)甚至有很多人使用自己的代理。所以在最壞的情況下,一個洞ISP網絡將使用一個帳戶。這真的很煩人,因爲如果你不想依賴X-HTTP-Forwarded-For頭部,它幾乎不可能禁止IP地址。 – Gellweiler 2014-08-16 08:28:28

4

可以的session.use_trans_sid的INI值設置爲true,以激活附加會話ID到每一個URL。看看this

爲了安全起見,您應該將會話限制爲創建會話的IP。但這並不完全安全,因爲具有相同IP的人(例如代理之後)可以重用該相同的會話。

1

您可以保存每個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

+0

再次,這是約束力IP並不是完全有效的,特別是對於多個用戶共享相同IP的示波器(例如大學,公司或組織代理等) – 2017-10-11 22:52:10

0

你可以創建一個數據庫記錄或臨時文件,並在每次頁面加載時檢查$_SERVER變量。這是一個安全風險,但有足夠的變量(看看列表here),你可能會覺得你已經有機會劫持到可接受的水平;只有你知道你的應用需要有多安全。