Programação defensiva

Programação defensiva é um conjunto de técnicas de projeto (do inglês design) e programação objetivando a estabilidade e a segurança de um software independentemente de seu imprevisível. A ideia pode ser vista como forma de reduzir ou eliminar a hipótese de as Leis de Murphy terem efeito. Técnicas de programação defensiva começaram a ser desenvolvidas quando sistemas de software começaram a possibilitar efeitos catastróficos, seja deliberadamente ou inadvertidamente.

Recomendações

[editar | editar código-fonte]

Aqui estão algumas dicas em programação defensiva de forma a evitar problemas de segurança. Muitas dessas técnicas também melhoram a qualidade geral do código, uma vez que qualquer defeito de maior porte pode ser potencialmente usado por um cracker para um ataque como DoS.

Perceba que essas técnicas não são suficientes para garantir segurança.

  • Um dos problemas mais comuns é o uso de estruturas de tamanho constante e funções para dados de tamanho dinâmico sem checagem. É o problema de transbordamento de dados. Isso é particularmente comum para dados string em C. Funções como gets e scanf não devem ser usadas por não terem nenhum valor de tamanho máximo.
  • Nunca faça um código mais complexo que o necessário. Complexidade alimenta bugs, incluindo problemas de segurança.
  • Deixe o código disponível para todos na rede (software livre) ou contrate alguém que faça uma auditoria de segurança.
  • Se possível, reutilize o código ao invés de reescrever do zero.
  • Codifique todo dado importante transmitido por redes.
  • Todo dado é importante até que se prove o contrário.
  • Todo código é inseguro até que se prove o contrário.
  • Nunca faça programas setuid a menos que tenha certeza que é seguro.
  • Se dados vão ser checados por correção, cheque se é correto, não se é incorreto.

Crackers provavelmente inventarão novos tipos de dados incorretos. Por exemplo, se você checou se um arquivo solicitado não é "/etc/passwd", um cracker pode pedir "/etc/../etc/passwd".

De uma maneira geral, é preferível usar mensagens de exceções e de erros inteligíveis de forma que não haja surpresas desagradáveis no cumprimento de contratos relativos a APIs para que a robustez e a segurança do seu software sejam boas.

Outros Conceitos

[editar | editar código-fonte]

Pré-condições, pós-condições e validação de variantes também são parte da programação defensiva. Isso pode envolver verificar argumentos passados a uma função ou método depois da execução do corpo da função. Depois do corpo da função, verificar o estado do objeto (OO) ou outro dados também é uma boa ideia.

Dentro de funções, você pode querer verificar mais de uma vez se algo que você está usando não é inválido. Uma boa heuristica é não confiar nas bibliotecas que você não escreveu. Sempre que você chamar elas, cheque o que recebe delas.

Ligações externas

[editar | editar código-fonte]
Ícone de esboço Este artigo sobre software é um esboço. Você pode ajudar a Wikipédia expandindo-o.