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()
または$.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
}