【问题标题】:Sessions VS Temp. Cookies会话与温度。饼干
【发布时间】:2011-07-16 12:03:21
【问题描述】:

我只是想知道。在 PHP 中设置没有过期的 cookie(意味着它在浏览器关闭时过期)和设置会话变量之间有什么区别。我不是在谈论登录和类似的东西;而不需要在每次页面访问时获取不太频繁的更改数据库值等。

【问题讨论】:

  • 你是指将内容存储在持久性 cookie 中还是将内容存储在 Session 中?
  • 我的意思是临时 cookie,因为它们会在浏览器关闭时删除:P
  • 被这个问题搞糊涂了,就像问香蕉和松果有什么区别。
  • 哈哈不完全是,两者可以临时存储数据。我想知道会话变量的优点。与 cookie 文件相反,因为如果没有,我只会使用 cookie 来存储任何临时数据。但我得到了我想要的答案。

标签: php session cookies


【解决方案1】:

P.S:您可以使用http_only cookies 进一步保护您的 cookie。对于 PHP,您可以阅读 http://ilia.ws/archives/121-httpOnly-cookie-flag-support-in-PHP-5.2.html我忘了为这个会话示例做,但确实将它用于 cookie 示例:(。当您使用这个时,您的 cookie 无法在大多数浏览器(支持 http_only)的 JavaScript 中读取。使用 http_only会话的 cookie:ini_set("session.cookie_httponly", 1);

在 PHP 中设置 cookie 和不设置 cookie 有什么区别 过期(意味着它在浏览器关闭时过期)并设置 会话变量

他们可以跟踪相同的信息,但是通过 cookie(不使用会话),所有信息都存储在用户/网络浏览器上,这些信息可能被黑客窃取,甚至被更改以提供虚假信息。对于简单的事情,您可以使用 cookie,但我认为您也可以使用会话,因为当您使用 cookie 时,您需要通过网络传输更多信息。


internet(HTTP) 标准是stateless protocol(无内存),它的优点是简化了服务器设计。互联网使用cookie 使其“记住”。

会话仅使用 cookie 将PHPSESSID 存储在 cookie 中。标准的其余信息存储在disc 上,这是保持状态(存储敏感信息)的更安全方式。你也可以encrypt your cookie 这样做,但我认为sessions 是这样做的好方法。

您可以覆盖此行为,并且可能应该在您的网站有高流量时使用 memcached/redis 之类的东西将会话信息存储在内存中(内存比旋转磁盘读取文件要快得多,因为内存也没有移动部件,并且非常接近 CPU)。为此,您需要覆盖session_set_save_handler。用redis很容易做到。要安装 redis,只需键入 makePredis 是 PHP 的推荐(流行)redis 客户端库。要将会话信息保存在 redis 中,您可以使用 redis-session-php

会话

代码

我创建了一个非常简单的 php 文件来演示会话。

<?php

session_start();

if (!isset($_SESSION['count'])) {
    $_SESSION['count'] = 0;
}

echo $_SESSION['count']++;

Curl第一次保存cookie

我在下面使用Linux Ubuntu

alfred@alfred-laptop:~/www/stackoverflow/6717214$ curl http://localhost/stackoverflow/6717214/session.php -v -c cookie
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /stackoverflow/6717214/session.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Sat, 16 Jul 2011 12:13:43 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
* Added cookie PHPSESSID="eauo6se9o34oegs57nuhs5u3b7" for domain localhost, path /, expire 0
< Set-Cookie: PHPSESSID=eauo6se9o34oegs57nuhs5u3b7; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
0
  • -v:让操作更健谈
  • -c: 操作后将cookie写入此文件

接下来我们展示会话创建的输出 cookie

alfred@alfred-laptop:~/www/stackoverflow/6717214$ cat cookie 
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

localhost   FALSE   /   FALSE   0   PHPSESSID   d5jfijp8515pbhnoe43v4rau97

标准 PHP 使用文件系统来存储属于 session(PHPSESSID) 的数据。对我来说,文件位于 /var/lib/php5

alfred@alfred-laptop:~/www/stackoverflow/6717214$ php -r "echo session_save_path();"
/var/lib/php5

如您所见,它将这些信息存储在file sess_d5jfijp8515pbhnoe43v4rau97 中。它在后台使用serialize 将对象转换为字符串。

alfred@alfred-laptop:/var/lib/php5$ sudo cat sess_d5jfijp8515pbhnoe43v4rau97
count|i:1;

我需要sudo,因为我无法从该位置读取标准

alfred@alfred-laptop:/var/lib$ sudo ls -la /var/lib/ | grep php5
drwx-wx-wt  2 root          root           4096 2011-07-16 14:16 php5

尚未为该目录设置read bit

使用保存的 cookie 第二次卷曲

