Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug em filtro de campos ofuscados #500

Open
turicas opened this issue Nov 10, 2020 · 1 comment · May be fixed by #503
Open

Bug em filtro de campos ofuscados #500

turicas opened this issue Nov 10, 2020 · 1 comment · May be fixed by #503
Assignees

Comments

@turicas
Copy link
Owner

turicas commented Nov 10, 2020

O Brasil.IO ofusca parte dos dados que publica, com o objetivo de proteger a privacidade de pessoas eventualmente descritas em nossos datasets. Exemplos:

  • Na tabela empresa (novo nome para a tabela empresas) do dataset socios-brasil deixamos em branco o endereço caso a empresa seja do tipo "individual" (de acordo com o código da natureza jurídica) - se a empresa é o próprio indivíduo, o endereço dela então provavelmente é o endereço residencial.
  • Na tabela candidatura (novo nome para a tabela candidatos) do dataset eleicoes-brasil, ofuscamos o CPF de quem se candidatou, de maneira que o Brasil.IO não publique nenhum CPF completo em conjunto com outros dados como nome completo.

No primeiro exemplo acima a ofuscação dos dados é feita durante a conversão dos dados, ou seja, no script que baixa e converte os dados da Receita Federal. Já no segundo exemplo, a ofuscação acontece na hora de servir os dados pelo backend do Brasil.IO, porque precisamos do dado completo na nossa base para fazer alguns cruzamentos (exemplo: identificar todas as candidaturas dessa pessoa) - isso é necessário pois a versão ofuscada desse dado pode aparecer também para outras pessoas e gerar ambiguidades.

O problema relatado nessa issue é relativo ao segundo exemplo, ou seja: o dado está completo em nossa base e ofuscamos na hora de serví-lo (seja via interface ou via API).

Se um determinado Field (core.models.Field) tem o campo obfuscate como True, ele não será exibido integralmente (exemplo: o cpf 12345678901 seria exibido como ***456789**). Porém, se esse Field possui o campo frontend_filter como True, o usuário do site e da API poderá filtrar os registros por esse campo e, aí, temos 2 possíveis cenários:

  • Cenário A: usuário digita dados ofuscados (ex: ***456789**)
  • Cenário B: usuário digita dados completos (ex: 12345678901)

Hoje apenas o cenário B funcionará, dado que o filtro da query-string ignora se o Field é ofuscado ou não e faz a consulta equivalente a algo como: X.objects.filter(fieldname="12345678901") (onde X é o model criado dinamicamente para a tabela com os dados).

Para contornar esse problema, precisamos:

  • Durante a aplicação dos filtros na query string (método core.models.DatasetTableModelQuerySet.apply_filters), verificar se algum dos campos de filtro é ofuscado;
  • Para todos os campos ofuscados, aplicar um filtro diferente. Hoje o filtro só dá match caso o valor seja igual (.filter(campo=valor), mas no caso de valores ofuscados teríamos que aplicar os dois cenários:
    • Se o dado não veio ofuscado do usuário (nesse caso, não possui *), faz o filtro normalmente;
    • Se o dado veio ofuscado (nesse caso, se possui *), executa um filtro diferente, como: .filter(campo__contains=valor.replace("*", "")) -- talvez o ideal seja executar substring em vez do __contains, por conta do desempenho.
@turicas
Copy link
Owner Author

turicas commented Nov 10, 2020

Acabei de encontrar um outro problema que não ficou descrito acima: considerei que se uma coluna está ofuscada, todos os registros da tabela estarão e, caso ela não esteja, nenhum registro estará. Acontece que em alguns datasets alguns campos são ofuscados diretamente na fonte de dados (e não temos acesso ao dado completo em nosso backend), porém nem todos os registros são ofuscados.

Essa ofuscação parcial acontece com a coluna cpf_cnpj_socio da tabela socio do dataset socios-brasil: para os casos em que o sócio descrito é uma empresa, o campo aparece com o CNPJ completo (ou seja, sem ofuscação), já no caso de uma pessoa física, o CPF já vem ofuscado da fonte. Nesse caso, para corrigir o problema no cenário A, precisaríamos fazer uma busca OR: .filter(Q(campo=valor) | Q(campo__contains=valor.replace("*", ""))) (lembrando que idealmente deveríamos usar substring em vez de contains).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants