无论您使用的是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