alfred@alfred-laptop:~/www/stackoverflow/6717214$ curl -v -b cookie http://localhost/stackoverflow/6717214/session.php
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /stackoverflow/6717214/session.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> Cookie: PHPSESSID=d5jfijp8515pbhnoe43v4rau97
> 
< HTTP/1.1 200 OK
< Date: Sat, 16 Jul 2011 12:28:59 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
1
  • -b: 用于读取 cookie 的 Cookie 字符串或文件

如您所见,我们可以在不将任何信息存储在 cookie 中的情况下进行计数。我们使用相同的 cookie 来记住我们的状态。您还可以看到光盘上的信息已更改以反映这一点。

alfred@alfred-laptop:~/www/stackoverflow/6717214$ sudo cat /var/lib/php5/sess_d5jfijp8515pbhnoe43v4rau97
count|i:2;

Cookies

仅使用 cookie 时,所有内容都存储在用户计算机上。

代码

<?php

$counter = 0;

if (isset($_COOKIE['counter'])) {
    $counter = $_COOKIE['counter'] + 1;
}

setCookie("counter", $counter, NULL, NULL, NULL, NULL, TRUE);
echo $counter;

第一次使用 Curl 存储 cookie

alfred@alfred-laptop:~/www/stackoverflow/6717214$ curl -c cookie -v http://localhost/stackoverflow/6717214/cookie.php
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /stackoverflow/6717214/cookie.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Sat, 16 Jul 2011 13:22:03 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
* Added cookie counter="0" for domain localhost, path /stackoverflow/6717214/, expire 0
< Set-Cookie: counter=0; httponly
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
0

当我们输出 cookie 时,我们得到:

alfred@alfred-laptop:~/www/stackoverflow/6717214$ cat cookie
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

#HttpOnly_localhost FALSE   /stackoverflow/6717214/ FALSE   0   counter0

如您所见,所有内容都存储在 cookie 中并通过网络发送。

Curl 第二次使用 cookie

alfred@alfred-laptop:~/www/stackoverflow/6717214$ curl -b cookie -c cookie -v htp://localhost/stackoverflow/6717214/cookie.php
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /stackoverflow/6717214/cookie.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> Cookie: counter=0
> 
< HTTP/1.1 200 OK
< Date: Sat, 16 Jul 2011 13:32:24 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
* Replaced cookie counter="1" for domain localhost, path /stackoverflow/6717214/, expire 0
< Set-Cookie: counter=1; httponly
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
1

【讨论】:

  • 哇,哈哈。谢谢!就像,涵盖了我在未来 19 年能想到的任何事情。大声笑
  • 是的,我也认为我给出了一个非常完整的答案;),但是谢谢:)
【解决方案2】:

Session 比 cookie 更安全,因为它存储在服务器上。 使用会话,很简单:)

【讨论】:

    【解决方案3】:

    会话和 cookie 之间有很多区别,因为这是两个不同的概念。它们的一些特征可以相互比较:

    位置:session PHP Manual 存储在服务器上,cookie PHP Manual 存储在客户端计算机上。

    传输:每次请求都会通过网络传输 Cookie 数据,而不是驻留在服务器上的会话数据。

    大小:Cookie 的长度也是有限的。 PHP 会话可以获取更多数据。

    【讨论】:

      【解决方案4】:

      非持久性 cookie 应用于非敏感和非常轻量级的数据。

      每个会话存储在服务器上的状态会话变量。

      要实现的是,为了使会话状态工作,服务器将向浏览器发出会话 cookie,浏览器将在每个后续请求中发送该 cookie,这将使服务器能够检索正确的会话数据对于用户的会话。这与 HTTP 无状态存在内在联系,并且是 Web 基础之一。

      但是请注意,如果您不通过 HTTPS(使用 SSL),这些会话 cookie 很容易被拦截,并且可能被攻击者重放,从而访问您的会话,即所谓的 Man-In-The-中攻。

      【讨论】:

      • 我尽量不传输敏感数据:P 有时会很困难。谢谢。
      【解决方案5】:

      SESSION 不会像 cookie 那样容易受到影响,因为 SESSION 存储在服务器上,客户端只需要 SESSID cookie。

      此外,cookie 的长度有限(感谢@Alfred)

      【讨论】:

      • 你也可以存储会话,只要你喜欢 => php.net/manual/en/…
      • 是的,我忘了提,但之前也有人提过。我不想复制别人的答案
      • 哈哈好吧:),也许你应该把它也放在你的答案中(给予作者信用...)??
      • 因为当您不添加该信息时,您的答案包含虚假信息(COOKIE 可以停留更长时间,但 SESSION)=> 这句话是谎言。希望我清楚...
      • 哎呀。我一直以为浏览关闭后SESSION会关闭
      猜你喜欢
      • 2015-06-06
      • 2021-07-10
      • 1970-01-01
      • 2010-09-15
      • 2016-03-21
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多