使用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