2010-09-18 121 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),你可能会觉得你已经有机会劫持到可接受的水平;只有你知道你的应用需要有多安全。