PHP会话没有cookie

有没有一种方法,我可以启动一个持久的会议在PHP中没有一个会话cookie的位置? 是否有其他方式来维护跨页面的会话,例如基于IP地址的解决scheme?

我问的原因是,虽然大多数用户都有cookies,但我想知道是否有一种方式让login系统为那些被禁用的人工作(即使我认为禁用cookies只是个人不必要的偏执狂)。

我不认为要求你的用户启用cookie是没有太大的意义的。 当人们完全closures它时,我发现它很愚蠢。

否则,你可以设置你的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(); 

您可以将session.use_trans_sid的ini-Value设置为true,以激活将会话ID附加到每个URL。 看看这个 。

为了安全起见,您应该将会话限制为创build会话的IP。 然而,这并不完全安全,因为具有相同IP的人(例如代理之后)可以重复使用同一个会话。

您可以使用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 

注意:在URL中使用会话ID非常令人沮丧。 使用无线网卡时,IP地址可能会发生变化,并且代理服务器具有相同的IP地址。 点击“旧的URL”(使用旧的会话ID)时很容易被破坏。

您可能也有兴趣创build自己的会话处理函数(与数据库结合)。 您将忽略会话ID,并将其绑定到IP地址。 (请参阅http://php.net/manual/en/function.session-set-save-handler.php中的示例);

参考文献:

您可以在数据库中保存每个IP的会话ID:

创build一个包含三个字段的mysql表:session_id,ip和唯一的临时密钥(对于已logging的用户)或任何其他您喜欢的条件。 然后closures会话cookie和use_trans_sid。

然后创build一个代码来pipe理基于这个新表的会话行为!

session_start()保存session_id在表中,并稍后从表(从IP和任何其他条件)接收它,然后调用

 session_id($in_table_session_id); 

有关更多信息和完整指南,请参阅: https : //gist.github.com/mimrahe/77415f4a9e238c313bb​​e8c42f8a6b7fe

您可以创build一个数据库logging或临时文件,并检查每个页面加载的请求$_SERVER vars。 这是一个安全风险,但是有足够的variables(看看这里的列表),你可能会觉得你有机会劫持到可以接受的水平; 只有你知道你的应用程序需要多么安全。