Evet, saklanan-token yaklaşım ile herhangi bir noktada geri geldi sadece durumda üretilen tüm belirteçleri tutmak gerekiyor. Tek saklı-token sadece birden fazla tarayıcınızdan sekmeleri / windows için değil, aynı zamanda ileri / geri navigasyon için değil başarısız olur. Genellikle (yaş ve / veya yana verilen belirteçleri sayısına göre) eski belirteçleri dolan tarafından potansiyel depolama patlama yönetmek istiyorum.
Tamamen belirteç depolama önleyen bir başka yaklaşım, bir sunucu tarafı gizli kullanarak oluşturulan imzalı bir belirteç hazırlamaktır. Sonra belirteç geri almak ne zaman imzayı kontrol edebilir ve bu maçlar eğer bunu imzaladı biliyorsun. Örneğin:
// Only the server knows this string. Make it up randomly and keep it in deployment-specific
// settings, in an include file safely outside the webroot
//
$secret= 'qw9pDr$wEyq%^ynrUi2cNi3';
...
// Issue a signed token
//
$token= dechex(mt_rand());
$hash= hash_hmac('sha1', $token, $secret);
$signed= $token.'-'.$hash;
<input type="hidden" name="formkey" value="<?php echo htmlspecialchars($signed); ?>">
...
// Check a token was signed by us, on the way back in
//
$isok= FALSE;
$parts= explode('-', $_POST['formkey']);
if (count($parts)===2) {
list($token, $hash)= $parts;
if ($hash===hash_hmac('sha1', $token, $secret))
$isok= TRUE;
}
Eşleşen bir imza ile bir simge olsun eğer bu ile, bunu oluşturulan biliyorsun. Bu başlı başına çok yardım değil, ama daha sonra, örneğin bir kullanıcı kimliği için, rastgele dışında belirteç başka ekstra şeyler koyabilirsiniz:
$token= dechex($user->id).'.'.dechex(mt_rand())
...
if ($hash===hash_hmac('sha1', $token, $secret)) {
$userid= hexdec(explode('.', $token)[0]);
if ($userid===$user->id)
$isok= TRUE
Şimdi her form gönderme oldukça fazla CSRF yendi formu, aldı, aynı kullanıcı tarafından yetkilendirilmiş olması gerekir.
Bir anlık istemci uzlaşma ya MiTM saldırı sonsuza kadar o kullanıcı için çalışmak olacak bir belirteç sızıntı ve şifre sıfırlar üzerinde değişiklikler olduğunu bir değeri olmadığını böylece bir belirteç koymak için iyi bir fikirdir başka bir şey, bir zaman aşımı süresi olan parola değiştirilirken mevcut belirteçleri geçersiz böylece.