没有cookie的PHP会话

有没有一种方法可以在PHP中启动持久性会话而无需放置会话cookie? 是否有其他方法可以跨页面维护会话,例如基于IP地址的解决方案?

我问的原因是,尽管大多数用户都启用了cookie,但我想看看是否有一种方法可以使禁用了该功能的用户使用登录系统(即使我个人认为禁用cookie只是不必要的偏执狂)。

Delan Azabani asked 2019-11-17T16:58:28Z
7个解决方案
58 votes

我认为要求您的用户启用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();
PureForm answered 2019-11-17T16:58:59Z
5 votes

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

为了安全起见,您应该将会话限制为创建会话的IP。 不过,这并不是绝对安全的,因为拥有相同IP的人(例如在代理后面)可以重用同一会话。

halfdan answered 2019-11-17T16:59:30Z
3 votes

您可以使用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)时,很容易将其破坏。

您可能还对创建自己的会话处理功能(与数据库结合)感兴趣。 您将忽略会话ID,并将其绑定到IP地址。 (请参见[http://php.net/manual/en/function.session-set-save-handler.php中的示例)]

参考文献:

  • [http://php.net/manual/en/session.configuration.php]
Lekensteyn answered 2019-11-17T17:00:17Z
0 votes

您可以创建数据库记录或临时文件,并在每次页面加载时根据请求检查$_SERVER vars。 这是一种安全隐患,但是有了足够多的变量(请查看此处的列表),您可能会觉得自己有被劫持的机会降至可接受的水平。 只有您知道应用程序的安全性。

gedq answered 2019-11-17T17:00:43Z
0 votes

您可以将每个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]

T30 answered 2019-11-17T17:01:36Z
0 votes

如果我想这样做,则可以将会话ID添加到HTML代码中作为注释标记,并使用和配置PHP代码以使用HTML代码中包含的会话ID。 我认为这样做比使用用户IP或在URL中添加会话ID更有意义。

Aryan amish answered 2019-11-17T17:02:02Z
0 votes

正确答案是否定的。 除了cookie之外,使用变量的任何组合都是不安全的。

想一想:当用户首先请求一个页面时,服务器将发送该页面以及一个唯一的值,该值表示“ HTTP是无状态的,请保留此值,以便下次调用时我知道它是'您'”。 这意味着,当时在该浏览器中运行的那个人(无论使用哪种标签)都具有唯一的令牌。

现在并且只有当他们成功登录后,该令牌现在可以绑定到服务器端的会话。 令牌应该太长且随机,以至于没人能及时猜到一个。

多个浏览器可能使用相同的IP地址。 多个人可以拥有完全相同的用户代理。 Cookie是唯一可用的存储系统。

实际上,还有另一种方法,那就是将唯一令牌添加到返回服务器的每个链接以及所有AJAX调用中,例如?PHPSESSID=my-unique-token-189481958-但这很难编写代码。

Oliver Williams answered 2019-11-17T17:02:58Z
translate from https://stackoverflow.com:/questions/3740845/php-session-without-cookies