Yii convalida del captcha lato client

1

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;
    }
    
posta user273084 05.10.2015 - 08:11
fonte

1 risposta

1

La convalida sul lato server collima il valore inviato con una rappresentazione testuale dell'immagine captcha, non la somma ascii o ecc.

Diamo un'occhiata all'esempio standard 5 a-z chars captcha:

  • La quantità di tutte le combinazioni da aaaaa a zzzzz è 26^5 = 11881376 combinazioni.
  • La quantità di tutte le somme ascii del nostro captcha è 610-485+1 = 126

Quindi, se abbiamo una somma ascii di captcha, perfezioniamo la nostra possibile combinazione di combinazioni in combinazioni 11881376 / 126 = 94296 .

Anche se la nostra area è ridotta di 99.2% , il rischio si attenua con il captcha che si rigenera dopo la convalida sul lato server fallita, il che ci lascia solo una prova per la combinazione, mentre abbiamo bisogno di bruteforce su 94000 valori per un captcha .

Sicuramente, la convalida sul lato client aumenta la possibilità di bypassare captcha, ma non ancora abbastanza da aggirarla davvero.

    
risposta data 15.01.2016 - 09:47
fonte

Leggi altre domande sui tag