geekcom / validator-docs

Validação de CPF, CNPJ, CNH, NIS, DDD, Título Eleitoral e Cartão Nacional de Saúde com Laravel.
MIT License
564 stars 96 forks source link

Sanitização causa validação errônea quando a input possue letras #121

Open ptsilva opened 3 years ago

ptsilva commented 3 years ago

Veja um caso de duas inputs que são aplicadas a regra de validação para CNH:

$cnh_valido = '43872153406';
$cnh_invalido = 'ZZZ43872153406'

Ambos passam na validação, pois a chamada do método sanitize:

public function sanitize($value): string
    {
        return empty($value) ? "" : preg_replace('/[^\d]/', '', $value);
    }

https://github.com/geekcom/validator-docs/blob/10b202192666a7105bb110977ebbb6ef84090f11/src/validator-docs/Rules/Cnh.php#L22

O sanitize altera o valor antes da valiação, porém, como ele não altera o próprio request (e nem faz sentido), a aplicação identifica como válido um valor que na verdade é inválido. Testei com CNH, mas com certeza deve ocorrer em todas as Rules que também utilizam o sanitize.

A correção é simples, a validação deve ser feita em cima da input bruta e não deve haver nenhuma transformação antes da validação.

vicentimartins commented 3 years ago

@ptsilva realmente, o bug existe! Já sobre a correção, não acho que a gente deve validar sobre o input bruto, pois estaremos assumindo que o usuário nunca irá enviar informação inválida no request. Acho que a melhor solução aqui é especificar a sanitização em cada caso específico. Tenho em mente uma possível solução, mas preciso de algum tempo para implementar ela. Agradeço sua contribuição!

ptsilva commented 3 years ago

Obrigado pelo retorno @vicentimartins, acho que podemos pensar um pouco sobre essa questão, veja esse exemplo:

$request = ['cpf' => '     258.727.290-49      '];

Meu entendimento nesse caso, é que sim, poderíamos aplicar um trim e tornar o valor válido antes da validação ... Mas observe que a lib não deveria alterar o valor 'on the fly' na validação, pois ele não iria alterar o request original...

Dessa forma, passaria na validação e a aplicação ainda sim receberia um valor inválido/duvidoso. Ou então, como saber se realmente o valor é válido? Pra realmente saber se ele é válido após a validação usando essa estratégia, a aplicação precisaria reaplicar a transformação (trim) e então receber o valor correto.