2013-06-30 2 views
1

Я разрабатываю веб-сайт, на котором пользователи могут регистрироваться и получать доступ к своим учетным записям, а когда пользователь подключен, я сохраняю объект User в cookie с использованием кодирования serialization и base64. Он работал отлично, с шумом PHP-скрипт не хочет создавать cookie. Мой PHP скрипт:PHP Хранение объекта в cookie не работает

/** 
* Function that creates a cookie from an User object 
* @param User $user User object to be stored in the cookie 
* @param int $timeout Lifetime of the cookie (0 if should be destroyed when the navigator is closed) 
*/ 
function setUserCookie($user, $timeout = COOKIE_MAXLIFETIME) { 
    setcookie('user', base64_encode(serialize($user)), $timeout, '/'); 
} 

Я не знаю, где эта проблема исходит от, я надеюсь, что кто-то мне поможет :)

EDIT: Это проект для университета, я «Я знаю, что мой сайт может быть уязвим при сохранении объекта в cookie, но мы должны сосредоточиться на функциональности, а не на безопасности веб-сайта.

+1

Пользователь может изменить файл cookie и войти в систему как кто-либо еще. – SLaks

+2

Не делайте этого. Храните пользователя в сеансе, что значительно упрощает и экономит подход. – Pierre

+0

Хорошо, я меняю свой код на сеанс. Но есть ли более чистый способ, чем файлы cookie, чтобы сохранить пользователя после закрытия навигатора? –

ответ

0

Я, наконец, использовал $_SESSION, чтобы он работал, хотя пользователь не может оставаться на сайте.

2

Не храните сериализованную строку в чем-то, что внешний мир может видеть и манипулировать! Это дыра в безопасности! Зачем?

Сериализованная строка содержит имя класса, который использовался для сборки объекта. Это может быть изменено. Несериализация произвольной строки означает, что создается произвольный объект. Если этот код объектов доступен, он будет выполнен. В основном это уязвимость удаленного выполнения кода, потому что внешний злоумышленник может в какой-то мере выбрать, какой код он хочет выполнить.

Если вы действительно хотите хранить данные в файле cookie, используйте формат сериализации, который содержит только данные и не ссылается на какие-либо объекты PHP. json_encode() бывает. Лучше всего было бы использовать сеанс и хранить все, что связано с текущим сервером входа.

Смежные вопросы