Recomendações para o desenvolvimento de software seguro

Com o propósito de tornar o ambiente cibernético mais seguro, é necessário priorizar a segurança de aplicações web. O processo de desenvolvimento seguro de aplicações web não se resume a apenas utilizar o protocolo HTTPS, em conjunto com uma funcionalidade de login. Isso não é o suficiente para garantir que a aplicação esteja livre de vulnerabilidades. Atualmente, encontramos diversas ferramentas prontas, nas mais diversas linguagens de programação, que auxiliam aos desenvolvedores a construírem um software funcional do zero em um curto período de tempo.

Contudo, é importante ressaltar que um código robusto e que funciona não necessariamente é seguro. A boa notícia é que tais ferramentas se preocupam cada vez mais com segurança e já implementam diversos mecanismos para a proteção contra as principais vulnerabilidades. Porém, é necessário atenção e uso de boas práticas de desenvolvimento seguro para que a aplicação esteja livre de vulnerabilidades.

Abaixo, destacamos recomendações para o desenvolvimento seguro de aplicações.


Elabore e mantenha um inventário de aplicações geridas pelo setor

  1. O setor responsável pelo desenvolvimento e implementação de aplicações deverá elaborar e manter um inventário com o máximo de informações sobre suas aplicações, como:  nome, responsável, ano de elaboração, data das manutenções, local, versão do servidor, atualizações do servidor e demais atualizações, versão de softwares utilizados, linguagens etc. 
  2. Ao concluir o inventário, priorizar a classificação em três categorias: Crítico, Importante e Normal. Tais informações auxiliará no uso e administração eficaz dos recursos institucionais.

