PHP и Cookie
При работе с куками, а именно хранение в них довольно объемных массивов, столкнулся с рядом проблем..
Проблема 1 - Сохранение массива в куки. Решение:
Запись в куки
1 2 3 4 5 6 |
<?php $favors = Array( Array('hello'), Array('world') ); setcookie('favors', base64_encode(serialize($favors)), time()+3600*24*365); ?> |
Чтение из кук
1 2 3 4 5 |
<?php $favors = unserilize(base64_decode($_COOKIE['favors'])); ?> |
Проблема 2 - Хранение больших объемов данных.
После некторого времени работы с ними столкнулся с такой проблеммой: добавляю очередной элемент в куки, перезагружаю страницу, он или пропадает или записывается на место последнего элемента. Полез искать инфу, как я и полагал, нормальные броузеры ограничивает файл куки для страницы ( а может и домена, не проверял ) в 4 кб. Это согласно RFC. Microsoft как всегда отличается
Internet Explorer will ignore any Set-Cookie header if the header value's length exceeds 5118 bytes
у них размер чуть больше
Также нашел такую информацию:
Клиент (браузер) имеет следующие ограничения для cookies:
* всего может храниться до 300 значений cookies
* каждый cookie не может превышать 4Кбайт
* с одного сервера или домена может храниться до 20 значений cookieЕсли ограничение 300 или 20 превышается, то удаляется первая по времени запись. При превышении лимита объема в 4Кбайт корректность значения cookie страдает — отрезается кусок записи (с начала этой записи) равный превышению объема.
В случае кэширования документов, например, proxy-сервером, поле Set-cookie HTTP заголовка никогда не кэшируется.
Если proxy-сервер принимает ответ, содержащий поле Set-cookie в заголовке, предполагается, что поле доходит до клиента вне зависимости от кода возврата 304 (Not Modified) или 200 (OK). Соответственно, если клиентский запрос содержит в заголовке Cookie, то он должен дойти до сервера, даже если жестко установлен параметр If-modified-since.
На гугл ответах нашел даже такое (сам не проверял):
если вгонять в IE7 куки можно очень скоро обнаружить переполнение буфера и возможность выполнить любой код на компе жертвы - дерзайте
Отсюда следует, что если Вам необходимо хранить большой объем данных, больше 4 кб, а делать авторизацию не имеет смысла, то возможно подойдет такой вариант:
1. Создаём файл с случайным набором букв afsd876f0adf08970asf.cache
2. Записываем в него serialize массив
3. Храним в куках имя файла
Author: | Tags: /
| Rating:
Leave a Reply