我可能听起来有点奇怪但是,有办法吗?例如,我有一个PHP对象$foo
.
有没有办法通过某个对象加密函数将此对象存储在HTML表单(隐藏输入)中,然后通过解密函数进行检索.
同样,我可以通过GET方法传递这些对象吗?
Gor*_*don 15
就像其他地方已经指出的那样,您可以使用序列化将对象转换为字符串.
$foo = (object) array(
'foo' => 'foo & bär',
'bar' => new StdClass
);
$serialized = serialize($foo);
Run Code Online (Sandbox Code Playgroud)
这给出了:
O:8:"stdClass":2:{s:3:"foo";s:10:"foo & bär";s:3:"bar";O:8:"stdClass":0:{}}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,该字符串中有引号,因此您无法将其插入链接而不会有破坏标记的风险:
<a href="http://example.com?s=O:8:" <-- quote closes href
Run Code Online (Sandbox Code Playgroud)
所以至少你必须输出htmlspecialchars或urlencode.但是,这仍然会使内容易于阅读.您可以使用PHP的MCrypt库对字符串进行一些强加密.但是,如果数据真的那么敏感,那么你应该找到另一种转移方式,远离你网站面向公众的部分.
如果数据不那么敏感,那么你可以通过混淆字符串来保护一些CPU周期.最简单的方法是运行它gzdeflate
:
echo gzdeflate(serialize($foo));
Run Code Online (Sandbox Code Playgroud)
给出类似的东西
R*.Iq?I,.V?2??.?2?RJ??W?.?24 …
Run Code Online (Sandbox Code Playgroud)
使用gzdeflate
也会缩短大型序列化字符串.缺点是,它产生的输出不适合通过HTTP传输,所以你还需要base64_encode
:
echo base64_encode(gzdeflate(serialize($foo)));
Run Code Online (Sandbox Code Playgroud)
然后会给
87eysFIqLklxzkksLlayMrKqLrYytlJKy89Xsi62MjQAMxXUFJIOLykCiQDlkhKBLH9UfQZW1bW1AA==
Run Code Online (Sandbox Code Playgroud)
这对于transferal来说是安全的,并且从原始的序列化字符串中也很混乱.因为我们在基础之前已经压缩了字符串,所以任何聪明到足以弄清楚它的base64的人在尝试反转它时仍然需要理解压缩字符串.
要将字符串转换回对象,您可以执行此操作
unserialize(
gzinflate(
base64_decode(
$obfuscatedString
)
)
)
Run Code Online (Sandbox Code Playgroud)
并让你的对象回来.演示
关于安全的说明
以上仍然不安全.您不应该依赖混淆来获得安全性.如果通过HTTP传输对象或整个对象图,则必须将它们视为接收端的用户输入.用户输入不可信任.恶意用户弄清楚字符串是如何被混淆的,可以提供改变的输入.因为您将对象反序列化回程序流,所以您必须对结果对象完全偏执.
有关相关示例,请参见http://www.sektioneins.com/en/advisories/advisory-032009-piwik-cookie-unserialize-vulnerability/.
归档时间: |
|
查看次数: |
7869 次 |
最近记录: |