Сессии VS Temp. Печенье - PullRequest
       1

Сессии VS Temp. Печенье

3 голосов
/ 16 июля 2011

Мне просто интересно.Какая разница в PHP между установкой cookie без истечения срока действия (то есть, срок его действия истекает после закрытия браузера) и установкой переменной сеанса.Я не говорю о входе в систему и тому подобное;скорее нет необходимости извлекать реже изменяющиеся значения базы данных при каждом посещении страницы и т. д.

Ответы [ 5 ]

1 голос
/ 16 июля 2011

PS: вы можете защитить свои куки еще больше, используя http_only cookies .Для PHP вы можете прочитать http://ilia.ws/archives/121-httpOnly-cookie-flag-support-in-PHP-5.2.html. Я забыл сделать для этого примера сеанса, но использовал его для примера cookie: (. Когда вы используете это, ваши куки не могут быть прочитаны из JavaScript с большинствомбраузеры (которые поддерживают http_only). Чтобы использовать http_only cookie для вашей сессии: ini_set("session.cookie_httponly", 1);

Какая разница в PHP между установкой cookie без истечения срока действия (то есть, срок его действия истекает при закрытии браузера) и установкойпеременная сеанса

Они могут отслеживать ту же информацию, но с помощью файлов cookie (без использования сеанса) вся информация хранится в пользователе / ​​веб-браузере, которая может быть украдена хакерами или даже изменена для предоставления ложной информации.Для простых вещей вы могли бы использовать куки, но опять же я думаю, что вы могли бы также использовать сеансы, потому что, когда вы используете куки, вам нужно передавать больше информации по сети.


Интернет ( HTTP) стандарт представляет собой протокол без сохранения состояния (без памяти), который имеет то преимущество, что упрощает работу сервера. дизайн.Интернет использует cookie , чтобы «запомнить».

Сеансы используют cookie только для хранения PHPSESSID внутри cookie.Стандартно остальная информация хранится на диске , что является более безопасным способом сохранить состояние (хранить конфиденциальную информацию).Вы также можете зашифровать ваш файл cookie , чтобы сделать это, но я думаю, что сеансы - это хороший способ сделать это.

Вы можете переопределить это поведение и, вероятно, должны, когда ваш сайт имеет большой трафик, использовать что-то вроде memcached / redis , чтобы просто сохранить информацию о сеансе в памяти (памятьнамного быстрее, чем вращение диска для чтения файла, потому что память также не имеет движущихся частей и очень близко к процессору).Для этого вам нужно переопределить session_set_save_handler .Это довольно легко сделать с Redis.Чтобы установить redis, просто наберите make. Predis - рекомендуемая (популярная) клиентская библиотека redis для PHP.Чтобы сохранить информацию о сеансе внутри redis, вы можете использовать redis-session-php .

Session

Code

Я создал очень простой php-файл для демонстрациисессий.

<?php

session_start();

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

echo $_SESSION['count']++;

Завиток, первый раз сохраняющий 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 в этот файл после операции

Далее мы покажем созданный файл вывода, созданныйк нашему сеансу

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.Он использует 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

бит чтения не был установлен для этого каталога

Завернуть второй раз, используя сохраненный файл 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
1 голос
/ 16 июля 2011

Непостоянные файлы cookie следует использовать для нечувствительных и очень легких данных.

Переменные сеанса для состояния, которое сохраняется в сеансе на сервере.

Необходимо понять, что для того, чтобы состояние сеанса работало, сервер отправит в браузер файл cookie сеанса, который браузер будет отправлять при каждом последующем запросе, и который позволит серверу получать правильные данные сеанса. для сеанса пользователя. Это неотъемлемо связано с отсутствием состояния HTTP и является одной из основ Интернета.

Обратите внимание, что, если вы не используете HTTPS (используя SSL), эти файлы cookie сеанса могут быть легко перехвачены и могут быть воспроизведены злоумышленником, который получит доступ к вашему сеансу, так называемым человеком в сеансе. Средняя атака.

1 голос
/ 16 июля 2011

Сессия более безопасна, чем cookie, потому что она хранится на сервере. Использовать сессию, это просто:)

1 голос
/ 16 июля 2011

SESSION не может быть затронуто так легко, как cookie, потому что SESSION хранится на сервере, и на стороне клиента требуется только SESSID cookie.

Дополнительно, куки имеют ограниченную длину (спасибо @Alfred)

1 голос
/ 16 июля 2011

Есть много различий между сеансом и cookie, потому что это две разные концепции. Некоторые их характеристики можно сравнить друг с другом:

Расположение: Сессия Руководство по PHP хранится на сервере, файл cookie Руководство по PHP на клиентском компьютере.

Передача : Cookie-данные передаются по сети при каждом запросе - данных сеансов, поскольку они находятся на сервере, нет.

Размер : Печенье также имеет ограниченную длину. Сеанс PHP может занять гораздо больше данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...