Dicas e técnicas de Programação Segura para um código de alta qualidade
Published: 2022-08-26 17:11:31

Como priorizar a programação segura no dia a dia do desenvolvedor? Entre diversos prazos, lançamentos de novos produtos e features, o code review pode ser muitas vezes empurrado para baixo na lista de tarefas pendentes de uma equipe de desenvolvedores.

Ainda assim, avançar sem revisar e testar um novo código – desde a sua performance e segurança – pode levar a grandes problemas de curto ou longo prazo.

Como os clientes hoje dependem cada vez mais de aplicações integradas, tem se tornado importante que as equipes de desenvolvimento priorizem a qualidade, juntamente com a segurança, durante todo o processo de desenvolvimento.

A qualidade e a segurança do código não são iguais, mas estão intimamente relacionadas. No ambiente atual de ameaças cibernéticas crescentes, parece importante aos desenvolvedores a priorização de ambos critérios.

A partir desse ponto, abordaremos algumas práticas para te ajudar a desenvolver de forma mais segura com práticas de Codificação Segura (conhecida também como Programação Segura) para ser proativo em relação às possíveis ameaças de segurança.

**Limpe e verifique todas as entradas**
Os serviços da Web modernos geralmente interagem com várias informações de terceiros. Como programadores, sabemos que os usuários inserem coisas inesperadas nas entradas de uma aplicação.

 Garantir que a entrada direta do usuário seja validada e higienizada adequadamente é considerada uma prática recomendada para evitar ataques de injection. 

 Toda entrada deve ser considerada e tratada como potencialmente perigosa.

Um exemplo, utilizando código PHP, em que existe uma vulnerabilidade de injection de SQL por falta de sanitização da entrada:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/52mryinrb5bhetq0clt2.png)

Agora uma versão com a entrada higienizada:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jp5d6r99twzgdwyfm4u2.png)

**Nunca armazene senhas como código ou configuração** 
Recomendamos que você verifique se o código que está construindo não contém nenhum conteúdo confidencial. Se você precisar manter dados confidenciais como informações de identificação pessoal ou detalhes financeiros, certifique-se de que a criptografia adequada seja utilizada. 

Ter regras para toda a equipe para evitar que as credenciais sejam armazenadas como código é uma ótima maneira de monitorar ações inválidas no fluxo de trabalho do desenvolvedor.

Mas atenção! Dados confidenciais também podem ficar na memória do sistema da sua aplicação. Se você alterar uma senha em seu sistema, evite o armazenamento temporário em um tipo de dados imutável.

Você também deve considerar inspecionar regularmente seus repositórios com ferramentas que verificam sua base de código em busca de informações confidenciais por meio de correspondência de padrões.

**Verifique vulnerabilidades em dependências e pacotes externos**
O desenvolvimento de aplicativos modernos depende muito de bibliotecas de terceiros, como npm, Maven, Gradle PyPI ou qualquer gerenciador de pacotes semelhante. Por esse motivo, é importante garantir que não haja vulnerabilidades conhecidas nessas dependências da sua aplicação.

Vamos usar a Conviso Platform como exemplo. A plataforma analisa estaticamente o código da aplicação para encontrar dependências vulneráveis que você possa estar utilizando e ajuda a corrigi-las. Ao fazer isso, a plataforma consegue impedir que os usuários continuem utilizando bibliotecas vulneráveis.

**Aplique uma autenticação segura**
A autenticação verifica se os usuários, serviços ou entidades internos e externos são quem afirmam ser. Isso pode ser tão simples quanto fornecer ao usuário suas credenciais ou o servidor fornecer seu certificado TLS para verificar a autenticidade.

A autenticação não informa o que um usuário ou serviço pode fazer, mas reconhece como verdadeiro a identidade de ambos.

Aqui tem um exemplo dessa vulnerabilidade no código apontado pela CVE-2019-1937.

**Aplique o princípio do menor privilégio**
Esse princípio afirma que cada módulo, seja ele um processo, usuário ou programa, deve ter acesso apenas às informações e recursos necessários para sua finalidade, dentro daquela aplicação.

Nesse sentido, só é dado às pessoas ou processos o mínimo de privilégios e permissões de que precisam para atingir seus objetivos no sistema. Por exemplo, um site pode hospedar funcionalidades de administrador no seguinte URL:

`https://exemplo-insegurança.com/admin`
Se não aplicar o princípio do menor privilégio, isso pode ser acessível a qualquer usuário e não apenas aos usuários administrativos que tenham um link para a funcionalidade em sua interface de usuário. Em alguns casos, aquela URL confidencial pode ser exposta em locais como no arquivo robots.txt:

`https://exemplo-insegurança.com/robots.txt`
No entanto, a aplicação pode pode vazar a URL para os usuários. Neste exemplo, a URL pode ser divulgada em JavaScript que constrói a interface do usuário com base na função do usuário:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4nfrkzxne7wkhnps0vrg.png)

O conselho é usar um único mecanismo em todo o aplicativo para impor controles de acesso, declarando acesso permitido para cada recurso e negando o acesso por padrão.

**Técnicas de segurança para agregar valor ao seu trabalho como desenvolvedor**

Sem conhecimento de otimização, cultura de segurança, ferramentas e processos corretos, o software pode acumular problemas de código que afetarão a experiência do usuário. Desse modo, o intuito deste artigo foi instigar você a buscar e estudar mais sobre segurança durante a programação.

Ao desenvolver um software com código limpo e seguro, você obtém um produto que pode ser constantemente aprimorado, de forma rápida e econômica. 

As chances estão a seu favor, pois o código de alta qualidade e segurança, aumenta o valor geral do produto, reduzindo os custos e facilitando as atualizações e a manutenção.

Link original para o post: https://bit.ly/38mIbIP