Intereting Posts
Как объявить абстрактный метод в не-абстрактном классе в PHP? Сломанное изображение с файлами readfile и file_get_contents Как проверить адрес электронной почты в PHP Как преобразовать пустой в null в PostgreSQL? Неустранимая ошибка: вызов неопределенной функции mb_detect_encoding () Как настроить пользовательские заголовки в PHP Как успешно выполнить POST на старый сайт ASP.NET с использованием асинхронной обратной передачи Расширение класса Statement PDO Подзапрос Доктрины в InnerJoin Где я могу найти версию yii моего приложения yii? Ошибка 422 Непроцессная организация в laravel с ajax Могут ли выражения PHP PDO принимать имя таблицы или столбца в качестве параметра? session_start (): Не удалось инициализировать модуль памяти: memcache (путь: / var / lib / php5) в /usr/share/phpmyadmin/libraries/session.inc.php в строке 81 Удалить элемент с пустым значением в массиве Хранить результат print_r в переменной как строку или текст

хранить объекты php в элементе формы html и передавать объекты php через метод GET?

Я могу показаться немного странным, но есть ли способ? Например, у меня есть объект PHP $foo .

Есть ли способ сохранить этот объект в форме HTML (скрытый ввод) с помощью некоторой функции шифрования объекта и позже получить с помощью функции дешифрования.

Аналогично, могу ли я передать эти объекты с помощью метода GET?

Solutions Collecting From Web of "хранить объекты php в элементе формы html и передавать объекты php через метод GET?"

Как уже упоминалось в другом месте, вы можете использовать сериализацию, чтобы превратить объект в строку.

 $foo = (object) array( 'foo' => 'foo & bär', 'bar' => new StdClass ); $serialized = serialize($foo); 

Это дает:

 O:8:"stdClass":2:{s:3:"foo";s:10:"foo & bär";s:3:"bar";O:8:"stdClass":0:{}} 

Как вы видите, в этой строке есть кавычки, поэтому вы не можете вставить это в ссылку, не рискуя нарушить разметку:

 <a href="http://example.com?s=O:8:" <-- quote closes href 

Поэтому, по крайней мере, вам нужно будет выбрать htmlspecialchars или urlencode . Однако это все равно оставит содержимое легко читаемым. Вы можете использовать библиотеку MCrypt PHP, чтобы вставить строковое шифрование в строку. Но если данные действительно настолько чувствительны, вы, вероятно, должны найти другое средство передачи, вдали от публичной части вашего сайта.

Если данные менее чувствительны, то, возможно, вы можете защитить некоторые циклы процессора, просто запутывая строку. Самый простой способ сделать это – запустить его через gzdeflate :

 echo gzdeflate(serialize($foo)); 

дает что-то вроде

 󷲰R*.Iq I,.V 2  . 2 RJ  W . 24 … 

Использование gzdeflate также сократит большие сериализованные строки. Недостатком является то, что он выводит выходные данные, непригодные для передачи по HTTP, поэтому вы также должны использовать base64_encode что:

 echo base64_encode(gzdeflate(serialize($foo))); 

который затем даст

 87eysFIqLklxzkksLlayMrKqLrYytlJKy89Xsi62MjQAMxXUFJIOLykCiQDlkhKBLH9UfQZW1bW1AA== 

И это безопасно для передачи, а также довольно запутано из исходной сериализованной строки. Поскольку мы сжали строку до того, как мы ее установили base64, любой, достаточно умный, чтобы понять, что это base64, все равно должен будет понять сжатую строку при попытке изменить ее.

Чтобы превратить строку обратно в объект, вы затем выполняете

 unserialize( gzinflate( base64_decode( $obfuscatedString ) ) ) 

и вернуть свой объект обратно. демонстрация


Заметка о безопасности

Вышеупомянутое все еще небезопасно. Вы не должны полагаться на обфускацию для обеспечения безопасности. Если вы передаете объект или весь граф объекта через HTTP, вы должны рассматривать их как пользовательский ввод на принимающей стороне. Пользователю нельзя доверять . Вредоносные пользователи, выясняющие, как строка была запутана, могут предоставить измененный ввод. Поскольку вы несериализуете объекты обратно в поток программы, вы должны быть абсолютно параноиками относительно результирующего объекта.

См. http://www.sektioneins.com/en/advisories/advisory-032009-piwik-cookie-unserialize-vulnerability/ для соответствующего примера.

Если он не содержит конфиденциальных данных, вы можете его serialize() (или даже при необходимости шифровать сериализованные данные), например:

 <input type="hidden" name="foo" value="<?php echo htmlspecialchars(serialize($foo), ENT_QUOTES); ?>" /> 

В сценарии получения unseralize() данные POST возвращают объект:

 $foo = unserialize($_POST['foo']); 

Вы можете использовать методы serialize и unserialize :

 $serialized = serialize($foo); 

Теперь вы можете хранить $serialized в своем скрытом поле ввода. Позже вы можете прочитать его и преобразовать в объект с помощью метода unserialize . Например:

 $foo = unserialize($_POST['my_hidden_field']); // back to object