会议VS温度饼干

时间:2011-07-16 12:03:22

标签: php session cookies

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

5 个答案:

答案 0 :(得分:1)

会话和cookie之间存在许多差异,因为这是两个不同的概念。他们的一些特征可以相互比较:

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

传输:Cookie-Data通过网络传输每个请求 - 因为它驻留在服务器上的会话数据不是。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

另外,cookies的长度有限(感谢@Alfred)

答案 3 :(得分:1)

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

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

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

但是请注意,如果您没有通过HTTPS(使用SSL),这些会话cookie很容易被截获,并且可以被攻击者重播,攻击者可以访问您的会话,即所谓的Man-In-The-中间攻击。

答案 4 :(得分:1)

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

  

在没有设置cookie的情况下PHP的区别是什么   到期(意味着它在浏览器关闭时到期)并设置一个   会话变量

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


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

会话仅使用cookie将{​​{3}}存储在Cookie中。标准的其余信息存储在PHPSESSID上,这是保持状态(存储敏感信息)的更安全的方式。您也可以disc执行此操作,但我认为encrypt your cookie是执行此操作的好方法。

您可以覆盖此行为,并且可能应该在您的网站流量较大时使用sessions / memcached等内容将会话信息存储在内存中(内存比将光盘旋转到读取文件,因为内存也没有移动部件,并且非常接近CPU)。为此,您需要覆盖redis。使用redis非常容易。要安装redis,只需输入make即可。 session_set_save_handler是PHP的推荐(流行)redis客户端库。要在redis中保存会话信息,您可以使用Predis

会话

代码

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

<?php

session_start();

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

echo $_SESSION['count']++;

卷曲第一次保存cookie

我正在使用下面的redis-session-php

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使用文件系统来存储属于会话的数据(PHPSESSID)。对我来说,文件位于/var/lib/php5

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

如您所见,它将该信息存储在file sess_d5jfijp8515pbhnoe43v4rau97中。它使用封面下的Linux Ubuntu将对象转换为字符串。

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

我需要serialize,因为我可以标准不从该位置读取

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

尚未为该目录设置sudo

使用保存的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;

缓存

仅使用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中并通过网络发送。

卷曲第二次使用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