Pergunta

Eu estou tendo dificuldade para entender por java codificação seguras é importante. Por exemplo, por que é importante para declarar variáveis ??privadas? Quer dizer, eu conseguir que ele vai fazer com que seja impossível para acessar essas variáveis ??de fora da classe, mas eu poderia simplesmente decompile a classe para obter o valor. Da mesma forma, a definição de uma classe como final tornará impossível a subclasse desta classe. Em que subclasses uma classe ser perigoso para a segurança? Mais uma vez, se necessário, eu poderia decompor a classe original e reimplementar-lo com qualquer código malicioso que eu poderia querer. O problema vem quando os aplicativos são "confiáveis" pelo usuário? E as pessoas poderiam então abusar esta confiança de alguma forma? Basicamente o que eu estou procurando é um bom exemplo do porquê diretrizes de codificação seguras devem ser seguidas.

Foi útil?

Solução

A programação é duro.

Se você definir APIs estritos, que não exponha variáveis ??que não são supostamente para ser exposto (que gostamos de chamar este encapsulamento ), você ajuda os usuários de suas APIs, e, assim, facilitar a programação. Esta é considerada uma coisa boa.

As razões não são primariamente de "segurança", como em manter as coisas secretas em segredo, tanto quanto clareza, simplicidade e compreensibilidade.

Como um bônus, é muito mais fácil de fazer as coisas funcionarem corretamente se você pode saber que o usuário da API não está mudando "suas" variáveis ??atrás das costas, é claro.

Outras dicas

É "segura" o que significa que um trabalho interno classe estão escondidos para quem a utiliza.

O termo seguro não é usado como em "proteção de um servidor" é utilizado para designar o fato de que um usuário de uma classe não tem que se preocupar sobre como a classe irá executar a tarefa que ele deseja.

Tomar o seu exemplo:

A exposição variáveis ??de uma classe iria permitir que o usuário de sua classe conhecimento de sua existência, que é algo que você não quer, por exemplo: basta pressionar um botão para ligar a luz, você não precisa agora que lá dentro é cobre ou whater ele precisa para executar a tarefa.

Java é uma programação langauge orientada a objetos, e um dos conceitos-chave em programação orientada para o objecto é encapsulamento .

A idéia por trás de encapsulamento é "esconderijo" detalha a implementação como variáveis ??internas que mantêm o estado do objeto e os funcionamentos internos, tais como algoritmos, e só fornecem uma interface que outros objetos podem usar para executar funções com o objeto.

Usando esse conceito, um gostaria de esconder estados internos usando variáveis ??private para evitar outros objetos de afetar diretamente os estados internos. Em Java, é comum ver getters e setters (por exemplo getColor e setColor) a fim de trabalhar com objetos.

Além disso, o encapsulamento pode aumentar a robustez do código também.

Por exemplo, restringindo o acesso aos estados internos, seria possível executar algumas checagens antes de um objeto é alterado.

Como um sólido exemplo, dizer que havia um objeto Score que era ter um valor percent entre 0 e 100. Ao fornecer um método setPercent(int) que valida que o valor especificado estava dentro do intervalo admissível, isso iria impedir o objecto Score de ser conjunto em um estado inaceitável.

Assim, tentando manipular diretamente o estado interno por escrito uma declaração como score.percent = 150 poderiam ser evitados, se o método setPercent causa um erro ou lança uma Exception se o valor especificado é inaceitável.

Há duas questões aqui.

As primeiras variáveis ??Ao declarar como parte protegida ou privada, eles não vão se tornar de sua API pública. Outras classes podem depender de sua classe no futuro, e é importante que você é livre para mudar, tanto quanto possível, se você quiser incluir novos recursos, melhorar o desempenho, etc. Se todos os seus valores são públicos de todo o seu interna valores e mecanismos são públicos. Alterá-los pode quebrar outras classes que dependem de seu.

