Я могу показаться немного странным, но есть ли способ? Например, у меня есть объект PHP $foo
.
Есть ли способ сохранить этот объект в форме HTML (скрытый ввод) с помощью некоторой функции шифрования объекта и позже получить с помощью функции дешифрования.
Аналогично, могу ли я передать эти объекты с помощью метода 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