Что лучше, сессии или куки?

Приветствую. Посоветуйте, пожалуйста, что лучше использовать в моем случае, механизм сессий или куки. Пользователь заходит на сайт и ему устанавливаются 2 куки. Одна содержит его ид, а вторая уникальный ключ. Уникальный ключ и ид пользователя отправляются get-запросом. Сразу скажу, авторизация через сайт Вконтакте. Пишу iframe приложение.
Сначала я использовал механизм куки. Решил проверить свой сайт на безопасность и подменил значение куки с ид-ом. В итоге данные сохранились в базе чужому пользователю. Именно после этого мне посоветовали использовать сессии, чтобы нельзя было подменить данные в куках.
На утро до меня дошло, что проблема вовсе не в куках, а в моей невнимательности. Я забыл подключить в других php-скриптах файл проверки авторизации. Именно поэтому данные спокойно сохранились чужому юзеру и скрипт не выдал ошибку авторизации. Просто потому, что я забыл включить проверку.
Оказалось, что механизм сессий не работает в некоторых браузерах, т.е. по умолчанию iframe в этих браузерах теряет переменные сессии. Нужно что-то химичить, чтобы работало. Но для разных браузеров нужен свой код. Например в IE нужно прописать: header('P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); Тогда сессии будут работать. Но этот код не будет работать в других браузерах. Т.е. для каждого браузера индивидуальный код.
А теперь о проверки авторизации пользователей. В случае с сессиями, в каждом скрипте нужно всего лишь подключить проверку определена ли сессия с данным именем, если нет, выдать ошибку авторизации. Т.е. подключать скрипт с проверкой нет необходимости, так как значения в сессиях подменить нельзя. В случае с куками в каждом скрипте нужно подключать файл php с проверкой авторизации(сверяется md5). Тогда подмена значений в куках ничего не даст, а выдаст ошибку авторизации.
Так вот, вопрос. Что лучше мне использовать в данном случае, сессии или куки? С куками нет таких проблем как с сессиями в разных браузерах? Или тоже есть?

1 ответов


Идентификатор сессии хранится на клиентской машине и посылается браузером с каждым запросом. Как правило, хранится он в cookie, но не обязательно, может и в каждый GET/POST дописываться, если cookie недоступны. Так что вопрос куки или сессия - некорректный.
Если Вы храните все данные в cookie на клиенте, то это называется Client side web sessions, если на сервере - Server side web sessions (на клиенте только идентификатор сессии, который тоже может похитить атакующий, соответсвенно все равно надо делать дополнительную проверку, по крайней мере в критических частях). Область применения Client side web sessions очень узкая, т.к. накладывает много ограничений, в первую очередь из соображений безопасности, на реализацию , таких как небольшой размер куки, постоянное шифрование данных куки на стороне сервера, и т.п.

Обычно используется Server side session . При этом Вы не обязаны использовать out-of-the-box решения, которые предоставляет среда разработки . Можно написать свой метод гененрации идентификаторов сессии, хранить данные на каком-то распределенном cache сервере, и т.д...