Apparentemente, il framework di applicazioni web Yii genera una sorta di valore hash dai codici captcha che genera e lo invia al lato client in modo che possa essere utilizzato per la convalida lato client dei codici captcha (senza la necessità di contattare il lato server per convalida ogni volta). il valore hash del client è in realtà generato da una funzione hash fatta in casa per molto tempo (o, meglio dire, da un algoritmo di checksum). È solo la somma dei codici ascii di tutti i caratteri del codice captcha! quindi molti codici captcha possono effettivamente creare lo stesso checksum. quindi se un attaccante lo usa per un attacco a forza bruta, ottiene ogni volta un risultato non deterministico (esistono diverse combinazioni di caratteri che generano lo stesso checksum). Per favore, puoi analizzare la sicurezza di questo schema in qualche modo più professionale e preciso? Probabilmente è necessario un calcolo matematico. questo metodo può essere una cosa sana? può essere usato per rompere severamente la sicurezza del sistema captcha?
linea yii.validatin.js 246 (funzione di convalida del captcha javascript lato client):
captcha: function (value, messages, options) {
if (options.skipOnEmpty && pub.isEmpty(value)) {
return;
}
// CAPTCHA may be updated via AJAX and the updated hash is stored in body data
var hash = $('body').data(options.hashKey);
if (hash == null) {
hash = options.hash;
} else {
hash = hash[options.caseSensitive ? 0 : 1];
}
var v = options.caseSensitive ? value : value.toLowerCase();
for (var i = v.length - 1, h = 0; i >= 0; --i) {
h += v.charCodeAt(i);
}
if (h != hash) {
pub.addMessage(messages, options.message, value);
}
},
Funzione di generazione di checksum del lato server:
/**
* Generates a hash code that can be used for client side validation.
* @param string $code the CAPTCHA code
* @return string a hash code generated from the CAPTCHA code
*/
public function generateValidationHash($code)
{
for ($h = 0, $i = strlen($code) - 1; $i >= 0; --$i) {
$h += ord($code[$i]);
}
return $h;
}