带有禁用cookie的PHP会话,它有效吗?

时间:2012-09-24 20:07:24

标签: php session cookies

今天我作为PHP开发人员接受了skype面试,其中一个问题是关于Cookie和PHP会话。

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

我告诉他们不是,默认情况下,PHP会话取决于设置会话cookie。当PHP会话启动时,新会话Cookie设置为默认名称PHPSESSID,该cookie包含该会话ID的值,例如:ftu63d8al491s5gatuobj39gk7 然后在tmp文件夹文件中的apache服务器上创建sess_ftu63d8al491s5gatuobj39gk7并保存该会话的内容,例如: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尝试读取该会话变量。

它的外观如下:

的index.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>

session.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会话机制,取决于设置会话COOKIE?

更新: 我对此很生气,所以我回电话给那个和我说话的那个人。并问他,默认情况下PHP会话可以不使用cookie吗?那家伙说“是”。然后我告诉他他错了,他说:“是的,是的,如果你这么说......”然后开始大笑。然后我告诉他,如果PHP会话可以在没有设置cookie的情况下工作,那么服务器如何知道当前用户/浏览器会话ID,如果它没有存储在会话cookie中? (我想知道他是否知道会话ID可以作为GET变量传递)并且他至少安静了20多年,并告诉我他是系统管理员,我应该问开发人员。而且他已经43岁了,并且在商务方面拥有13年的丰富经验(他以30?wtf开始?),但他信任我。我向他解释了Session如何工作以及你可以在没有Cookie的情况下使用它,然后会话ID作为GET变量传递,告诉他我告诉他们在面试时,他们告诉我不,不,不......:S < / p>

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

无论如何,那些家伙很擅长PHP,我无法接受他们的工作机会,毕竟我不认为他们会给我一份工作......

感谢所有评论!

9 个答案:

答案 0 :(得分:26)

  

“访问您网站的访问者被分配了一个唯一的ID,即   所谓的会话ID。这可以存储在用户的cookie中   在URL中传播或传播。 “

Sessions: Introduction

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:5)

  

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

清除。在现实世界中:

  

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

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

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

或者 - 这里我们不再在堪萨斯州了:

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

(1)如果您在可以信任IP的LAN中,则可以将“会话”与用户IP相关联。您可以在小公司中强制执行严格的“禁止cookie”策略,并且仍然可以使用用户会话而无需使用_GET / _POST作为会话ID。

答案 3 :(得分:5)

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

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

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

如果&#34; - enable-trans-sid&#34;和&#34; - enable-track-vars&#34;值设置为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);

答案 4 :(得分:0)

如果是我,我会说“是”

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

然后,它应该是肯定的。它可以阅读和使用。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

您是对的,没有Cookie,Session无法正常工作。 为了说明这一点,请尝试执行以下操作。

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

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

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

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

此外,如果您尝试使用禁用的cookie登录gmail(以您可以进入任何网站为例),则会显示“ 您的浏览器已禁用cookie。请确保您的cookie已启用并尝试再次。

答案 8 :(得分: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)