Cuidados na implementação

  1. Valide sempre as permissões do usuário ao acessar uma funcionalidade na qual existam regras de negócio para restringir o acesso aos dados e não somente no recurso. 
  2. Evite guardar em campos ocultos informações críticas ao funcionamento da aplicação, que o usuário não poderia modificar normalmente, como identificadores, preços e status. 
  3. Caso o uso de campos ocultos seja realmente necessário, faça uma validação que os verifique tão logo a requisição chegar ao servidor. 
  4. Valide as informações de todos os campos de um formulário também no servidor (backend), inclusive o tamanho dos campos. Independentemente de existir ou não uma validação no frontend utilizando Javascript.
  5. Não utilize Javascript para implementar regras de negócio importantes e essenciais para segurança. Se for realmente necessário, lembre-se de replicar a lógica e validar as informações no servidor (backend).
  6. Valide as entradas de dados da aplicação garantindo que não seja permitido inclusão de código Javascript em seus campos. Assim evitando o ataque Cross-Site Scripting (XSS).
  7. Filtre e valide parâmetros no servidor na chegada das requisições para rejeitá-la ou eliminar o risco de SQL Injection. 
  8. Aplique mecanismos de segurança para impedir ataques de SQL Injection. Utilize a classe PreparedStatement ou frameworks de persistência, que fazem a tradução de caracteres-chave para que eles não sejam considerados parte do comando SQL. 
  9. Para tratar: Script Injection e Cross Site Scripting, existem duas abordagens: 
    1. Bloquear qualquer requisição com algum parâmetro de que se suspeite que possua script injetado. A implementação deste bloqueio pode ser feita com um filtro equivalente ao utilizado para bloquear ataques de SQL Injection mostrado na seção anterior. 
    2. Trocar os caracteres-chave por entidades HTML, de forma que o conteúdo da variável seja sempre considerado texto e nunca uma tag ou parte de um script. 
  10. Tenha atenção ao permitir o upload de arquivos, valide o formato e tamanho do mesmo. E não exiba o caminho onde a imagem foi salva.
  11. Armazene todos os arquivos de configuração e sigilosos (extensões: .cfg, .ini, .conf, .log, .pdf, .gbd ) em uma pasta inacessível pela web e gerencie com rigor o acesso aos dados sigilosos, quando for necessário disponibilizá-los.
  12. As páginas administrativas não devem ser indexadas nos mecanismos de buscas.
  13. Utilize o conceito de privilégio mínimo para execução dos processos da aplicação, ou seja, o mínimo de permissões para que seja efetuado o serviço.
  14. Autenticação e controle de sessão:
    1. Cuidado com exposição (transmissão e armazenamento) de IDs de usuário;
    2. Controle a quantidade de tentativas de login e bloquear, caso necessário. Recomende ao usuário a confecção de senhas fortes, determinar restrições de quão fortes as senhas estão. Saiba como criar senhas fortes, aqui!
    3. Implemente mecanismos de controle e bloqueio de acesso depois de um número máximo de tentativas.
  15. Utilize o CAPTCHA em formulários, principalmente em autenticações.
  16. Imponha um número mínimo de caracteres na senha é uma boa prática, pois o número de possibilidades que precisam ser testadas aumenta exponencialmente com o número de caracteres da senha. 
  17. Obrigue ao usuário a possuir números, letras e caracteres especiais. Tal medida, diminui a possibilidade de ele utilizar uma senha fraca, o que também reduz o risco de sucesso de um ataque do tipo dicionário. Valide sua senha forte, aqui!
  18. Altere o algoritmo de autenticação de forma a recuperar somente a senha do usuário e depois compará-la com a senha recebida como parâmetro. 
  19. Não exiba na tela mensagens de exceções vindas diretamente do banco de dados, pois essas podem dar pistas de como está a estrutura do banco e qual o comando que está sendo executado.
  20. No Banco de Dados: 
    1. Não utilize a senha de administrador para acessar o banco de dados, pois o atacante poderá ter acesso irrestrito às informações. 
    2. Seja criterioso ao conceder papéis e privilégios a usuários de um sistema de banco de dados.
    3. Cuidado ao conceder privilégios aos usuários, como os modos de acesso a arquivos ou registros de dados (leitura, inserção, exclusão ou atualização).
    4. Imponha segurança de acordo com o nível no qual determinados dados e usuários foram classificados.
  21. Mantenha a segurança da rede em que a aplicação está localizada, bloqueando portas de administração, por exemplo.
  22. Implemente o modelo de controle de acesso, que permita bloquear o acesso às informações às quais um usuário não possuir permissão.
  23. Gerencie as exceções de segurança que forem lançadas na aplicação, para que se possa ter conhecimento dos ataques que estão sendo feitos contra sua aplicação. 
  24. Se possível, implemente auditoria das ações dos usuários do sistema, tornando possível rastrear as ações e encontrar os responsáveis, quando necessário.
  25. Não inclua senhas ou chaves no código fonte.
  26. Não versione arquivos sensíveis. Ex.: arquivos que contenham senhas.
  27. Crie usuários distintos para diferentes softwares e funções:
    1. Web/app server, DB;
    2. Privilégios mínimos;
  28. Utilize senhas fortes (proteja-se de força bruta) e considere, quando possível, a autenticação de dois fatores.
  29. Grave as senhas de usuário no banco de dados utilizando um algoritmo de hashing, pois mesmo se um atacante obtiver acesso a essa informação, as senhas estarão protegidas.
  30. A aplicação em produção ou homologação não deve estar com o modo debug ativado. Quando a aplicação está com o modo debug ativado, é possível ter acesso a informações como: senhas de banco de dados, e-mails, senhas de emails etc. Mesmo em homologação, a aplicação pode ser explorada.
  31. Seja criterioso nas permissões aos arquivos e diretórios.
  32. Restrinja o acesso à interface de administração.
  33. Não utilize conta padrão de administração.
  34. Mantenha o servidor atualizado (Sistema Operacional, Software do web/app server e demais plugins).
  35. Siga os guias de segurança dos respectivos fornecedores.
  36. Opte por utilizar protocolo HTTPS.
  37. Só utilize código de terceiros que sejam confiáveis.

Referências:

 

Share this content:

Comments are closed