A segunda, é que ao expor variáveis ??permite que outras classes para mudar seus valores. Se eles mudam seus valores internos se pode quebrar o seu programa, e criar um comportamento inesperado estranho. Se você criar um sistema que se baseia no desempenho preciso de um suas classes, e os valores internos são alterados, do que você não pode contar com esse sistema. Subclassing torna isso mais complicado. Seu sistema pode contar com uma classe de um determinado tipo para executar ações esperadas. Por subclasse é possível criar uma nova classe que parece ser do mesmo tipo, mas não executa as ações esperadas.

Por exemplo, se você tem um quadrado classe com um getArea função protegida (), você espera para retornar a área de um quadrado. No entanto, uma nova classe pode ser feita que se estende quadrado, dizem classe retângulo estende quadrado. Agora rectange pode substituir getArea (), mas ainda é do tipo quadrado, o que pode quebrar alguma coisa que depende de que a funcionalidade do quadrado. Ao fazer o seu último classe que você está afirmando que isso nunca pode ocorrer em seu sistema.

Este tipo de "seguro de codificação" não vai impedir alguém de ver seu código fonte, mas ajuda a tornar o seu código mais confiável e utilizável no futuro.

Apenas a acrescentar ao que outros já disseram: Alguns desses recursos também pode simplesmente ser visto como uma forma de estado pretende. Se eu fizer uma private membro I tornam "impossível" para os outros para acessá-lo (é possível, mas isso é além do ponto aqui), mas o mais importante eu dizer aos usuários que este é um detalhe de implementação, que não devem confiar .

imaginem se o objeto tem a propriedade interna que não é privada (oculto) e seu código de acesso a este estabelecimento de acontecer a ser executado no ambiente de multithreading, assim n threads iria começar a acessá-lo simultaneamente, 5 tópicos gostaria de alterar esta propriedade , 4 de ler. Não há nenhuma maneira que você garantir que as coisas vão funcionar perfeitamente, nenhum thread vai saber quais os dados que detém no momento e se mudou propriedade desse objeto com sucesso.

Você terá que programar pedaço especial de código que será responsável para lidar com acesso síncrono e ainda que não será guarrantee seu código irá funcionar bem desde que você ainda tem que verificar descanso de 680 aulas em seu programa de acesso a essa propriedade não acessá-lo diretamente.

Em suma, você está em um grande problema, e depuração é um pesadelo desde que você não sabe quando os dados foram chagned, qual thread fez isso, de onde ele happend etc.

Apenas cenário um do que está acontecendo se você não encapsulam ...

Boa coisa, seu código é executado 1% mais rápido, há menos carga na pilha, você conseguiu provavelmente ganhos de desempenho insignificantes que você vai pagar com acidentes periódicas do sistema e menores chances de depuração bem sucedido.

O termo "seguro de codificação" refere-se a construção de software que claramente tentativas de vulnerabilidades de segurança evitam, seja em C, Java, Ruby, linguagem assembly, ou qualquer outra coisa. Talvez a parte mais central de que, depois de selecionar um sistema de linguagem segura, é manter a boas práticas de programação. Se um programa não é clara, então você tem pouca chance de ser digno de qualquer confiança.

Para Java há duas guias notáveis:

Em Java há dois modos distintos de seguro de codificação.

Em que você está lidando com código que pode não ter todos os privilégios que o código faz. Por exemplo, se você estiver escrevendo uma biblioteca ou assinatura de código que você precisa para estar fazendo isso. Deve ser impossível para o código malicioso para tirar proveito de suas permissões de maneiras inesperadas. Isto é difícil!

Mais comumente você está lidando com os programas que estão lidando com os dados só não confiáveis. Por exemplo, servidores web (pense XSS e SQL injeção) e programas aplicativos de desktop lidar com arquivos não confiáveis ??(geralmente o problema é com código C ter estouros de buffer - genuína C ++ é melhor). Em algumas situações de negação de serviço (DoS) pode ser um problema grave.

Há alguma sobreposição. Por exemplo intérpretes executado com as permissões do código de intérprete e pode ser bastante "poderoso".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top