Skip to content

Bug em filtro de campos ofuscados #500

@turicas

Description

@turicas

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.

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions