有没有办法可以在没有放置会话cookie的情况下在PHP中启动持久会话?是否有其他方法可以跨页面维护会话,例如基于IP地址的解决方案?
我的理由是,虽然大多数用户都有cookie,但我想知道登录系统是否有办法让那些禁用它的人(尽管我认为禁用cookie只是不必要的偏执狂,个人)。
答案 0 :(得分:57)
我认为要求您的用户启用Cookie太过分了。当人们完全关闭它时,我觉得很愚蠢。
否则,您可以将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 :(得分:5)
您可以将session.use_trans_sid
的ini-Value设置为true,以激活将会话ID附加到每个网址。看看this。
出于安全考虑,您应该将会话限制为创建会话的IP。然而,这并不是完全安全的,因为具有相同IP的人(例如在代理之后)可以重用那个非常相同的会话。
答案 2 :(得分:3)
您可以使用网址中的会话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)时很容易损坏。
您可能还有兴趣创建自己的会话处理功能(与数据库结合)。您将忽略会话ID,并将其绑定到IP地址。 (参见http://php.net/manual/en/function.session-set-save-handler.php)中的例子
参考文献:
答案 3 :(得分:0)
您可以在数据库中保存每个IP的会话ID:
创建一个包含三个字段的mysql表:session_id,ip和唯一临时密钥(对于已记录的用户)或您喜欢的任何其他条件。然后关闭会话cookie和use_trans_sid。
然后创建一个代码来管理基于这个新表的会话行为!
在session_start()
保存表中的session_id之后,然后从表中接收它(通过IP和任何其他条件),然后调用
session_id($in_table_session_id);
有关详细信息和完整指南,请参阅:https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe
答案 4 :(得分:0)
您可以创建数据库记录或临时文件,并在每次加载页面时针对请求检查$_SERVER
变量。这是一个安全风险,但有足够的变量(看看列表here)你可能会觉得你有机会劫持到可接受的水平;只有你知道你的应用程序需要多么安全。
答案 5 :(得分:0)
如果我想这样做,那么我会在HTML代码中添加会话ID作为注释标记,并使用和配置PHP代码以使用HTML代码中包含的会话ID。我认为这样做更有意义,而不是使用用户IP或在URL中添加会话ID。
答案 6 :(得分:0)
对此的正确答案是“否”。除了cookie之外,使用变量的任何组合都是不安全的。
考虑一下:当用户FIRST请求一个页面时,服务器会发送该页面以及一个唯一的值,该值表示“ HTTP是无状态的,请保留此值,以便我知道下次调用时是'you'。”也就是说,那个人在当时运行的浏览器中(无论使用哪种标签)都具有唯一的令牌。
当且仅当他们已经成功登录时,该令牌才可以绑定到服务器端的会话。令牌应该太长且随机,以至于没人能及时猜到。
多个浏览器可能使用相同的IP地址。多个人可以拥有完全相同的用户代理。 Cookie是唯一可用的存储系统。
实际上还有另一种方法,那就是将唯一令牌添加到返回服务器的每个单个链接以及所有AJAX调用,例如?PHPSESSID=my-unique-token-189481958
-但这很麻烦进行编码。
答案 7 :(得分:0)
您也可以仅通过会话 ID 和时间在没有 Cookie 的情况下登录,但是您必须在成功登录后直接将它们写入数据库。
我在 index.php 中有这样的东西,它总是会生成一个新的会话 ID 如果条件未验证,则基于时间和旧会话 ID。
if ($_SESSION['id'] != $row['session'] || time() > $row['sessiontime']) {
session_destroy();
session_start();
session_regenerate_id();
}
$_SESSION['id'] = session_id();
我在数据库中使用了 2 个变量作为 ID 和时间。
在登录窗口中,我从 $_SESSION['id'] 变量中读取会话 ID,然后增加时间并将两者发送到数据库。