Se você estiver trabalhando em um ambiente sensível à segurança, leia isso.
Evite sempre confiar em um imóvel obtido através da System#getProperty(String)
sub - rotina! Na verdade, quase todas as propriedades os.arch
, incluindo ,, os.name
e os.version
não são apenas de leitura, como seria de esperar - em vez disso, elas são exatamente o oposto.
Antes de tudo, qualquer código com permissão suficiente para chamar a System#setProperty(String, String)
sub - rotina pode modificar o literal retornado à vontade. No entanto, essa não é necessariamente a questão principal aqui, pois ela pode ser resolvida com o uso de uma chamada SecurityManager
, conforme descrito em maiores detalhes aqui .
O problema real é que qualquer usuário pode editar essas propriedades ao executar o JAR
em questão. Isso significa que não há como determinar se essas propriedades são realmente precisas. Por esse motivo, seguem algumas verificações adicionais para tentar evitar a violação:
// The first thing we're able to do is to query the filesystem.
switch (java.io.File.separator)
{
case "/":
// Windows is a potential candidate.
break;
case "\\":
// And here it could really be anything else.
break;
default:
// There's probably something really wrong here by now.
break;
}
Outra boa idéia é verificar a presença de diretórios específicos do sistema operacional. Qualquer que seja a abordagem que você adote, lembre-se de que a linguagem Java é recuada para ser a plataforma cruzada. Então, por que você não tenta fazer o mesmo?
Windows 10
e aindaos.name
me dáWindows 8.1
. Por que é que? De onde isso vem?