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