Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проблема с unserialize


Автор: lancelot555 9.1.2006, 14:21
В общем есть скрипт авторизации построенный на куках. В index.php есть форма для ввода логина пароля, затем создается кука
Код

$mass['login']=$login;
$mass['pass']=$pass;
$tocookie=serialize($mass);
setcookie("auth",$tocookie,time()+10800);


На остальных страницах вот такой код проверяет логин пароль:
Код

$mass=unserialize($auth);
if($mass['login']=="login" && $mass['pass']=="pass") 
{отображается страница} else {echo "Доступ запрещен";}


На локальном сервере все работает как надо, но хосте не работает...
Кука создается, к примеру если написать echo $auth; то выводится сериализнутый массив
а если сделать $mass=unserialize($auth); то почему то функция не выполняется, то есть массис mass оказывается пустым и echo mass['login'] не выводит ничего smile

Автор: Mal Hack 9.1.2006, 14:42
Пароль охранять в сессию не надо.
Глянь тут: http://vingrad.ru/PHP-ART-002849, что надо сохранять в куки.

Автор: Cheba 9.1.2006, 14:45
Это глюк PHP. smile
Бывает, что у него не получается рассериализировать свой же массив. Редко, но бывает. Я так и не нашел закономерности...

Автор: Mal Hack 9.1.2006, 14:57
Cheba сколько исходных комбинация может быть для результата md5?
Вот тут в принципе такая же фигня.

Автор: Cheba 9.1.2006, 16:23
Mal Hack, не то. MD5 - это хеш. Он из любой строки (любой длины) сделает тебе хеш в 128 бит. Потому и есть разные строки для которых хеш одинаков.
Serialize - совсем другое дело. Он как-раз для того и был придуман, чтобы восстанавливать структуру массива из строки. Он сохраняет структуру, типы и длины элементов. Длина сериализированного массива (строки - результата serialize) всегда длиннее суммы длин элементов массива в строковом представлении. Это именно глюк, к сожалению.

Автор: Mal Hack 9.1.2006, 17:41
Хм... Но ведь смысл похож. В принципе, мы же просто шифруем массив, и пытаемся потом расшифровать. При этом КЛЮЧ он нигде не хранит...
Хотя фиг его знает, как это во внутреннем представлении PHP сделано.

Автор: Cheba 9.1.2006, 22:11
Не похож смысл. smile
Попробуй из md5 (да вообще из любого хеша) достать исходную строку. smile

Автор: Mal Hack 9.1.2006, 22:50
Cheba это-то понятно, что из md5 ты ничего не достанешь. Я имел ввиду другое.
Мы один и тот же хэш можем получить разными входными строками.
Вот в сериализации ИМХО, может быть тоже самое.

Автор: Cheba 10.1.2006, 00:13
Не должно быть такого. Именно для того и придумывали serialize/unserialize чтобы иметь однозначный результат. Можешь воспринимать это как двустороннее шифрование по пустому ключу.

Автор: Alone 10.1.2006, 03:09
кстати, serialize ничего не шифрует.
Для эксперимента попробуй вывести результат на экран...
serialize() возвращает строку с байтово-поточным представлением значения value, которое может храниться где угодно.

Это используется для хранения или передачи PHP-значений повсюду без потери их типа и структуры.

Автор: Cheba 10.1.2006, 13:37
Я знаю, но аналогия вполне уместна ведь по сути это преобразование формата данных. Вот только проблема в том, что unserialize'у не всегда удается восстановить структуру исходных данных.

Автор: RaZoR 11.1.2006, 08:11
попробуй так:
Код
unserialize(stripslashes(...));

Автор: Wiedzmin 30.1.2006, 14:08
Цитата

Notice: unserialize(): Error at offset 14 of 3705 bytes in c:\internet\home\localhost\www.....php on line 40


Что делать если такое выходит? В сериализованом массиве есть тексты не такой уж маленькой длины...

Автор: therik 23.10.2006, 17:32
В общем нашел я в чем проблема. На самом деле когда в сериализованной строке встречаются кавычки, то php перестает их десериализировать.Выход один обрабатывать сериализуемые данные и удалять кавычки, ну либо еще что придумать, добавляя слэш, не дали заметного результата.

Автор: Vovarza 24.4.2010, 01:41
Цитата

unserialize(stripslashes(...));

Cпасибо, помогло!

Автор: SickFxck 24.4.2010, 20:53
Цитата(Mal Hack @  9.1.2006,  17:41 Найти цитируемый пост)
В принципе, мы же просто шифруем массив, и пытаемся потом расшифровать. При этом КЛЮЧ он нигде не хранит...

Феерический бред!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)