51

今天我在 Skype 上面试了一份 PHP 开发人员的工作,其中一个问题是关于 Cookies 和 PHP Sessions。

问题是,如果在用户浏览器中禁用了 Cookie,是否可以设置和读取、使用 PHP 会话?

我告诉他们不要,因为默认情况下 PHP 会话依赖于设置会话 cookie。当 PHP 会话开始时,新会话 Cookie 设置为默认名称 PHPSESSID,并且该 cookie 保存该会话 id 的值,例如: ftu63d8al491s5gatuobj39gk7 然后在 tmp 文件夹文件 sess_ftu63d8al491s5gatuobj39gk7 的 apache 服务器上创建并保存该会话的内容,例如: test1|s:12:"SessionTest1";test2|s:12:"SessionTest2";

他们告诉我这不是真的,即使用户在其浏览器中禁用 cookie,您也可以使用 PHP 会话。

然后我告诉他们你可以这样做,但是会话 ID 将作为 GET 变量通过 URL 传递。这并不安全,您必须在 php.ini 中进行设置。

他们在谈论即使在浏览器中禁用了 Cookie 也如何使用 PHP 会话。如果我们正在建立网上商店,而一些奶奶使用我们的网上商店并禁用了 cookie 而她却不在乎。而且 PHP 会话很棒,因为即使用户禁用了 Cookie,您也可以使用它们。我就像wtf,wtf wtf?!?!

我用两个文件进行了测试, index.php 启动会话并设置会话变量。然后 session.php 尝试读取该会话变量。

这是它的外观:

索引.php

<p>This is where I start and set php sessions.</p>

<?php

    session_start();
    $_SESSION['test1'] = "SessionTest1";
    $_SESSION['test2'] = "SessionTest2";

?>

<p>This is a link, that starts new HTTP Request, and tries to read session set on this page:</p>
<p><a href="session.php">Read Session</a></p>

会话.php

<?php

    session_start();
    var_export($_SESSION);

?>

<p><a href="index.php">Back</a></p>

现在,如果您在浏览器中启用 cookie,访问 index.php,然后访问 session.php,会话将被打印出来。

但是,如果您清除浏览器历史记录和 cookie,然后访问 index.php,然后访问 session.php,您会看到空数组对吗?

所以基本上我的问题是,我是对的吗?如果您在浏览器中禁用 cookie,您可以使用 PHP 会话吗?而PHP Session 机制是否默认,取决于设置一个会话COOKIE?

更新:我对此很生气,所以我给正在和我说话的人打了电话。并问他,默认情况下 PHP 会话可以在没有 cookie 的情况下工作吗?那家伙说“是的”。然后我告诉他他错了,他说:“是的,是的,如果你这么说……”然后开始大笑。然后我告诉他,如果 PHP 会话可以在不设置 cookie 的情况下工作,那么服务器如何知道当前用户/浏览器会话 id,如果它没有存储在会话 cookie 中?(我想看看他是否知道会话 id 可以作为 GET 变量传递)他至少安静了 20 秒,并告诉我他是系统管理员,我应该问那个开发人员。他今年 43 岁,拥有 13 年的丰富经验(他从 30 岁开始?wtf?),但他相信我这一点。

所以基本上,这家伙对 PHP 和 PHP 会话一无所知,是的,他是那个问我会话的人,告诉我 PHP 会话可以在没有 cookie 的情况下工作,即使我告诉他不能这样做,而且有一种方法可以在没有 cookie 的情况下使用 PHP 会话,但默认情况下它不会工作。他就像,不,不,不……最后他告诉我,他认为会话可以在没有 cookie 的情况下工作,因为他作为服务器上的系统管理员,永远看不到 tmp 文件夹中的会话?!?!?

不管怎样,那些家伙在 PHP 上很烂,我不可能接受他们的工作机会,毕竟我认为他们不会给我提供工作......

感谢所有的评论!

4

9 回答 9

27

“访问您的网站的访问者被分配了一个唯一的 id,即所谓的会话 id。这要么存储在用户端的 cookie 中,要么在 URL 中传播。”

会议:介绍

于 2012-09-24T20:14:01.630 回答
9

如果 session.use_cookies = 1(启用 Cookie。)

如果 session.use_cookies = 0(禁用 Cookie。)

如果 session.use_cookies = 1 则 session 将 sessionId 存储到 cookie 中。调用 session_id() 从 cookie 中获取存储的 sessionId 并在所有页面上找到保存到会话数组中的数据。如果 session.use_cookies = 0 在这种情况下 session 不会将 sessionId 存储到 cookie 中,并且每次使用 session_id() 都会获得一个新的 sessionId,并且在其他页面上存储到 session 中的数据将不会在其他页面上找到。

