Yii validación de captcha del lado del cliente

1

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;
    }
    
pregunta user273084 05.10.2015 - 08:11
fuente

1 respuesta

1

La validación del lado del servidor recopila el valor enviado con una representación de texto de la imagen captcha, no la suma ASCII, etc.

Echemos un vistazo al ejemplo de captcha estándar de 5 a-z caracteres:

  • La cantidad de todas las combinaciones de aaaaa a zzzzz es 26^5 = 11881376 combinaciones.
  • La cantidad de todas las sumas de ascii de nuestro captcha es 610-485+1 = 126

Entonces, si tenemos una suma de captcha ascii, refinamos nuestra área de combinaciones posibles a 11881376 / 126 = 94296 combinaciones.

A pesar de que nuestra área se reduce en 99.2% , el riesgo se mitiga mediante la regeneración de captcha después de que falle la validación del lado del servidor, lo que nos deja solo un intento de combinación, mientras que necesitamos fuerza bruta sobre los valores de 94000 para un captcha .

Seguramente, la validación del lado del cliente aumenta la posibilidad de omitir el captcha, pero aún no lo suficiente como para evitarlo realmente.

    
respondido por el Максим Романюк 15.01.2016 - 09:47
fuente

Lea otras preguntas en las etiquetas