Assegure a qualidade do seu código Python - Bandit

Já falamos sobre algumas ferramentas de qualidade de código Python aqui no blog. De pycodestyle a Clone Digger, passando por Pyflakes e Pylint. Além do flake8 (que acredito não precisar de apresentações), uma ferramenta que passei a ter sempre no meu toolbelt foi o Bandit.

Na verdade, ele não é exatamente um code linter, mas sim uma ferramenta para testar a segurança do seu projeto Python. Em tempos onde cada vez mais somos expostos a falhas de segurança em aplicações, e tais falhas podem ser um fator crucial para o fracasso de um negócio, cuidado nunca é demais.

O seguro morreu de velho

O Bandit é uma ferramenta construída para encontrar problemas comuns de segurança em projetos Python. Livre e de código aberto (Apache 2), está disponível para instalação através do pip:

$ pip install bandit

Uma vez instalado, basta executá-lo através do terminal:

$ bandit -r caminho-para-projeto-python

Note que o parâmetro -r acima instrui o utilitário a executar de forma recursiva, iterando sobre todos os arquivos e pastas dentro do caminho especificado. Outro parâmetro comum é o -t, onde é possível especificar quais testes você quer executar:

$ bandit -r ~/Workspace/klaus/blog -t B101,B102

O Bandit considera como vulnerabilidades desde o uso de assert (B101), passando pelo uso de eval (B307), até possíveis brechas para SQL injection (B608). Uma lista completa de todos os plugins está disponível na documentação oficial.

"Foto do filme Agarre-me Se Puderes"
Segurança na web é como fazer parte do filme Agarra-me Se Puderes (adorocinema.com)

Se você utiliza pytest para escrever os seus testes, o item B101 pode ser um problema, uma vez que é normal utilizar assert ao invés do convencional self.assertEquals. Nesse caso, uma das formas de contornar esse comportamento é ignorando os testes:

$ bandit -r . -x tests/

Também é possível ter um arquivo de configuração (.bandit) na raíz do seu projeto:

[bandit]
exclude: tests

Para finalizar, através do parâmetro -f é possível emitir a saída em diferentes formatos, como CSV, HTML, JSON, XML e YAML.

Considerações finais

O Bandit é aquela ferramenta perfeita para você ter em seu pre-commit ou em seu CI. Inclusive, o Codacy, serviço super bacana que avalia a qualidade do seu código, utiliza o Bandit em seu processo de análise. Com isso, fica fácil de integrá-lo ao seu processo de Pull Request/Code Review.

Um bom custo vs. benefício para o seu projeto.

Até a próxima.

Referências