无论您使用的是 POST 还是 GET,您始终可以考虑使用hash_hmac
. 这可以防止人们通过添加其他人无法猜测的签名来更改其值而不被发现。
这也使 CSRF 更加困难,尽管由于固定技术并非不可能。这只是另一种可以使“提琴手”更加困难的技术。
以下函数将盐和签名添加到给定的人员 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()
or中作为数据传递$.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
}