Aparentemente, el marco de la aplicación web Yii genera algún tipo de valor hash a partir de los códigos captcha que genera y lo envía al lado del cliente para que pueda ser utilizado para la validación del lado del cliente de los códigos captcha (sin la necesidad de contactar al lado del servidor para validación cada vez). de hecho, el valor de hash del lado del cliente es generado por una función de hash hecha en casa muy a la semana (o mejor dicho, algún algoritmo de suma de comprobación). ¡Es solo la suma de los códigos ASCII de todos los caracteres del código captcha! de modo que varios códigos captcha pueden crear fácilmente la misma suma de comprobación. así que si un atacante lo usa para un ataque de fuerza bruta, obtiene un resultado no determinista cada vez (existen varias combinaciones de caracteres que generan la misma suma de comprobación). ¿Puede analizar la seguridad de este esquema de una manera más profesional y precisa? Probablemente se necesita algún cálculo matemático. ¿Puede este método ser una cosa sana? ¿Puede usarse para romper gravemente la seguridad del sistema captcha?
yii.validatin.js línea 246 (función de validación de captcha javascript del lado del cliente):
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);
}
},
función de generación de suma de comprobación del lado del servidor:
/**
* 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;
}