無論您使用的是POST還是GET,您都可以考慮使用hash_hmac
來爲頁面中的重要字段進行簽名。這可以防止人們通過添加別人無法猜測的簽名來改變其價值。
這也使得CSRF更加困難,雖然由於注視技術並非不可能。這只是另一種可以使「小提琴手」變得更加困難的技術。
以下函數將salt和簽名添加到給定的person id以形成安全的字符串。
define('MY_SECRET', 'an unguessable piece of random text');
function getSecurePersonId($personId)
{
$rnd = uniqid("$personId-", true);
$sig = hash_hmac('sha1', $rnd, MY_SECRET);
return "$rnd-$sig";
}
您會傳遞的getSecuredPersonId()
給JavaScript輸出通過如在$.post()
或$.get()
數據;張貼會推薦順便說一句。
當提交表格時,根據請求方法,您的個人ID將會以$_GET['personID']
或$_POST['personID']
結尾。爲了驗證給定值,你通過這個功能運行:
function validateSecurePersonId($securePersonId)
{
if (3 != count($parts = explode('-', $securePersonId))) {
return false;
}
// reconstruct the signed part
$rnd = "{$parts[0]}-{$parts[1]}";
// calculate signature
$sig = hash_hmac('sha1', $rnd, MY_SECRET);
// and verify against given signature
return $sig === $parts[2] ? $parts[0] : false;
}
如果該值正確簽名,它會返回你開始了原始的人的ID。如果發生故障,將返回false
。
小測試:
$securePersonId = getSecurePersonId(123);
var_dump($securePersonId);
if (false === validateSecurePersonId($securePersonId)) {
// someone messed with the data
} else {
// all okay
}
我想,最好的應該是始終對數據進行加密,當你收到它解密。 – jcho360