使用serialize()
的建议很好。如果空间有问题,请使用bzcompress()
和serialize()
的组合。
但是,考虑到还没有提出安全性,那就是最终用户(可以查看和编辑此url)可以操纵其中的数据。你可能认为这很困难,但是大多数野生PHP攻击蠕虫都会在某种程度上做到这一点。如果让用户直接操纵键或值(或用一个整数,对象或其他任何东西代替它),那么你应该保护你的脚本(和你的用户)免受这种攻击。
一个简单的解决方案是简单地使用共享密钥。它可以是任何东西;只要它是唯一的,真正的秘密(也许你应该在安装时随机产生它)。比方说,你在你的配置文件是这样的:
define('SECRET', 'unoqetbioqtnioqrntbioqt');
然后,您可以进行数字签名以创建序列化的数据:使用$s=serialize($m)
$k=sha1($s.SECRET)
,使URL值$k.$s
然后,您unserialize()
之前做这个:
$v=substr($input,0,40);
$s=substr($input,40);
if ($v != sha1($s.SECRET)) { die("invalid input"); }
$m=unserialize($s);
这样,你就知道$m
和你序列化的原始值是一样的。
如果你喜欢,你可以使用下面的直接替代:
define('SECRET','buh9tnb1094tib014'); // make sure you pick something else
function secureserialize($o) {
$s=serialize($o);
return sha1($s.SECRET).$s;
}
function secureunserialize($i) {
$v=substr($i,0,40);$s=substr($i,40);
if ($v!=sha1($s.SECRET)){die("invalid input");}
return unserialize($s);
}
您没有说明这个数据的语义。让远程匿名用户直接操纵$ url可能存在严重的安全问题。 – geocar 2009-09-07 15:54:43