于 2013-07-25T05:13:54.227 回答
5

所以基本上我的问题是,我是对的吗?

大多。在现实世界中:的。

如果您在浏览器中禁用 cookie,您可以使用 PHP 会话吗?

您可以使用不带 cookie 的 PHP 会话,只要以某种方式获得浏览器身份并产生唯一值(并且该值被传递给 PHP 会话层):

  • GET 中的会话 ID(如果不允许使用 cookie,这是“标准”PHP 方式,以及您描述的“其他”方式)。然后这个值由 PHP 自动传播,例如添加到所有 A HREF 等等。如果由于自动魔术链接识别失败而没有传播(例如,在 Javascript 中构建的复杂 URL),您有责任提供相应的内容。

或者——我们已经不在堪萨斯了:

  • 使用 Auth Digest 在随机数之间传递(这是一个肮脏的技巧,当然要求整个站点都在 Auth-Digest 访问身份验证方案的后面。并且您不能再使用“虚拟身份验证”(即http://welcome :guest@www.example.com)因为某些浏览器,例如 Internet Explorer,出于安全原因不再支持它们)
  • 以其他方式识别浏览器(“指纹”)(这通常是(1)自杀
  • 如果还没有随机 UUID,则使用 LSO(本地共享对象)生成一个随机 UUID,并将其存储起来,以便在后续访问时检索它。
  • 其他方式(见http://en.wikipedia.org/wiki/Evercookie

(1) 如果您在可以信任 IP 的 LAN 中,则可以将“会话”与用户 IP 相关联。您可能会在一家小公司中强制执行严格的“无 cookie”政策,并且仍然拥有用户会话,而无需借助 _GET/_POST 获取会话 ID。

于 2012-09-24T20:14:08.910 回答
5

是的,当 cookie 被禁用时,会话将起作用。但首先 apache 检查 php 配置设置。喜欢:

   --enable-trans-sid
and
   --enable-track-vars

如果这些值设置为 true,会话将通过 POST 自动传递。

如果“--enable-trans-sid”和“--enable-track-vars”值设置为 FALSE,我们需要使用 SID 常量传递会话 ID。

< a href="index.php?<?= SID ?>" >Navigate from here< /a >

需要设置php.ini

ini_set("session.use_cookies", 0);
ini_set("session.use_trans_sid", 1);
于 2014-09-04T14:18:23.470 回答
2

你是对的,没有 cookie,Session 就无法工作。为了说明这一点,请尝试执行以下操作。

  1. 登录到 Gmail。
  2. 登录后禁用cookies。
  3. 刷新页面。

由于服务器无法识别会话,您将再次被重定向到登录页面。

  1. 现在再次启用 cookie。
  2. 刷新页面。(注意:不要点击登录按钮)。
  3. 您将被自动重定向到 Gmail 收件箱。

因此,我们可以说没有 cookie 会话将无法工作。

此外,如果您尝试使用禁用的 cookie 登录 gmail(例如,您可以使用任何网站),那么它将显示“您的浏览器已禁用 cookie。确保您的 cookie 已启用并重试。

于 2018-08-14T18:26:57.267 回答
0

如果是我,我会说“是”

因为您可以将会话存储在表单/ url 的某个地方以传递到下一页(非常糟糕的主意)。因此,基于他的问题“如果在用户浏览器中禁用 Cookie,是否可以设置和读取、使用 PHP 会话?”

那么,应该是的。它可以阅读和使用。

但是,如果用户关闭浏览器,那么它就消失了,仅此而已。(因为那家伙没有问这部分)

于 2016-02-28T10:56:06.107 回答
0

是的.. 它会工作
1.PHP 将在 URL 中传递一个名为 PHPSESSID 的 GET 参数,但它可以在 php.ini 文件中更改 session.name。
2.在同名表单中添加一个隐藏输入。

于 2017-09-19T07:13:49.710 回答
0

您需要将会话 ID 放在 URL 中。您需要对 php.ini 文件进行更改,因此如果您在共享主机上,则需要联系他们以了解他们将为您做什么。

于 2018-06-17T15:04:39.950 回答
0

// 告诉 PHP 我们要使用会话中的 cookie

 ini_set('session.use_cookies', '0');
 ini_set('session.use_only_cookies', '0');
 ini_set('session.use_trans_sid','1');
 session_start();

// 然后在 URL 中传递会话 ID(检查,导航网络刷新页面,您将在会话 ID 的标题中看到)

于 2020-01-16T15:42:12.720 回答